我是CoreAudio的新手,我希望使用CA通过扬声器输出具有给定频率和幅度的简单正弦波和方波。我不想使用声音文件,因为我想合成声音。
我需要做什么?你能给我一个例子或教程吗?感谢。
答案 0 :(得分:14)
上一个答案中有很多错误。我,传奇 :-) James McCartney,而不是James Harkins写的sinewavedemo,我还写了SuperCollider,这是audiosynth.com网站的内容。我现在也在Apple的CoreAudio上工作。 sinewavedemo使用CoreAudio,因为它使用CoreAudio.framework的AudioHardware.h来播放声音。
您不应该使用sinewavedemo。这是非常古老的代码,它对音频硬件的缓冲区布局做出了危险的假设。现在播放您正在生成的声音的最简单方法是使用AudioQueue,或者使用带渲染回调集的输出音频单元。
答案 1 :(得分:2)
没有文件的最佳和最简单的方法是准备一个单循环缓冲区,包含一个波形循环(这在技术上称为波表)
在CoreAudio线程调用的回放函数中,使用从波形缓冲区读取的样本填充输出缓冲区。
但请注意,您将很快遇到两个问题: - 对于正弦波,如果播放频率不是所需正弦频率的整数倍,如果要获得良好的质量,则可能需要实现插值器。仅使用整数指针将产生显着水平的谐波噪声。
要获得良好的信号生成算法,请查看musicdsp.org,这可能是最佳资源之一
答案 2 :(得分:1)
你是一般的音频编程新手吗?作为一个起点,我会检查
http://www.audiosynth.com/sinewavedemo.html
这是传奇 James Harkins的最小osx正弦波实现。注意,它根本不使用CoreAudio。
如果您特别想要为您的正弦波使用CoreAudio,您需要创建一个输出单元(iphone上的RemoteIO,osx上的AUHAL)并提供输入回调,您可以使用上面示例中的代码。看看
http://developer.apple.com/mac/library/technotes/tn2002/tn2091.html
CoreAudio的好处主要是与你的正弦波产生连锁效应,为Logic& S等主机编写插件。为它们提供接口,为可以链接在一起的插件编写主机(如Logic)。
如果您不想编写插件或主机插件,那么CoreAudio可能实际上并不适合您。但是使用CoreAudio的最好的事情之一是,一旦你的正弦波回调工作,很容易添加效果,或混合多个正弦
要做到这一点,你需要将你的输出单位放在一个图表中,你可以使用效果,混音器等。
以下是有关设置图表http://timbolstad.com/2010/03/16/core-audio-getting-started-pt2/
的一些帮助它并不像它看起来那么困难。 Apple为许多事情提供了C ++帮助程序类(/ Developer / Examples / CoreAudio / PublicUtility),即使您不想使用C ++(您也不必!),它们也可以成为CoreAudio API的有用指南。 / p>
答案 3 :(得分:1)
如果您没有实时这样做,使用sin()
中的math.h
功能并不是一个坏主意。只需要在需要时使用sin()填充你想要的许多样本,只需将它发送到音频缓冲区即可。如果你正在做这个实时,每次采样一次调用sin()可能会很慢,使用插值波表查找方法要快得多,但产生的声音不会像光谱一样纯净。
答案 4 :(得分:0)
在Addison-Wesley Professional出版的Adamson / Avila“学习核心音频”一书的第7章中有一个很好的,记录良好的正弦波播放器代码示例(ISBN-10:0- 321-63684-8):
这是一个相当新的出版物(2012年),正是解决了这个问题。这只是一个起点,但它是一个有价值的起点。
顺便说一句。在完成这个基础课程(涉及一些数学课程)之后,不要跳到图形。
关于示例代码,我经常使用的快速有效的方法处理预填充的正弦波查找表,该表具有与采样率一样多的成员,对于44100 Hz,表的大小为44100.换句话说,周期长度等于采样率。在许多情况下,这在速度和质量之间提供了可接受的折衷。您可以使用该程序对其进行初始化 如果您生成浮点样本(在OSX中是默认值),并使用 math 函数,请使用 sinf() 而不是 (float)sin() 。渲染回调的内循环周期中的促销总是资源昂贵的。常量的重复乘法也是如此,例如 2.0 * M_PI ,这在代码示例中经常可以找到。