使用 AudioKit 播放多采样乐器,控制 ADSR 包络

Posted

技术标签:

【中文标题】使用 AudioKit 播放多采样乐器,控制 ADSR 包络【英文标题】:Playing multi-sampled Instruments using AudioKit, controlling ADSR envelope 【发布时间】:2017-11-17 20:52:59 【问题描述】:

我正在尝试使用 AudioKit 演奏几个 .wav 样本的乐器。

到目前为止我已经尝试过:

    使用AKSampler(与底层AVAudioUnitSampler)——它工作得很好,但我不知道如何在这里控制ADSR信封——调用stop将立即停止笔记。 另一种方法是对每个样本使用AKSamplePlayer 并播放它,手动设置rate 使其播放正确的音符。我可以(可能?)然后将AKAmplitudeEnvelope 连接到每个示例播放器。但是如果我想同时演奏同一个样本的 5 个音符,我需要 5 个 AKSamplePlayer 实例,这似乎是在浪费资源。

我还尝试找到一种方法,将原始音频样本推送到 AudioKit 输出缓冲区,自己进行混合和样本插值(可能是用 C 语言?)。但是没有找到怎么做:(

使用 AudioKit 制作多采样乐器的正确方法是什么?我觉得这一定是一个相当简单的任务。

【问题讨论】:

【参考方案1】:

感谢mahal tertin,AKAUPresetBuilder 使用起来非常简单! 您可以在 tmp 目录的某处创建 .aupreset 文件,然后使用 AKSampler 加载此仪器。

唯一值得注意的是,默认情况下AKAUPresetBuilder 将生成触发模式设置为trigger 的样本,这将忽略音符关闭事件。所以你应该明确地设置它。

例如:

let sampleC4 = AKAUPresetBuilder.generateDictionary(
                    rootNote: 60,
                    filename: pathToC4WavSample,
                    startNote: 48,
                    endNote: 65)
sampleC4["triggerMode"] = "hold"

let sampleC5 = AKAUPresetBuilder.generateDictionary(
                    rootNote: 72,
                    filename: pathToC5WavSample,
                    startNote: 66,
                    endNote: 83)
sampleC5["triggerMode"] = "hold"

AKAUPresetBuilder.createAUPreset(
                    dict: [sampleC4, sampleC5],
                    path: pathToAUPresetFilename,
                    instrumentName: "My Instrument",
                    attack: 0,
                    release: 0.2)

然后创建一个采样器并启动 AudioKit:

sampler = AKSampler()

try sampler.loadInstrument(atPath: pathToAUPresetFilename)

AudioKit.output = sampler
AudioKit.start()

然后使用它开始播放音符:

sampler.play(noteNumber: MIDINoteNumber(63), velocity: MIDIVelocity(120), channel: 0)

这个停止,尊重发布参数:

sampler.stop(noteNumber: MIDINoteNumber(63), channel: 0)

【讨论】:

更新:现在有了新的 AudioKit 自己的 AKSampler,情况发生了变化!【参考方案2】:

可能最好的方法是将您的 wav 文件嵌入 EXS 或 Soundfont 格式,例如利用该领域的工具来完成 ADSR。否则,您将不得不为每个样本配备一个仪器。

【讨论】:

乐器是用户生成的,所以我不能制作 exs24 或 soundfont :( 也许每个样本都有一个乐器是可以的。但是如何为乐器设置 ADSR?(我'读过我可以配置 .caf 文件——但这看起来太复杂了,我有 .wav,而不是 .caf)。 您能否通过 AKADSREnvelope 发送采样器并适时启动和停止它? 或者使用aupreset工具,可以用解析器修改。 @AureliusProchazka,是的,我可以,但同样需要 5 个采样器来同时播放 5 个音符——它们可能在不同的时间结束和开始:( 这不是小事,我这个周末要离开 Xcode;这将是一个起点:audiokit.io/docs/Classes/AKAUPresetBuilder.html#/…

以上是关于使用 AudioKit 播放多采样乐器,控制 ADSR 包络的主要内容,如果未能解决你的问题,请参考以下文章

AudioKit:调用“AudioKit.stop()”后无法重新启动 AudioKit 频率采样

AudioKit 5:音序效果

基于采样的变换控制

带有音量包络的 iOS 音频采样器

AudioKit - 使用音序器在特定位置播放声音文件

如何同时在线播放大量 SoundPool 文件和收音机