トップ » 技術記事 » Java Applet でマクロ音楽シーケンサーを作る(1) - ウェブブラウザとMIDIについて

Java Applet でマクロ音楽シーケンサーを作る(1) - ウェブブラウザとMIDIについて はてなブックマーク数 このエントリーをブックマークに追加

Java Applet でマクロ音楽シーケンサーを作る その1

本稿では Java Applet を使って、文字列マクロを利用した簡単な音楽シーケンサーを作ってみようと思います。Java での MIDI の扱い方、そして、文字列の解析方法など解説します。

ウェブブラウザとMIDI

最近では、ブラウザで動くアプリケーションと言えば、見栄えの良い、Adobe Flash/Flex が多いので、Java Applet と言うと、いまさらという感じもします。

ところが、Flash Player には、音声ファイルの MP3 を再生する機能はついているのですが、パソコンの内臓シンセサイザーを演奏させる、MIDI を再生する機能がついていません。

最近では、ネットワークの速度が早くなっているので、オーディオファイルをダウンロードして再生するのも、それほど苦になりません。そのため、わざわざ、各パソコンごとに音色の異なる内臓シンセを演奏させるという機会は少なくなっています。しかも、Windows Vista になって、それまで、コントロールパネルの「マルチメディアの設定」から変更できた、MIDI の設定が取り除かれてしまいました。

しかしながら、MIDI は、取り扱うデータ量も少なないので、ブラウザで動く音楽シーケンサーを作ろうと思ったら、MIDI 以外の選択肢はないと言えます。そこで、もし、Flash でMIDIを扱うアプリケーションを作ろうと思うと、ユーザーに、QuickTimeなどのプラグインを導入してもらわないといけなくなり、JavaScriptとFlash、QuickTime を連携するテクニックなどが求められ、煩雑なプログラミングが必要となってしまいます。

そこで登場するのが、Java Applet です。Java には、賢い MIDI 演奏のためのライブラリが用意されているのです。

Java Applet のいまいちなところは、Java Applet の埋め込まれたページにアクセスすると、Java VM が起動し一時的にパソコンがフリーズしたようになることです。もうちょっと、なんとかならないものかといつも思っていました。しかし、最近、必要に迫られて、Applet を作ったところ、昔ほど悪い印象は無く、Flashに比べれば若干もたつきますが、そこそこ快適に動かすことができるようになっていました。マシンパワーの向上とJava Applet の改良によりだいぶ改善されているようです。

Java で MIDI を扱う方法

では、はじめに、Java で MIDI を扱う方法から調べてきましょう。Javaのライブラリの javax.sound.midi には、MIDIを扱うためのライブラリが用意されています。いくつか方法がありますので順に見ていきましょう。

Receiverを使う方法

まずは、Receiver を使う方法です。これは、任意のタイミングで好きな高さの音を発音したり、MIDI機器を制御するコマンドを送信することができます。もし、リズムマシンやリアルタイムにシンセの鍵盤を描画するようなプレイヤーを作る場合には、Receiver を使うのが良いでしょう。

import javax.sound.midi.*;

public class TestReceiver {
    // メイン
    public static void main(String[] args) throws Exception {
        Receiver receiver = MidiSystem.getReceiver();
        // send
        receiver.send(NoteOn(60, 120), 1000); // c
        receiver.send(NoteOn(64, 120), 1000); // e
        receiver.send(NoteOn(67, 120), 1000); // g
        // sleep
        Thread.sleep(1500);
        receiver.close();
    }
    // 発音用のメッセージを生成する
    public static ShortMessage NoteOn(int noteno, int velocity)
        throws Exception {
        ShortMessage sm = new ShortMessage();
        sm.setMessage(ShortMessage.NOTE_ON, noteno, velocity);
        return sm;
    }
}

プログラムとしては、「MidiSystem.getReceiver()」として、MIDI用の Receiver を取得していおいて「Receiver.send()」で送信したいメッセージを送り出すという単純な仕組みです。送信するメッセージには、ここで見た、ShortMessage クラスの他、テンポ情報などのメタ情報を送信する、MetaMessage クラスを指定することができます。

Sequencer を使う方法

Receiver を使う方法では、演奏における時間制御を自前で実装する必要があり、手軽に MIDI を鳴らすプログラムを作ろうと思うと意外と大変です。そこで、用意されているのが、Sequencer を使う方法です。これを利用すれば、演奏したい内容をセットしておいて、start メソッドを呼ぶだけで MIDI 演奏を行うことができます。

import javax.sound.midi.*;

public class TestSequencer {
    public static void main(String[] args) throws Exception {
        // 演奏データの作成
        Sequence sequence = new Sequence(Sequence.PPQ, 96);
        Track track = sequence.createTrack();
        track.add(NoteOn (  0, 60, 120));
        track.add(NoteOff( 90, 60, 0));
        track.add(NoteOn ( 96, 62, 120));
        track.add(NoteOff(188, 62,  0));
        track.add(NoteOn (192, 64, 120));
        track.add(NoteOff(282, 64,  0));
        // 演奏
        Sequencer sequencer = MidiSystem.getSequencer();
        sequencer.open();
        sequencer.setSequence(sequence);
        sequencer.start();
        while (sequencer.isRunning()) Thread.sleep(100);
        sequencer.close();
    }
    // イベントの作成
    public static MidiEvent NoteOn(int time, int noteno, int velocity)
        throws Exception {
        ShortMessage sm = new ShortMessage();
        sm.setMessage(ShortMessage.NOTE_ON, noteno, velocity);
        return new MidiEvent(sm, time);
    }
    public static MidiEvent NoteOff(int time, int noteno, int velocity)
        throws Exception {
        ShortMessage sm = new ShortMessage();
        sm.setMessage(ShortMessage.NOTE_OFF, noteno, velocity);
        return new MidiEvent(sm, time);
    }
}

Sequencer を使う方法では、はじめに、演奏データである Sequence を作っておいて、これを Sequencer にセットするという手順で行います。MIDIにはトラックという概念があるので、はじめにトラックを生成しておいて、そこへノート情報を設定していきます。また、MIDIのイベントでは、発音(NoteOn)の後、必ず消音(Note Off)を送信する必要があります。

MIDIファイルの演奏

ちなみに、MIDIファイルを演奏する場合はもっと単純です。ファイルからでも、URLからでも再生ができます。

// MIDIの演奏
import java.io.File;
import java.net.URL;
import javax.sound.midi.*;

public class TestMidiFile {
    public static void main(String[] args) throws Exception {
        //File f = new File("/Users/kujiramac/Desktop/file.mid");
        URL url = new URL("http://example.com/file.mid");
        try {
            Sequencer s = MidiSystem.getSequencer();
            //Sequence seq = MidiSystem.getSequence(f);
            Sequence seq = MidiSystem.getSequence(url);
            s.open();
            s.setSequence(seq);
            s.start();
            Thread.sleep(2000);
        }
        finally {
        }
    }
}
まとめ

今回は、ウェブブラウザで音楽シーケンサーを作るための土台となる部分について考え、Java で MIDI を扱う方法を重点的に調べてみました。次回は、文字列マクロを利用して、MIDIの再生を行う Applet を完成させようと思います。お楽しみに。

Series Navigation

このサイトについて

八角研究所
株式会社八角研究所のWEBサイトですよー。 いろんなものを創り出すことのできる環境をコツコツ構築中。 いったい、いつになったらできるのか。 この技術情報サイトもそのための活動の一環のつもり。

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :