如何制作和播放程序生成的啁啾声
Posted
技术标签:
【中文标题】如何制作和播放程序生成的啁啾声【英文标题】:How to Make and Play A Procedurally Generated Chirp Sound 【发布时间】:2011-04-14 06:42:25 【问题描述】:我的目标是创建一个“Chirper”类。啁啾应该能够发出程序生成的啁啾声。具体的想法是,啁啾声必须是程序生成的,而不是回放预先录制的声音。
在 iPhone 上实现程序生成的啁啾声的最简单方法是什么?
【问题讨论】:
啁啾声是什么意思?您是指普通的方波或锯齿波,还是更复杂的东西? 我的意思是“基本上是一个短的基于正弦波的声音,但是正弦波的频率在声音播放过程中从高频变为低频” 但是,即使是程序生成的平缓的哔哔声也是一个不错的开始。 你在问如何产生啁啾声吗?或者如何与音频输出缓冲区接口?或者你是在要求别人真正为你写东西? 我在问是否有人真的写过这个东西,你介意分享一下方法吗?如果您有资源要分享,请分享。不管你对这个主题有什么了解,把它说出来吧。 【参考方案1】:您可以按照您所说的使用正弦波来实现,您可以使用 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)
【讨论】:
好吧,如果没有人尝试回答,我会给你 50 分。 你能链接到播放声音的方法吗? 我会使用 OpenAL,它在播放这样的缓冲区时应该没有问题 - 作为编辑添加到我的帖子中【参考方案2】: Using RemoteIO audio unit Audio Unit Hosting Guide for iOS您可以在远程 I/O 单元的渲染回调中使用 Nektarios 的代码。您甚至可以实时更改波形(低延迟)。
【讨论】:
以上是关于如何制作和播放程序生成的啁啾声的主要内容,如果未能解决你的问题,请参考以下文章