如何使用CoreMidi创建指定通道的MIDIEventPacket?
如何在Swift的MIDIEventPacket中设置通道编号
你的代码里,MIDI事件的状态字节被硬编码成了0x90(音符开)和0x80(音符关),这俩值的低4位就是通道编号——当前是0,对应MIDI通道1。要修改通道,只需要调整这部分的低4位即可。
MIDI通道编号采用0-15的取值范围(对应实际使用的通道1-16),你可以按下面的方式修改代码:
- 先定义一个通道变量(比如
channel: UInt32,取值0-15) - 把状态字节的低4位替换成这个通道值
修改后的完整代码示例:
// 定义通道号:0对应通道1,1对应通道2...15对应通道16 let channel: UInt32 = 2 // 这里设置成通道3(因为是0-based编号) var midiEventPacket = MIDIEventPacket() midiEventPacket.timeStamp = 0 midiEventPacket.wordCount = 1 // 计算状态字节:音符开是0x90 | 通道号,音符关是0x80 | 通道号 let statusByte = isNoteOff ? (0x80 | channel) : (0x90 | channel) // 把状态字节放到32位字的对应位置(高字节区域) midiEventPacket.words.0 = 0x20000000 | (UInt32(statusByte) << 16) // 加入音符编号和力度 midiEventPacket.words.0 = midiEventPacket.words.0 | ((note) << 8) midiEventPacket.words.0 = midiEventPacket.words.0 | UInt32(velocity)
简单说明:
0x20000000是MIDI事件的前缀标识,对应MIDI 1.0的单字节状态事件格式- 状态字节(比如
0x92)左移16位后,会被放到32位字的第2个字节位置,符合MIDIEventPacket的结构要求 - 通道号直接和
0x80/0x90做按位或操作,就能替换掉原来固定的通道位
如果习惯用1-based的通道编号(比如直接传1-16),可以先转成0-based:let channel = desiredChannel - 1。
内容的提问来源于stack exchange,提问作者Sébastien REMY
相关产品推荐
相关产品推荐

