CoreAudio:Ausampler 单元复音

Posted

技术标签:

【中文标题】CoreAudio:Ausampler 单元复音【英文标题】:CoreAudio: Ausampler Unit polyphony 【发布时间】:2013-03-27 22:14:42 【问题描述】:

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

缺点似乎是,如果再次出现相同的音符,它会立即停止音符/样本。 所以如果我发送例如加载了长号预设的 midi note 60。然后在拿着这个的同时,我再次发送注释 60。它切断了第一个音符事件。有谁知道是否/如何可以保留每个音符,直到(该特定音符的)音符关闭事件出现?

其他问题: 发送后如何更改笔记的音量?例如。我以 100 的速度发送了 60 和 70 的 midi note。虽然音符 60 仍在播放,但我想降低音量但保持音符 70 向上。这将被称为 midi 触后。

希望你能帮忙:)

【问题讨论】:

【参考方案1】:

AUSampler (kAudioUnitSubType_Sampler) 是单音的(reference 和 here),所以为了同时演奏相同音高的两个音符,您需要两个“乐器”——即 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

如果您进行后期处理,请发回一些示例代码。

【讨论】:

嘿,非常感谢您提供这些信息!我照你说的做了,放了 3 个采样器进行测试。如果我现在弹很多音符,我的音频就会噼啪作响。我将 3 个采样器放在一个混音器单元中,然后从那里到输出端口。你做了什么特别的事情来防止这种情况发生吗? @Max - 我主要使用 .sf2(声音字体),而不是 LoadPresetDemo 的自定义音频方法。 .sf2 没有噼啪作响,我的设置是相同的:采样器 > 混音器 > remoteIO。也许对自定义音频以及它们在预设中的定义有一些特殊要求 - 您是否为自己切换了 Apple 提供的样本?查看 AULab - 或许可以在 Apple Dev 论坛上发帖 - 这里没有太多信息 @AUSampler/midi 的东西。 @Max - 刚刚遇到这个。不是@crackles,但很有趣-electricpeelsoftware.com/2013/02/22/… @TOMATO 感谢您提出处理触后问题的建议。 我现在将其标记为正确答案,我不相信 AUSamplerUnit 有可能,所以我停止使用它,我现在使用 FMOD,它就像一个魅力。感谢敌人的回答和cmets!【参考方案2】:

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

【讨论】:

感谢您的回答。你如何在 iOS 设备上获得声音号码 2 hardcoded to 2 notes?有什么 API 可以获取这个值吗?谢谢!【参考方案3】:

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

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

【讨论】:

我可以用我写的应用程序确认 AUSampler 绝对可以同时播放 2 个以上的音符。到目前为止,我还没有找到任何关于是否存在实际限制的信息,或者采样器是否只是尝试播放尽可能多的音符(即 128 个声音,最多 128 个 MIDI 音符)。当然这应该取决于使用的设备。

以上是关于CoreAudio:Ausampler 单元复音的主要内容,如果未能解决你的问题,请参考以下文章

带有 AudioRenderCallback 和 AudioUnitRenderFlag 的复音

CoreAudio,iOS:无法通过 RemoteIO 使用单声道输入和立体声输出

Core Audio(音频单元)音频会话和 MPVolumeView

iOS AUSampler audiounit - EXS 音频文件的文件路径问题?

iOS AUSampler 连续播放 MIDI 音符

带有 Pygame 通道的复音