MIDI - MidiMessage程序更改与不同银行的工具

时间:2015-06-08 20:49:32

标签: java midi midi-instrument

我使用的默认合成器的音库包含各种不同的乐器。例如,此代码段...

Synthesizer synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();
Instrument instruments = synthesizer.getDefaultSoundbank().getInstruments();
for (Instrument i : instruments)
    System.out.println(i);

...打印以下内容:

Instrument: Piano 1      bank #0 preset #0
Instrument: Piano 2      bank #0 preset #1
[...]
Instrument: Applause     bank #0 preset #126
Instrument: Gun Shot     bank #0 preset #127
Instrument: SynthBass101 bank #128 preset #38
Instrument: Trombone 2   bank #128 preset #57
[...]
Instrument: Machine Gun  bank #128 preset #127
Instrument: Echo Pan     bank #256 preset #102
Instrument: String Slap  bank #256 preset #120
[...]
Instrument: Lasergun     bank #256 preset #127
[...]
Instrument: Starship     bank #1024 preset #125
Instrument: Carillon     bank #1152 preset #14
[...]
Instrument: Choir Aahs 2 bank #4096 preset #52

我可以通过MidiChannelprogramChange方法和noteOn从任何一家银行播放乐器,就像这样(这可以从1152银行播放乐器14,“Carillon”) :

MidiChannel channel = synthesizer.getChannels()[0];
if (channel != null) {
    channel.programChange(1152, 14);
    channel.noteOn(70, 100);
}

我想将程序更改事件添加到序列的轨道中,以便我可以按顺序播放“Carillon”乐器。我尝试使用ShortMessage

执行此操作
Sequence sequence = new Sequence(Sequence.PPQ, 2);
Track track = sequence.createTrack();
ShortMessage pcMessage = new ShortMessage(ShortMessage.PROGRAM_CHANGE, 0, 14, 0);
track.add(new MidiEvent(pcMessage, 0));

但是,当我在银行1152中寻找工具14时,这会将仪器更改为第0组中的仪器14(“Tubular-bell”)。尝试将ShortMessage构造函数中的最后两个参数中的任何一个更改为1152在javax.sound.midi.InvalidMidiDataException中,数据字节值超出范围。其他MidiMessage子类似乎也没有包含从其他银行加载工具的选项。

如何在MidiEvent的MidiMessage中使用其他银行的工具?

1 个答案:

答案 0 :(得分:3)

在MIDI协议本身中,银行编号被分成两个7位部分,并以两个controllers,“Bank Select”和“Bank Select LSB”的值传输:

... = new ShortMessage(ShortMessage.CONTROL_CHANGE, 0, 0,  1152 >> 7);   // = 9
... = new ShortMessage(ShortMessage.CONTROL_CHANGE, 0, 32, 1152 & 0x7f); // = 0
... = new ShortMessage(ShortMessage.PROGRAM_CHANGE, 0, 14, 0);

请注意,不同的标准(GS,XG,GM2)以不同的方式命名银行选择号码的两个部分。 在这种情况下,Carillon来自GS标准,它将其定义为“变量编号9”,它是MSB控制器。但控制器名称无关紧要;只要将控制器0设置为9,就可以获得正确的仪器。