Я пытаюсь добавить свою собственную непрерывную модуляцию высоты тона (вибрато) к моему объекту OpenAL, назначив высоту звука траектории синусоидальной волны. это мой метод обратного вызова, который повторяется каждые 1/30 секунды, а также метод получения и установки для высоты тона.
#define kMaximumAplitude 0.025
#define kVibratoDegreeIncrements is 45
#define kDegreesToRadians(x) (M_PI * (x) / 180)
- (void)vibratoCallBack:(NSTimer *)timer
{
float newPitch = kMaximumAplitude * sin(kDegreesToRadians(vibratoDegreeIncrements));
self.pitch += newPitch;
vibratoDegreeIncrements += kVibratoDegreeIncrements;
}
- (void)setPitch:(ALfloat)newPitch
{
pitch = newPitch;
alSourcef(sourceID, AL_PITCH, pitch);
}
- (ALfloat)pitch
{
return pitch;
}
значение по умолчанию установлено на 1,0, поэтому вышеприведенный выводит следующий цикл синусоидальной волны:
Wrong Pitch: 1.000000
Wrong Pitch: 1.017678
Wrong Pitch: 1.042678
Wrong Pitch: 1.060355
Wrong Pitch: 1.060355
Wrong Pitch: 1.042678
Wrong Pitch: 1.017678
Wrong Pitch: 1.000000
однако, если вы посмотрите на эти числа, они не являются синусоидальной волной. причина, насколько я вижу, в том, что self.pitch добавляет себя вместе с приращениями синусоидальной волны. Я хотел бы, чтобы базовый шаг (немодулированный шаг) оставался постоянным до изменения высоты тона метода вибрато. Это позволило бы мне продолжать контролировать базовую высоту звука с помощью UISlider (например), в то время как эффект модуляции может необязательно и точно происходить без влияния на базовую высоту звука. я не могу найти способ.
ниже - правильный выход синусоидальной волны, который я хотел бы добавить к текущей высоте:
Correct Pitch: 0.000000
Correct Pitch: 0.017678
Correct Pitch: 0.025000
Correct Pitch: 0.017678
Correct Pitch: 0.000000
Correct Pitch: -0.017678
Correct Pitch: -0.025000
Correct Pitch: -0.017678
Correct Pitch: -0.000000
поэтому, если текущая немодулированная высота звука равна 1,5, я бы хотел, чтобы выходные данные выглядели так:
Desired Pitch: 1.500000
Desired Pitch: 1.517678
Desired Pitch: 1.525000
Desired Pitch: 1.517678
Desired Pitch: 1.500000
Desired Pitch: 1.482322
Desired Pitch: 1.475000
Desired Pitch: 1.482322
Desired Pitch: 1.500000
как можно изменить высоту звука, не влияя на нее? есть ли способ компенсировать модуляцию, происходящую внутри метода, чтобы эффект мог возникнуть на подвижном (или подвижном) базовом шаге?