Как создать и воспроизвести процедурный звук - PullRequest
5 голосов
/ 14 апреля 2011

Моя цель - создать класс "Чирпер". Щебетание должно быть в состоянии издавать процедурно сгенерированный звук. Конкретная идея заключается в том, что звуковой сигнал должен генерироваться процедурно, а не предварительно записанным звуком, воспроизводимым.

Какой самый простой способ получить процедурно сгенерированный звук чириканья на iPhone?

Ответы [ 2 ]

5 голосов
/ 21 апреля 2011

Вы можете сделать это с синусоидой, как вы сказали, которую вы бы определили с помощью функций sin. Создайте буфер так долго, как вам нужен звук в сэмплах, например:

// 1 second chirp
float samples[44100];

Затем выберите начальную частоту и конечную частоту, которую вы, вероятно, хотите, чтобы начало было выше, чем конец, что-то вроде:

float startFreq = 1400;
float endFreq = 1100;

float thisFreq;
int x;
for(x = 0; x < 44100; x++)
{
    float lerp = float(float(x) / 44100.0);

    thisFreq = (lerp * endFreq) + ((1 - lerp) * startFreq);
    samples[x] = sin(thisFreq * x);
}

Как-то так.

А если вы хотите гудение или другой звук, используйте различные формы волны - создайте их так, чтобы они работали очень похоже на грех, и вы можете использовать их взаимозаменяемо. Таким образом, вы могли бы создать saw () sqr () tri (), и вы могли бы делать такие вещи, как объединять их в более сложные или разнообразные звуки

========================

Редактировать -

Если вы хотите играть, вы должны иметь возможность что-то делать в этом направлении, используя OpenAL. Важно использовать OpenAL или аналогичный iOS API для воспроизведения необработанного буфера.

    alGenBuffers (1, &buffer); 
    alBufferData (buffer, AL_FORMAT_MONO16, buf, size, 8000); 
    alGenSources (1, &source); 

    ALint state; 

    // attach buffer and play 
    alSourcei (source, AL_BUFFER, buffer); 
    alSourcePlay (source); 

    do 
    { 
        wait (200); 
        alGetSourcei (source, AL_SOURCE_STATE, &state); 
    } 
    while ((state == AL_PLAYING) && play); 

    alSourceStop(source); 
    alDeleteSources (1, &source); 

    delete (buf) 
} 
1 голос
/ 28 апреля 2011

Вы можете использовать код Нектария вВизуализация обратного вызова для удаленного блока ввода / вывода.Кроме того, вы даже можете изменять формы сигналов в режиме реального времени (низкая задержка).

...