如何制作和演奏程序生成的啁啾声

时间:2011-04-14 06:42:26

标签: iphone objective-c audio avaudioplayer

我的目标是创建一个“Chirper”课程。唧唧响应应该能够发出程序生成的啁啾声。具体的想法是啁啾必须是程序生成的,而不是预先录制的声音。

在iPhone上实现程序生成的啁啾声的最简单方法是什么?

2 个答案:

答案 0 :(得分:5)

您可以使用正弦波来执行此操作,您可以使用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);
}

无论如何都是这样的。

如果你想要一个嗡嗡声或其他声音,使用不同的波形 - 创建它们与sin非常相似,你可以互换使用它们。这样你可以创建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 :(得分:1)

您可以在远程I / O单元的渲染回调中使用Nektarios的代码。您甚至可以实时更改波形(低延迟)。