私が使用しているデフォルトのシンセサイザーのサウンドバンクには、さまざまな楽器が含まれています。たとえば、このコード スニペット...
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
MidiChannel
、 programChange
メソッド、およびを介して、これらのバンクのいずれかから楽器を演奏できますnoteOn
(これは、バンク 1152 の楽器 14、「カリヨン」を演奏します)。
MidiChannel channel = synthesizer.getChannels()[0];
if (channel != null) {
channel.programChange(1152, 14);
channel.noteOn(70, 100);
}
プログラムチェンジイベントをシーケンスのトラックに追加して、シーケンスで「カリヨン」楽器を演奏できるようにしたいと考えています。私はこれを試してみました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 コンストラクターの最後の 2 つの引数のいずれかを 1152 に変更しようとすると、javax.sound.midi.InvalidMidiDataException
forが発生しましたデータ バイト値が範囲外です。他の MidiMessage サブクラスにも、他のバンクからインストゥルメントをロードするオプションが含まれていないようです。
MidiEvent の MidiMessage で別のバンクのインストゥルメントを使用するにはどうすればよいですか?