質問

を使用する Java プロジェクトを継承しました。 MIDI データを受信するための古い C++ DLL コンピューターに接続されたピアノから。

Java に MIDI デバイスのサポートが組み込まれたので、従来の C++ DLL を削除して、純粋な Java だけを使用したいと考えています。 Java はコンピュータに接続されたピアノからのデータの受信をサポートしていますか? Google で例を検索しましたが、役に立ちませんでした。

役に立ちましたか?

解決

はい、JavaSound API を使用して MIDI デバイスから MIDI データを読み取ることができます。

Jフーガ は、JavaSound API を使用する音楽プログラミング用の Java API であり、JavaSound との対話を簡素化するのに役立ちます。JFugue 5.x で、MIDI デバイスから 10 秒間の MIDI データをキャプチャするサンプル コードは次のとおりです。

MidiDevice device = /* specify a MIDI device */
MusicTransmitterToSequence transmitter = new MusicTransmitterToSequence(device); 
transmitter.listenForMillis(10000); 
Sequence music = transmitter.getSequence();

デバイスのリスニングを開始および停止することもできます。

MidiDevice device = /* specify a MIDI device */
MusicTransmitterToSequence transmitter = new MusicTransmitterToSequence(device); 
transmitter.startListening(); 
// Do stuff
transmitter.stopListening(); 
Sequence music = transmitter.getSequence();

他のヒント

Java による MIDI API (javax.sound.midi.*) だけを使用して録音したい場合は、非常に簡単に行うことができます。これはコピーして貼り付けるコードではありませんが、実際には非常に簡単な独自の MIDI レコーダーのプログラミングを始めるのに役立ちます。

最初のステップは、入力と出力の MidiDevice を定義することです。したがって、まず IO の可能性のリストを見つけて、MIDI の録音と再生のための入出力デバイスを選択できる GUI を作成する必要があります。

Info[] infos = MidiSystem.getMidiDeviceInfo();
for(int i=0;i<infos.length;i++)
{
    System.out.println(infos[i].getName() + " - " + infos[i].getDescription());
}

これで、MIDI デバイスのリストが表示されます。次に、MIDI デバイスを選択します。たとえば、infos 配列内のインデックスを選択します。

MidiDevice inputDevice = MidiSystem.getMidiDevice(infos[x]);
MidiDevice outputDevice = MidiSystem.getMidiDevice(infos[y]);

また、いくつかのグローバルを指定することもできます。シーケンサー、送信機、受信機。

Sequencer sequencer = MidiSystem.getSequencer();
Transmitter transmitter;
Receiver receiver;

ここで、使用する録音ボタンが表示されます。

// Open a connection to your input device
inputDevice.open();
// Open a connection to the default sequencer (as specified by MidiSystem)
sequencer.open();
// Get the transmitter class from your input device
transmitter = inputDevice.getTransmitter();
// Get the receiver class from your sequencer
receiver = sequencer.getReceiver();
// Bind the transmitter to the receiver so the receiver gets input from the transmitter
transmitter.setReceiver(receiver);

// Create a new sequence
Sequence seq = new Sequence(Sequence.PPQ, 24);
// And of course a track to record the input on
Track currentTrack = seq.createTrack();
// Do some sequencer settings
sequencer.setSequence(seq);
sequencer.setTickPosition(0);
sequencer.recordEnable(currentTrack, -1);
// And start recording
sequencer.startRecording();

気をつけてください, 、このコードは MidiUnavailableExceptions をスローする可能性があるため、finally ステートメントで開いたすべてのものに対して close メソッドを呼び出す必要があります。

ただし、これはコードがどのように見えるかの中核にすぎません。すべてをシーケンスに記録します seq メソッドを呼び出すとすぐに sequencer.startRecording().

次に、録音を停止し、シーケンスを MIDI としてファイルに保存したり、再生したりできるようにしたいとします。たとえば、これは記録停止ボタンなどを押したときのコードである可能性があります。

// Stop recording
if(sequencer.isRecording())
{
    // Tell sequencer to stop recording
    sequencer.stopRecording();

    // Retrieve the sequence containing the stuff you played on the MIDI instrument
    Sequence tmp = sequencer.getSequence();

    // Save to file
    MidiSystem.write(tmp, 0, new File("MyMidiFile.mid"));
}

また、Track クラス (シーケンスには複数のトラックを含めることができます) には実際の入力データが含まれており、get メソッドで簡単にアクセスできます。Track クラスは MidiEvent で構成されます。たとえば、トラックは次のとおりです。

MidiEvent 0: The C key is pressed
MidiEvent 1: The D key is pressed
MidiEvent 2: The C key of MidiEvent 0 is released
MidiEvent 3: The sustain pedal is pressed
etc...

また、すべての MidiEvent には MIDI ティックで表現される特定のタイムスタンプがあるため、1 秒あたりのティック数を増減することでテンポを簡単に変更できます。

ここでの最も難しい問題は、MidiEvent がバイト コードで表現されるため、どのバイトがどのアクションを表すかを示す参照バイト コード シートを使用する必要があることです。これで作業を開始できるはずです。 http://www.onicos.com/staff/iz/formats/midi-event.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top