JavaでMIDIを扱う

概要

テキストファイルに記録された音階を読み込み音を鳴らす。
例外をキャッチし対処する。
1.コマンドラインから音階の番号が保存されたテキストファイルを指定する。
2.テキストファイルを1行ずつ読み、音を出す。
3.コマンドラインでファイルの指定がない場合と音階番号の異常を例外としてキャッチしメッセージを表示する。

import java.io.*;
import javax.sound.midi.*;

public class MusicPlayerTest {
    public static void main(String[] args) throws Exception {
        int value = 0, i = 0;
        if (args.length == 0) {
            System.out.println("コマンドラインの引数がありません。");
            System.exit(1);
        }
        Receiver receiver = MidiSystem.getReceiver();
        ShortMessage message = new ShortMessage();

        System.out.println("File name:" + args[0]);
        BufferedReader reader = new BufferedReader(new FileReader(args[0]));
        try {
            while (true) {
                try {
                    String line = reader.readLine();
                    if (line == null) {
                        break;
                    }
                    value = Integer.parseInt(line);
                    // 音を出す
                    message.setMessage(ShortMessage.NOTE_ON, value, 127);
                    receiver.send(message, -1);
                    // 2秒待つ
                    Thread.sleep(200);
                    // 音を止める
                    message.setMessage(ShortMessage.NOTE_OFF, value, 127);
                    receiver.send(message, -1);

                    System.out.println(value);
                } catch (InvalidMidiDataException e) {
                    System.out.println("MIDIデータエラー" + (i + 1) + "行目");
                } catch (NumberFormatException e) {
                    System.out.println("ノート番号の変換が出来ませんでした。" + (i + 1) + "行目");
                }
                i++;
            }
            reader.close();
        } catch (FileNotFoundException e) {
            System.out.println("ファイルが存在しません。" + e);
        }
    }
}

実行結果

File name:doremi.txt
60
60
68
68
70
MIDIデータエラー6行目
68
ノート番号の変換が出来ませんでした。8行目
90

テキストファイルの内容

60
60
68
68
70
129
68
**
90

いちばんわかりやすいDTMの教科書 改訂版 (MIDI、AUDIOデータダウンロード対応)

いちばんわかりやすいDTMの教科書 改訂版 (MIDI、AUDIOデータダウンロード対応)