JavaとMIDI:MIDIファイルを演奏する(2)

スポンサーリンク

SMF スタンダードMIDIファイルをJavaで演奏します。前回は以下の3以降を実装しました。

  1. 音源を出力先として取得
  2. SMFをシーケンスとして取得
  3. シーケンサーを取得
  4. シーケンサーにシーケンスを設定
  5. シーケンサーに音源の出力先を設定
  6. シーケンサーを開始する

今回は1と2を実装します。

JavaとMIDI:MIDIファイルを演奏する(1)

音源の取得

音源の出力先はふた通りの方法があります。一つはJavaデフォルトのシンセサイザー音源を利用する方法、他は環境上にある音源を利用する方法です。

デフォルトのシンセサイザー音源を利用する方法

Javaと同時にインストールと同時に配置されるのでどの環境でも利用することができます。ただ音質としては最低限のものなので他の音源を持っている場合は下の方法も試してください。

Synthesizer synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();
Receiver receiver = synthesizer.getReceiver();

環境上にある音源を利用する方法

環境上にあるものであれば音源として使えます。まずは環境上にどのような音源があるか確認してください。

JavaとMIDI:MIDIの環境を調べる

またデバイスを取得するには以下のようにします。例では”ARIA”という文字列を含む出力用デバイスを取得するようにしています。

JavaとMIDI:入出力先デバイスの取得

MidiDevice[] devices = getMidiDevices("ARIA", true);
if(devices.length == 0){
  throw new IllegalStateException("cannot find device");
}
devices[0].open();
Receiver receiver = devices[0].getReceiver();

シーケンスの取得

SMF形式のファイルから取得する方法のほか自前で作る方法もあります。

SMF形式のファイルからシーケンスを取得する方法

拡張子が.midのファイルを開くには以下のようにします。

Sequence sequence = MidiSystem.getSequence(new File("midi/test.mid"));

シーケンスを自前で作る方法

以前シーケンスを自前で作りました。こちらを参考にしてください。

JavaとMIDI:シーケンスを使う

演奏する

ここまできたら前回のメソッドを使って演奏することができます。

playMidi(sequence, receiver);

ソース

デフォルトのシンセサイザー音源でSMFファイルを演奏する実装になっています。

import java.io.File;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.midi.Synthesizer;
import javax.sound.midi.Transmitter;

public class MidiPlayTest {

  public static void main(String[] args) throws Exception {
    Synthesizer synthesizer = MidiSystem.getSynthesizer();
    synthesizer.open();
    Receiver receiver = synthesizer.getReceiver();
    Sequence sequence = MidiSystem.getSequence(new File("midi/test.mid"));

    playMidi(sequence, receiver);
  }

  public static void playMidi(Sequence sequence, Receiver receiver) {
    Sequencer sequencer;
    try {
      sequencer = MidiSystem.getSequencer(false);
    } catch (MidiUnavailableException e) {
      throw new IllegalStateException(e);
    }
    if (sequencer == null) {
      throw new IllegalStateException("can't get a Sequencer");
    }
    try {
      sequencer.open();
    } catch (MidiUnavailableException e) {
      throw new IllegalStateException(e);
    }
    try {
      sequencer.setSequence(sequence);
    } catch (InvalidMidiDataException e) {
      throw new IllegalStateException(e);
    }
    Transmitter seqTransmitter;
    try {
      seqTransmitter = sequencer.getTransmitter();
    } catch (MidiUnavailableException e) {
      throw new IllegalStateException(e);
    }
    seqTransmitter.setReceiver(receiver);
    System.out.println("start");
    sequencer.start();
  }

}
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

%d人のブロガーが「いいね」をつけました。