1

JavaでMIDIファイルを再生する簡単なアプリケーションを作成しています。
図書館を利用していjavax.sound.midiます。

MIDI Out デバイス (USB to MIDI ケーブル) を正しく取得できます。

しかし、シーケンスを再生すると、ホスト OS の General Midi (Soundfont) 再生であるデフォルトのサウンド シンセサイザーで常に再生されます。

私が抱えている問題は、デフォルトの MIDI Out を変更することです。

私が実行するとき

Receiver MidiOutReceiver; //instantiated earlier
Sequencer MidiOutSequencer = MidiSystem.getSequencer();
MidiOutSequencer.open();
MidiOutSequencer.start();

スピーカーから MIDI シーケンスの再生が聞こえます。

ドキュメントを参照した後

3.10.
「Java サウンド シーケンサー」はデフォルトのシンセサイザーに暗黙的に接続されています。
3.5。
プログラムでは、自分で Synthesizer インスタンスを取得して接続できます
送信機/受信機のペアを明示的に使用してシーケンサーに送信します。
これで、どのシンセサイザーが使用されているかがわかります。
シンセサイザーに接続済みのシーケンサーを入手した場合、
メソッド getTransmitters() を使用して、シンセサイザーを見つけることができます。
しかし、この送信機/受信機のペアを明示的に使用し、新しいデフォルト シンセサイザーでシーケンサー オブジェクトをインスタンス化する方法については言及されていません。

私は正しい送信機と受信機を持っています。しかし、それらは MIDI 出力から再生されていません。

また、試したときに

MidiSystem.getTransmitter().setReceiver(MidiOutReceiver);

何も変わらないようです。

デフォルト シーケンサーが MIDI 出力ポートを使用するように、このレシーバー/トランスミッター ペアをシンセサイザーで明示的に使用するにはどうすればよいですか?

4

1 に答える 1

1

簡単なことを見落としていました。Sequencerによって返されるデフォルトには、MIDI Out デバイスを追加するメソッドをMidiSystem.getSequencer();持つ Transmitter があります。setReceiver()ただし、正しい MIDI Out デバイスが必要です。誤って間違ったデバイスを選択してしまいました。

したがって、最初にDeviceInfos配列を調べて正しい出力デバイスを選択し、正しいデバイスを選択してから、正しい で をインスタンス化SequencerしますReceiver

MidiDevice.Info[] MidiDeviceInfos = MidiSystem.getMidiDeviceInfo();
//find the suitable device number here, based on some criteria
MidiDevice MidiOutDevice = MidiSystem.getMidiDevice(MidiDeviceInfos[DEVICE_NUMBER]);
Receiver MidiOutReceiver = MidiOutDevice.getReceiver();
Sequencer MidiOutSequencer = MidiSystem.getSequencer();
//Add the new MIDI out device here.
MidiOutSequencer.getTransmitter().setReceiver(MidiOutReceiver);
MidiOutSequencer.open();

open()これでファイルとそれができますがplay()、デフォルトの MIDI Out デバイスも使用されるため、General MIDI/Soundfont MIDI サウンドも聞こえる場合があります。これは最初は私を驚かせましたが、今では MIDI デバイスも追加された .xml から開かれたシーケンスを送信しますReceiver

于 2013-01-13T14:55:48.010 に答える