Java は、プログラムから音を扱うためJava Sound APIを提供しています。Java Sound APIは、オーディオ形式とMIDI形式の両方を扱うことができ、オーディオ形式に関連するクラスは javax.sound.sampledパッケージ内に、MIDIに関連するクラスはjavax.sound.midiパッケージ内に配置されています。このAPIを利用することで、プラットフォームや物理的なデバイスを意識することなく音を操作できます。
javax.sound.midi.Receiver
Javaでは、MIDIメッセージを受け取れるデバイスをjavax.sound.midi.Receiverインタフェースで抽象化しています。このインタフェースを実装しているインスタンスはMIDIメッセージを受け取ることができることを表しています。Receiverの実装は、MIDIメッセージを外部のデバイスに出力するためのMIDI OUTケーブルかもしれませんし、何らかのソフトウェア音源かもしれません。
javax.sound.midi.Receiver インタフェース
public interface Receiver
Receiverインタフェースは、MIDIメッセージを受け取るためのsend()メソッドを宣言しています。send()メソッドはReceiverを実装するデバイスにMIDIメッセージを送信します。
Receiver インタフェースsend()メソッド
void send(MidiMessage message, long timeStamp)
messageに、デバイスに送信するMIDIメッセージを表すjavax.sound.midi.MidiMessageクラス(後述)のオブジェクトを渡します。timeStamp は、デバイスにタイミング調整を行うためのタイムスタンプを指定します。ただし、この値が用いられるかどうかはReceiverの実装に依存するもので、デバイスが対応していない場合は無視されます。タイミング調整の必要がない場合は-1を指定してください。
javax.sound.midi.MidiMessage
デバイスの間で交わされる実際のMIDIメッセージは8ビット単位の配列ですが、Java ではjavax.sound.midi.MidiMessage 抽象クラスで1つのメッセージが表現されます。具体的なメッセージの種類は、サブクラスによって定義されます。この抽象クラスは、純粋な byte 型の配列をメッセージとして設定する機能のみを提供しています。
javax.sound.midi.MidiMessage クラス
public abstract class MidiMessage extends Object implements Cloneable
MIDI メッセージのデータ表現は、大別すると3バイトで構成されるショートメッセージと、可変長のシステムエクスクルーシブメッセージに分けられます。MIDIプロトコルによって標準化されているメッセージはすべてショートメッセージに分類されます。システムエクスクルーシブメッセージは、MIDIデバイスが独自に解釈するメッセージのことで、音源を開発するメーカーが独自に定めています。この場では、MIDIデバイスが共通して認識できるショートメッセージを作成します。ショートメッセージはjavax.sound.midi.ShortMessage クラスを使います。
javax.sound.midi.ShortMessage クラス
public class ShortMessage extends MidiMessage
公開されているこのクラスのコンストラクタは、パラメータを受け取りません。
ShortMessage() クラスのコンストラクタ
public ShortMessage()
ShortMessageクラスは、MIDIメッセージのパラメータを設定するsetMessage()メソッドを公開しています。
ShortMessage クラス setMessage() メッセージ
public void setMessage(int status) throws InvalidMidiDataException
public void setMessage(
int status,
int data1, int data2) throws InvalidMidiDataException
ショートメッセージは、ステータスバイトと2つのデータバイトで構成されています。status にはステータスバイトを、data1とdata2にはデータバイトを指定できます。データバイトが不要な場合は省略可能です。これらのパラメータはint型ですが、実質的には1バイトの範囲の値になります。有効なメッセージではない場合は例外が発生します。