几件事:
剪裁
您描述的“嗡嗡声”几乎可以肯定是削波 - 将两个或多个波形相加的结果,并且产生的组合波形的峰值被截断 - 削波 - 统一。
当您设计带有复音的虚拟合成器时,您必须考虑一次可能播放多少个声音并提供动态余量,通常是通过衰减每个声音。
在实践中,您可以AVAudioPlayer
通过将每个实例volume
属性设置为 0.316 来实现 10 dB 的动态余量。(足够8个同时声音)
这里的一个明显问题是,当用户播放单个声音时,它可能看起来太安静了——您需要尝试各种动态余量值和典型的用户行为并根据口味进行调整(这也取决于信号。您的钢琴样本可能会剪辑更多/ 比其他波形容易,具体取决于它们记录的幅度。)
根据您应用的目标用户,您可能会考虑向他们提供此净空参数。
不连续性/性能
您听到的爆裂声和咔嗒声可能不是剪辑的结果,而是您使用 mp3 作为音频文件格式这一事实的副作用。这是一个坏主意™。iOS 设备只有一个硬件立体声 mp3 解码器,因此一旦您启动第二、第三等语音,iOS 必须在 cpu 上解码 mp3 音频数据。根据设备的不同,在遇到下溢不连续性之前,您只能以这种方式解码几个音频流(显然,将立体声文件减半)...... CPU 根本无法及时为输出音频流解码足够的样本,因此您会听到令人讨厌的爆裂声和咔嗒声。
对于示例播放,您想使用 LPCM 音频编码(如 wav 或 aiff)或解码效率极高的东西,如 ima4。在我发布的每个包含这些类型的音频样本的应用程序中,我使用的一个策略是以 mp3 或 aac 格式发布样本,但在应用程序第一次启动时将它们解码为应用程序沙箱中的 LPCM 文件. 这样,在解码样本时,您可以在运行时获得更小的应用程序包和 更低的 CPU 利用率/更高的复音率。(在用户等待样本解码时,对首次用户体验的影响很小。)