PMML
僕が学部生のときに何から何までお世話になった会津大学の西村憲先生が開発されたPMML (Practical Music Macro Language)という言語がありました。PMMLはテキストベースで楽譜を書いていくコンピュータ言語です。PMMLは単に音符をテキストに置き換えただけではなく制御構造やマクロなどのプログラミング言語の要素を多く取り入れられていたため、楽譜上での繰り返し記号であったり、アルペジエータであったりの記述がとても簡単に行えました。しかも短時間での音楽制作が可能になるだけでなく、プログラミング言語としても利用が可能だったのが大きな特徴でした。僕も標準MIDIファイルから(VRMLを使って)3Dアニメーションを自動生成するプログラムをPMMLで作成し、音高やヴェロシティといった音楽要素をアニメ内の任意の要素(色や位置や形状)に変換することについての卒業研究を行いました。
今でこそテキスト音楽サクラ、mml2mid、Super Collider、Overtoneなど、音楽や音響を扱うための言語は増えましたが、1990年代半ばにはPMMLほど高機能・抽象的にMIDIをプログラミングできる言語は無かったのです。
とは言ってもPMMLはマイナーな言語です。PMMLのforkや、その解説記事がありますが、「PMML」で検索をかけるとPredictive Model Markup Languageばかりが出てきますし、1998年以降の(一般公開された)アップデートもありませんでした。
Takt
そしてPMMLから15年以上経った2014年9月のICMC(国際コンピュータ音楽会議)にて、西村先生がTaktという新言語の発表を行います(9月17日発表のようです)。現在のバージョンがSourceForgeに公開されていたので、さっそくダウンロードして試してみました。コマンドラインから実行するオールドスクールなプログラミング言語ですが、Emacs用のtakt-modeなども用意されているので、EmacsをIDEとして利用している人にはまったく問題ないでしょう。
インストールできたものとして話を進めます。コンソールから「takt -Q
」とすると、使用できるMIDIデバイスの一覧が表示されます。僕の環境ではRoland SD-90が表示されました。
$ takt -Q MIDI Output Devices: [0] SD-90 SD-90 PART A (default) [1] SD-90 SD-90 PART B [2] SD-90 SD-90 MIDI 1 [3] SD-90 SD-90 MIDI 2 MIDI Input Devices: [0] SD-90 SD-90 PART A (default) [1] SD-90 SD-90 PART B [2] SD-90 SD-90 MIDI 1 [3] SD-90 SD-90 MIDI 2
Taktは、ソースコードを標準MIDIファイルに直接変換するコンパイラとしての使い方と、コマンド入力をそのまま実行してくれるREPL(Read Evaluate Print Loop)機能(いわゆるインタプリタ)としての使い方があります。MIDIデバイスが使用できるときには、REPLを使うとその場で様々な実験ができて便利です。
Taktを使ってみる
オプション無しでTaktを起動すると「>
」というプロンプトが表示されます。そこに「C D E F G A B ^C
(リターン)」と入力すると、使用しているMIDIデバイスから「ドレミファソラシド」と音階が再生されます。CDE〜は大文字でも小文字でも構いませんが、あいだにスペースを入れないと一音とみなしてくれません。シャープやフラットも「C#
」や「Eb
」として使えます(フラットは小文字のBです)。もちろんCの半音下だってEの半音上だって「Cb
」「E#
」と書けますし、半音記号を重ねて「Cbb
」などとすることも可能です(C###
のように3つまで)。休符はR
を使います。
$ takt Welcome to Takt version 0.308 > C D E F G A B ^C
オクターブの変更
さて、最後の「^C
」は何かというと、「(いま設定しているオクターブから)1オクターブ上のC」という意味になります。Cの前や後にスペースを空けずに記号を入れることで、Cの意味を少し変えることができます(モディファイアと呼びます)。たとえば「^
」は1オクターブ上げ、「_
」は1オクターブ下げですので、「_C C ^C
」は3オクターブぶんのCを再生します。直接指定したい場合は「C4
」「C6
」などとオクターブ番号を書きます。先ほど「いま設定しているオクターブから」という表現をしましたが、「o=4
」のように設定することで、それ以降の音がどのオクターブ範囲に対して鳴らされるのかを変えることができます。たとえば、以下のようにすると、同じ「ドミソド」でも、異なる音高になります。
> o=4 C E G ^C > o=6 C E G ^C
音の強さの変更
他にも多くのモディファイアが用意されています。「C+
」「C-
」は、ノートオン・ヴェロシティ(打鍵の強さ)を上げ下げします。「C C- C-- C--- C---- C----- C------ C-------
」などと書けますよ。直接指定したいときには「v=120 C
」のようにすることも可能。ただし、それ以降のヴェロシティも変化するので、「v=120 C v=100 D
」のように元に戻す必要があります。一音だけにアクセントをつけたければ、やはり「C D E+ F
」のようにするのが良いでしょう。
音の長さの変更
音の長さ(音価)を変えるときには、「\
」で音の長さが半分、「*
」で音の長さを倍にできます。現在の設定が四分音符だとすると、「C\ C C*
」は八分音符・四分音符・二分音符の長さでCを再生します。「.
」で付点を付けることができます。「C\. C\\
」だと、付点八分音符・十六分音符になります。基準とする音価を変えるのも「L4
」で四分音符、「L8
」で八分音符など、簡単です(L6
やL7
といったこともできますし、解像度単位での指定(l=480
)といったことも可能です)。スタッカートは「!
」、タイは「~
」など、様々なモディファイアが準備されています。
和音とモディファイアのスコープ
和音は「[ C E G ^C] [C F A ^C]
」のように大括弧で囲みます。また、「{C D}\ E
」のように中括弧を使うと、モディファイアが中括弧の中のものすべてに適用できます。「C D {v=120 E} F
」のように、変化を中括弧の中だけにとどめることも可能です。
制御構造
以上のことだけを組み合わせるだけでも、テキストベースでいろいろな曲を書くことができそうですが、本当はここからがTaktの真骨頂です。プログラミングをかじったことがある人は以下のTaktプログラム(Taktのサンプルプログラムから抜粋)を読んでピンと来るかもしれません。TaktにはC言語ライクな制御構造が用意されているので、for文で繰り返しを行い、繰り返しの1回目と2回目とで異なる音を出力することが可能です。楽譜の1番カッコ、2番カッコに相当します。
for(i, 1, 2) { ^d {g a b ^c}\ ^d g g ^ e {c d e f#}\ g _ g g ^c {^d ^c b a}\ b {^c b a g}\ if(i == 1) { f# {g a b g}\ a*.} else { a {b a g f#}\ g*. } }
とりあえずまとめ
まだTaktのマニュアルを読み切れていないのですが、PMMLで可能だったことはすべて出来るようですし、それ以上の機能も入っています。複数トラックを作成することはもちろん、コントロール・イベントに代表されるMIDIの機能はほぼ網羅されていますし、高度なマクロ機能や、並行処理、オブジェクト指向、数値計算や乱数生成や文字列処理のためのライブラリ群なども準備されています(このあたりはTaktを勉強して改めて紹介しようと思います)。REPLでリアルタイム動作するため、MIDIエフェクタとしての使用も可能かと思います。
MIDIデータの読み込みをして、各音高のカウントをするなどできますので、音楽制作だけじゃなく、MIDIファイルの解析による音楽学的研究にも利用できるかもしれません(パッと思いつくのは十二音技法とかトータル・セリエリズムの楽曲解析など)。このあたりが、音楽制作(だけ)を目的として作成された既存の音楽プログラミング言語と一線を画すところなのでしょう。