MIDI消息中176与192的功能及Beatbox代码调用疑问
《Head First Java》Beatbox项目MIDI事件代码解析
你的makeEvent方法封装了MIDI短消息的创建逻辑,参数对应ShortMessage.setMessage(command, channel, data1, data2),结合MIDI标准规范,下面拆解这两行代码的参数含义与必要性:
第一行:track.add(makeEvent(176,1,126,0,16));
参数具体含义:
176:MIDI命令码,对应CONTROL_CHANGE(控制器变更)类型1:MIDI通道号(MIDI通道实际按0-15编号,这里的1对应第2通道)126:控制器编号,MIDI标准中126是All Sound Off(所有声音关闭)指令0:控制器值,设为0表示触发关闭动作16:事件触发的节拍位置(tick值)
作用与必要性:
这行代码会在第16拍时关闭第2通道上的所有发声。Beatbox中若有持续发声的音符(比如长音),若不主动关闭会延续到下一轮循环,导致声音叠加混乱。这行是确保每一轮16拍结束后,通道内残留声音被清除,保证下一轮节拍的声音干净清晰,必须保留。
第二行:track.add(makeEvent(192,9,1,0,15));
参数具体含义:
192:MIDI命令码,对应PROGRAM_CHANGE(程序变更,即切换乐器)类型9:MIDI通道号(对应第10通道,GM标准中第10通道是默认打击乐通道)1:程序编号,对应GM标准里的原声大钢琴,但因为是打击乐通道,这个参数实际不影响打击乐发声(打击乐靠音符值区分音色)0:程序变更消息的附加参数,通常无实际作用,设为0即可15:事件触发的节拍位置
作用与必要性:
正如你所知,这行是占位事件。MIDI序列的循环逻辑基于轨道中最后一个事件的tick值,如果没有这个事件,轨道的最后一个有效事件可能在更早的节拍位置,导致序列提前循环,无法完整播放16拍。这个事件本身不会产生声音,仅用于扩展轨道的时间范围到第15拍,确保16拍的完整循环,是避免提前循环的关键,必须保留。
内容的提问来源于stack exchange,提问作者maverickar
相关产品推荐
相关产品推荐

