Компенсация изменения стоимости при изменении стоимости? - PullRequest
0 голосов
/ 06 февраля 2010

Я пытаюсь добавить свою собственную непрерывную модуляцию высоты тона (вибрато) к моему объекту 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

как можно изменить высоту звука, не влияя на нее? есть ли способ компенсировать модуляцию, происходящую внутри метода, чтобы эффект мог возникнуть на подвижном (или подвижном) базовом шаге?

1 Ответ

1 голос
/ 06 февраля 2010

Я думаю, вам просто нужно разделить данные. Пусть один шаг хранит вашу базовую высоту, которая будет неизменной синусоидой. Затем вам нужен другой метод для создания звуковой волны вибрато, который синхронизирован с вашей основной высотой. Затем вам нужен геттер для возврата текущего шага окончательного сигнала. Другими словами, вам не нужно хранить высоту финального сигнала, как вы это делаете сейчас, вам просто нужно рассчитать его по требованию.

- (ALfloat) getFinalPitch
{
return getBasePitch() + getVibratoPitch();
} 
...