首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何制作和播放程序生成的Chirp声音

如何制作和播放程序生成的Chirp声音
EN

Stack Overflow用户
提问于 2011-04-14 14:42:26
回答 2查看 1.2K关注 0票数 5

我的目标是创建一个"Chirper“类。鸣叫者应该能够发出程序上产生的鸣叫声。具体的想法是,chirp必须通过程序生成,而不是预先录制的声音回放。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-22 01:09:21

您可以使用您所说的正弦波来实现,您可以使用sin函数来定义正弦波。只要采样中需要声音,就创建一个缓冲区,例如:

代码语言:javascript
复制
// 1 second chirp
float samples[44100];

然后选择开始频率和结束频率,您可能希望开始频率高于结束频率,如下所示:

代码语言:javascript
复制
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应用程序接口来播放原始缓冲区。

代码语言:javascript
复制
    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) 
} 
票数 5
EN

Stack Overflow用户

发布于 2011-04-28 08:37:09

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5659522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档