使用 AudioKit 播放多采样乐器,控制 ADSR 包络
Playing multi-sampled Instruments using AudioKit, controlling ADSR envelope
我正在尝试使用 AudioKit 演奏几个 .wav 样本的乐器。
到目前为止我已经尝试过:
- 使用
AKSampler
(底层 AVAudioUnitSampler
)——它工作正常,但我不知道如何在这里控制 ADSR 包络——调用 stop
将立即停止音符。
- 另一种方法是对每个样本使用
AKSamplePlayer
并播放它,手动设置 rate
以便播放正确的音符。我可以(可能?)然后将 AKAmplitudeEnvelope
连接到每个示例播放器。但是如果我想同时演奏同一个样本的 5 个音符,我将需要 5 个 AKSamplePlayer
实例,这似乎是在浪费资源。
我还试图找到一种方法,将原始音频样本推送到 AudioKit 输出缓冲区,自己进行混音和样本插值(可能是在 C 中?)。但是没找到怎么做:(
使用 AudioKit 制作多采样乐器的正确方法是什么?我觉得这一定是一个相当简单的任务。
最好的方法可能是将您的 wav 文件嵌入到 EXS 或 Soundfont 格式中,例如使用该领域的工具来完成 ADSR。否则你将不得不为每个样本配备一台仪器。
多亏了 ,使用起来非常简单 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 演奏几个 .wav 样本的乐器。
到目前为止我已经尝试过:
- 使用
AKSampler
(底层AVAudioUnitSampler
)——它工作正常,但我不知道如何在这里控制 ADSR 包络——调用stop
将立即停止音符。 - 另一种方法是对每个样本使用
AKSamplePlayer
并播放它,手动设置rate
以便播放正确的音符。我可以(可能?)然后将AKAmplitudeEnvelope
连接到每个示例播放器。但是如果我想同时演奏同一个样本的 5 个音符,我将需要 5 个AKSamplePlayer
实例,这似乎是在浪费资源。
我还试图找到一种方法,将原始音频样本推送到 AudioKit 输出缓冲区,自己进行混音和样本插值(可能是在 C 中?)。但是没找到怎么做:(
使用 AudioKit 制作多采样乐器的正确方法是什么?我觉得这一定是一个相当简单的任务。
最好的方法可能是将您的 wav 文件嵌入到 EXS 或 Soundfont 格式中,例如使用该领域的工具来完成 ADSR。否则你将不得不为每个样本配备一台仪器。
多亏了 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)