我在寻找没有过渡中断的起音(声音开始)/维持(循环声音)/衰减(声音结束)序列的资源时遇到问题。是否有任何好的库来处理这个问题,或者我应该使用 AVAudioPlayer 自己动手?AudioQueue 是一个更好的地方吗?我曾经使用 SoundEngine.cpp,但它已经很久没有使用了。CAF 仍然是最好的格式吗?
谢谢!
我在寻找没有过渡中断的起音(声音开始)/维持(循环声音)/衰减(声音结束)序列的资源时遇到问题。是否有任何好的库来处理这个问题,或者我应该使用 AVAudioPlayer 自己动手?AudioQueue 是一个更好的地方吗?我曾经使用 SoundEngine.cpp,但它已经很久没有使用了。CAF 仍然是最好的格式吗?
谢谢!
根据您的描述,听起来好像您正在尝试编写软件合成器。您可以用于此类操作的唯一方法是AVAudioPlayer
将音符的整个持续时间组合为单个 WAV 文件,然后使用AVAudioPlayer
.
要创建任意持续时间的音符声音,它会响应用户操作(如点击按钮)开始播放,然后继续播放直到第二个用户操作(如点击“停止”按钮或将手指从第一个按钮上移开) ) 开始将循环区域的音量降低到零的过程(“释放”部分),您需要使用AudioQueue
(AVAudioPlayer
可用于播放完全在内存中构建的音频,但必须在播放开始之前构建整个播放,这意味着您无法更改正在播放的内容以响应用户操作 [除了停止播放])。
这是另一个问题/答案,它简单地显示了如何使用AudioQueue
. AudioQueue
每当需要加载更多数据以播放时调用回调方法 - 您必须实现循环和信封包装原始 WAV 文件数据的所有代码。
创建自己的包络生成器非常简单。困难的部分将是更新您的程序以使用较低级别的音频服务,以便直接改变信号。
为此,您将需要:
即时的
或者
预渲染
我还假设您只需要缓慢/简单的过渡。如果你想要一些疯狂/快速的 LFO,没有混叠,你将有更多的工作要做。除非您的更改过于突然,否则此方法不应产生可听见的混叠:
编写一个简单的包络发生器(EG)很容易;如果您需要朝那个方向推进,请查看 Apple 的 SinSynth 以获得非常基本的 EG。