シーケンスを作れるようになってきましたがまだ使いにくいので手を入れていきます。今回は時間の管理についてです。
シーケンスの時間管理
現在のところシーケンスは楽曲作成に一番向いているPPQというタイミング形式を使っています。これは四分音符の解像度を指定するもので一番小さい時間単位をティックと呼びます。一般的な解像度は480とされていますがこの場合四分音符は480のティックに分割できることになります。八分音符は240ティック、十六分音符は120ティックといった具合です。
シーケンスを作る時にはMIDIメッセージはMIDIイベントという時間情報を持ったオブジェクトにラップされる、つまり包まれるわけですがこの時には時間位置をティックで指定します。
以下はシーケンスを作る時の処理の一部です。
int resolution = 480; Sequence sequence = new Sequence(Sequence.PPQ, resolution); Track track; track = sequence.createTrack(); long current = 0; track.add(new MidiEvent(new ShortMessage(ShortMessage.NOTE_ON, 0, 60, 127), current)); track.add(new MidiEvent(new ShortMessage(ShortMessage.NOTE_ON, 0, 60, 0), current + resolution));
MidiEventのインスタンスを作る時には開始位置からのティックを指定することになります。開始位置は0で一拍経過するごとに480ティック足されていきます。4拍子の曲の場合2小節目の最初は4拍あとなので480の4倍の1920ティック、9小節目であれば8小節経過した後なので480の4倍の8倍の15360ティックとなります。
楽曲を作る側では「何小節目の何拍目」と指定したいのに実際には「何ティック目」で入力することを求められています。この変換をいちいちするのは大変面倒です。これを解決するのが今回の目的です。
以前デジタル信号を作った時にちょうど同じような問題がありこれを解決していました。この時の方法を参考にしてみたいと思います。
次回はこれを参考にしながらMIDIでの解決方法を考えます。