LoginSignup
0
1

More than 5 years have passed since last update.

Java Sound APIを使ってMIDIファイルを再生する方法

Last updated at Posted at 2019-01-16

はじめに

この記事では、Java Sound APIを使用してMIDIファイルを再生する方法を備忘録的にまとめます。
とりあえず再生・停止ができる程度な初歩的な記事です。

サンプルコード

こちらがサンプルのソースコードです。
コンソール入力でMIDIファイルのパスを入力すると、MIDIが再生されるというシンプルなプログラムです。
めちゃくちゃ適用な例外処理を行っているので、そこらへんは勘弁してください。m(__)m

SamplePlayer.java
import java.io.File;
import java.io.IOException;
import java.util.Scanner;

import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;

public class SamplePlayer {

    public static void main(String[] args) {
        // MIDIデータを再生するハードウェア/ソフトウェア・デバイスのインスタンス。
        Sequencer sequencer = null;

        try {
            // デバイスに接続されたデフォルトのSequencerを取得する。
            sequencer = MidiSystem.getSequencer();

            // デバイスを開き、リソースを獲得する。
            sequencer.open();
        }
        catch (MidiUnavailableException e) {
            e.printStackTrace();
        }

        // コンソール入力からMIDIファイルのパスを取得する。
        Scanner scanner = new Scanner(System.in);
        System.out.print("MIDIファイルのパス >> ");
        String path = scanner.next();

        try {
            // MIDIファイルからMIDIデータ(Sequenceオブジェクト)を取得。
            File file = new File(path);
            Sequence sequence = MidiSystem.getSequence(file);

            // 取得したMIDIデータをシーケンサに設定する。
            sequencer.setSequence(sequence);
        }
        catch (InvalidMidiDataException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }

        // シーケンサー再生
        sequencer.start();

        // キー入力待ち
        System.out.println("適当に文字列を入力すると終了します。");
        System.out.print(">>");
        scanner.next();
        scanner.close();

        // シーケンサー停止
        sequencer.stop();

        // シーケンサーを閉じ、使用していたリソース解放する。
        sequencer.close();
    }
}

解説

シーケンサーを用意

MIDI再生に必要なオブジェクトを取得します。
以下のコードでは、APIが用意しているデフォルトのデバイスを自動で取得してくれます。
(再生するだけならデフォルトで十分です。)

※[1],[2]は"MidiUnavailableException"をスローするので、必ず例外処理を行ってください。


    Sequencer sequencer = null;
    try {
        // [1] デバイスに接続されたデフォルトのSequencerを取得する。
        sequencer = MidiSystem.getSequencer();

        // [2] デバイスを開き、リソースを獲得する。
        sequencer.open();
    }
    catch (MidiUnavailableException e) {
        e.printStackTrace();
    }

MIDIファイルを読み込む

MIDIファイルからMIDIデータを取得します。
取得したMIDIデータは"Sequence"というオブジェクトで管理されます。

シーケンサーに取得したオブジェクトを設定します。

※先程と同様に[1],[2]は"MidiUnavailableException"をスローするので、必ず例外処理を行ってください。

    try {
        // [1] MIDIファイルからMIDIデータ(Sequenceオブジェクト)を取得。
        File file = new File(path);
        Sequence sequence = MidiSystem.getSequence(file);

        // [2] 取得したMIDIデータをシーケンサに設定する。
        sequencer.setSequence(sequence);
    }
    catch (InvalidMidiDataException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }


MIDI再生/停止

あとはシーケンサーの再生(start)、停止(stop)をコールすることで、再生/停止を制御できます。

    // シーケンサー再生
    sequencer.start();

    // シーケンサー停止
    sequencer.stop();

システムリソースの解放

プログラム終了時は、close()を実行することを忘れないように注意してください。

    sequencer.close();
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1