AudioKit技术问询:如何修改AKMIDIEvent播放音符的音量与音高?
AudioKit MIDI音符音量与音高调整指南
嘿,我来帮你搞定AudioKit里MIDI音符的音量和音高调整问题!咱们分两部分来聊:
一、已播放音符的实时修改
首先要明确:当你发送noteOff事件后,音符就停止发声了,这时候没法再调整它的音量或音高。但如果音符还在播放(还没发noteOff),是可以通过MIDI控制消息来实时调整的:
1. 调整音量
可以用MIDI CC(控制变化)消息来控制正在播放的音符音量,常用的CC编号有:
- CC 7:主音量(控制整个通道的音量)
- CC 11:表情控制器(更细腻的音量动态控制)
示例代码:
// 发送CC11消息,将通道0的表情值设为100(范围0-127) midi.sendEvent(AKMIDIEvent(controllerChange: 11, value: 100, channel: MIDIChannel(0)))
2. 调整音高
可以用Pitch Bend(弯音轮)消息来实时改变正在播放音符的音高,MIDI弯音的范围是-8192到8191(对应±2个半音,具体范围可由乐器设置)。
示例代码:
// 发送弯音消息,将通道0的音高升高1个半音(对应数值4096,中间值0是原音高) midi.sendEvent(AKMIDIEvent(pitchBend: 4096, channel: MIDIChannel(0)))
二、使用AKMIDIEvent播放时的音量与音高设置
如果你想在播放音符(发送noteOn)时就指定音量和音高,可以这么做:
1. 调整音量
MIDI的noteOn事件里的velocity参数直接决定音符的初始音量,范围是0-127,数值越大音量越高。
示例代码:
// 以音量80(中等音量)播放C4(音符编号60) let noteToPlay = MIDINoteNumber(60) let volume = MIDIVelocity(80) midi.sendEvent(AKMIDIEvent(noteOn: noteToPlay, velocity: volume, channel: MIDIChannel(0))) // 之后发送noteOff停止音符 midi.sendEvent(AKMIDIEvent(noteOff: noteToPlay, velocity: 0, channel: MIDIChannel(0)))
2. 调整音高
有两种方式设置初始音高:
- 直接修改音符编号:不同的音符编号对应不同的音高,比如C4是60,C#4是61,D4是62,以此类推。
- 配合弯音消息:如果需要微调音高(比如升0.5个半音),可以在发送
noteOn后立即发送弯音消息。
示例代码(直接修改音符编号):
// 播放C#4(比C4高1个半音),音量80 let highNote = MIDINoteNumber(61) midi.sendEvent(AKMIDIEvent(noteOn: highNote, velocity: 80, channel: MIDIChannel(0)))
示例代码(配合弯音微调):
// 播放C4,然后立即发送弯音消息升高0.5个半音(数值2048) let noteToPlay = MIDINoteNumber(60) midi.sendEvent(AKMIDIEvent(noteOn: noteToPlay, velocity: 80, channel: MIDIChannel(0))) midi.sendEvent(AKMIDIEvent(pitchBend: 2048, channel: MIDIChannel(0)))
内容的提问来源于stack exchange,提问作者abinop
相关产品推荐
相关产品推荐

