我正在用 Objective-C 开发一个应用程序,在该应用程序中,当用户敲击他的乐器的一个打击垫(有几个打击垫)时,我必须在给定的时刻播放样本(1 秒)。通过 MIDI 接口,我接收到音符并重现它们,我执行以下操作:
以前我有一个AVAudioEngine实例化,并且在它的混音器节点(AVAudioMixerNode)中我附加了 16 个AVAudioPlayerNode。
我有一个指向当前 AVAudioPlayerNode 的整数(iCurrentNode 范围从 0 到 15)。当用户点击垫子时,我会:
[aAVAudioPlayerNode[iCurrentNode] scheduleFile:file atTime:nil completionHandler{}];
iCurrentNode++;
if(iCurrentNode == 16)iCurrentNode = 0;
16 个播放节点的原因是 scheduleFile 不允许重叠声音。因此,如果用户在第一个声音完成播放之前敲击一个打击垫并再次敲击它,那将是排队而不是重叠。
我已经简化了代码,因为我还根据通过 MIDI 接口传给我的“速度”为播放节点分配音量。
实施效果很好,但我想知道我是否设计了最佳解决方案。例如,我不知道是否应该使用AVAudioUnitSampler而不是AVAudioPlayerNode。
非常感谢!