You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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. 播放样本原音高的默认音符编号是多少?
  2. 是否有方法直接按原音播放样本而不改变音高?

解答

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:07:49