将WAV文件载入MIDISampler的默认音符编号与原音播放问题
AudioKit样本原音高播放问题解答
问题描述
用户使用以下AudioKit代码加载并播放样本:
let sampler: MIDISampler = MIDISampler() do { try pulseAudioFile = AVAudioFile(forReading: Bundle.main.url(forResource: "soundfx", withExtension: "wav")!) try sampler.loadAudioFiles([pulseAudioFile]) } catch { log.fault("Unable to load sound: \(error)") fatalError("") } let track = sequencer.newTrack()! track.setLoopInfo(Duration(beats: 4), loopCount: 0) track.add(noteNumber: 69, velocity: 127, position: Duration(beats: 0), duration: Duration(beats: 1)) track.add(noteNumber: 69, velocity: 127, position: Duration(beats: 1), duration: Duration(beats: 1)) track.add(noteNumber: 69, velocity: 127, position: Duration(beats: 2), duration: Duration(beats: 1)) track.add(noteNumber: 69, velocity: 127, position: Duration(beats: 3), duration: Duration(beats: 1)) sequencer.setGlobalMIDIOutput(sampler.midiIn)
播放时声音与原始样本存在差异,尝试69-80号MIDI音符后,音高仍和原样本不符,因此提出两个问题:
- 播放样本原音高的默认音符编号是多少?
- 是否有方法直接按原音播放样本而不改变音高?
解答
1. 原音高对应的默认音符编号
使用loadAudioFiles加载单音频文件到MIDISampler时,AudioKit默认将样本映射到MIDI音符60(中央C,C4)。这就是你用69(A4)播放时音高偏差的原因——MIDI音符每相差12个,音高差一个八度,69比60高9个半音,自然和原样本音高不一致。
2. 按原音播放样本的方法
有三种实用方案:
方案一:加载时指定根音符(推荐)
替换loadAudioFiles方法,使用loadAudioFile(at:rootNote:)(AudioKit 5及以上版本支持),直接指定样本原音高对应的MIDI音符。比如你的样本原本是A4(对应MIDI 69),代码修改为:
try sampler.loadAudioFile(at: Bundle.main.url(forResource: "soundfx", withExtension: "wav")!, rootNote: 69)
之后发送MIDI音符69,就能播放原音高的样本。
方案二:调整采样器的音高偏移
如果已经用loadAudioFiles完成加载,可以通过设置transpose属性抵消音高变化。默认映射到60,若原音对应69,设置如下:
sampler.transpose = 9
这样所有MIDI音符都会被转调9个半音,发送60即可得到原音高;若继续发送69,需要计算对应的偏移量来匹配原音。
方案三:直接播放原始音频(无需MIDI控制)
如果不需要MIDI序列器的控制功能,直接用AVAudioPlayer播放原始WAV文件,完全不会改变音高,但这种方式无法结合AudioKit的序列器功能使用。
内容的提问来源于stack exchange,提问作者dz902
相关产品推荐
相关产品推荐

