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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:50:22