我正在尝试使用AudioKit播放几个 .wav 样本的乐器。
到目前为止我已经尝试过了:
AKSampler
(与基础AVAudioUnitSampler
) - 它工作正常,但我无法弄清楚如何在此处控制ADSR信封 - 调用stop
将立即停止记录。AKSamplePlayer
并播放它,手动设置rate
,使其播放正确的音符。我可以(可能?)然后将AKAmplitudeEnvelope
连接到每个示例播放器。但如果我想同时播放同一个样本的5个音符,我需要5个AKSamplePlayer
个实例,这似乎就是在浪费资源。我还试图找到一种方法将原始音频样本推送到AudioKit输出缓冲区,自己进行混合和样本插值(在C中,可能?)。但没有找到怎么做:(
使用AudioKit制作多采样乐器的正确方法是什么?我觉得这一定是一项相当简单的任务。
答案 0 :(得分:3)
感谢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)
答案 1 :(得分:2)
可能最好的方法是将您的wav文件嵌入到EXS或Soundfont格式中,利用该领域中的工具来完成ADSR。否则,您必须为每个样本准备一台仪器。