CoreAudio:Ausampler Unit复音

时间:2013-03-27 22:14:43

标签: ios objective-c core-audio audiounit coremidi

我目前正在努力有效地使用Ausampler Unit。我使用了apple示例中的代码:https://developer.apple.com/library/ios/#samplecode/LoadPresetDemo/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011214-Intro-DontLinkElementID_2

缺点似乎是如果相同的音符再次出现,它会立即停止音符/样本。 所以如果我发送,例如带有长号预设的midi音符60。然后在拿着这个的时候,我又发了一张纸条60。它切断了第一个音符事件。有没有人知道是否/如何持有每一个音符直到音符关闭事件(特定音符)进来?

其他问题: 如何在发送后更改音符的音量?例如。我用100速度发送了midi音符60和70。虽然音符60仍然播放,但我想减少音量,但保持音符70。这将被称为midi aftertouch。

希望你能提供帮助:)

3 个答案:

答案 0 :(得分:6)

AUSampler(kAudioUnitSubType_Sampler)是单音的(referencehere)所以为了同时演奏两个相同音高的音符,你需要两个“乐器” - 即AUSampler的实例。在我的项目中,我发现这不会增加内存开销,因为声音资源是共享的。

关于触后 - 我没有探究过,但看起来你想要的属性是kAUGroupParameterID_KeyPressure_FirstKey(参考文献here,也许是here)。

Supporting the kAUGroupParameterID_KeyPressure parameter indicates to 
hosts that your audio unit supports polyphonic "aftertouch" key pressure.

Each of the 128 MIDI key numbers can have its own value for polyphonic 
aftertouch. To respond to aftertouch for a particular key, your audio 
unit needs to support an additional parameter specifically for that key. 
The aftertouch parameter ID for a given MIDI key is equal to the MIDI
key number plus 256. For example, the aftertouch parameter ID for MIDI 
key #60 (middle C) is:

60 + kAUGroupParameterID_KeyPressure_FirstKey = 316

如果你有触后工作,请回复一些示例代码。

答案 1 :(得分:4)

接受的答案是错误的。 Timbre Polyphony 是两个不同的东西。单音词意味着midi设备(在这种情况下是AUSampler实例)只能同时播放单个INSTRUMENT / PATCH,这与它可以播放的并发音符的数量无关那个单一的乐器。 另一方面,多音色设备可以同时播放多个乐器/音色(midi通道)。 在AUSampler的iOS版本中,复音似乎是有限的并且硬编码为2个音符,并且似乎没有公开的api来改变它。

答案 2 :(得分:1)

我不认为AUSampler仅限于两个音符复音。我只是在为我的项目做研究,这对我来说非常重要。

看看这个piano keyboard plugin,它的作者提到它是用 AUSampler 制作的,从视频中你可以看到它轻松演奏四个音符和弦