Music Macro Language (MML)
Music Macro Language(ミュージック・マクロ・ランゲージ)は、音楽演奏を表現するために設計された
データ記述言語、または
ドメイン固有言語の一種です。一般に`MML`と略されますが、XMLベースの音楽表現言語であるMusic Markup Languageも`MML`と略されることがあるため、混同しないよう注意が必要です。
音楽を直接音声信号として扱うとデータ量が膨大になりますが、MMLは人間が読み書きしやすい文字列として音符や演奏指示を記述できるため、データ量を抑えつつ音楽を表現することが可能です。この特性から、ストレージ容量や処理能力が限られていた初期の
パーソナルコンピューターにおいて、音楽演奏の主要な手段として広く普及しました。独立した専用の演奏プログラムとして実装されたものもあれば、
BASIC言語の`PLAY`文のように他のプログラミング言語に組み込まれる形で利用されたものもあります。どちらの実装が先に登場したのかは定かではありません。
現代においても、MMLはその手軽さからシーケンスデータを簡潔に表現する手段として活用されています。MMLで書かれたデータをStandard MIDI File (SMF) や各種演奏ソフトウェアのデータ形式に変換するプログラムは「MMLコンパイラ」と呼ばれています。
主なコマンド
MMLには様々な「方言」が存在し、使用する音源や実装によって多種多様なコマンドや記法があります。しかし、多くのMMLに共通して見られる代表的なコマンドがいくつか存在します。
`C`, `D`, `E`, `F`, `G`, `A`, `B`: ドレミファソラシの7音を示します。
`#`, `+`, `-`: 音符の直後につけ、半音上げ(`#`, `+`)または半音下げ(`-`)を表します。`#`と`+`は同じ意味で使われることが多いです。
`R`: 休符(Rest)を示します。
数字, `.`: 音符または休符の直後につけ、その音の長さを指定します。例えば`C4`は4分音符のド、`R8`は8分休符を表します。数字に`.`をつけると音長が1.5倍(付点)、`..`は1.75倍(複付点)となります。例: `C4.`は付点4分音符のドです。
`&`: 連続する二つの音符を連結し、タイ(Tie)を表します。前後の音符の音階が異なる場合の挙動(無視、
スラー処理、
ポルタメント処理など)は、実装によって異なります。
`O`: オクターブを指定します。通常は`O4`のように数字を付けてオクターブの高さを指定します。
`>`, `<`: 現在のオクターブを上下させます。どちらが上げるか下げるかは実装によって異なる場合があります。
`L`: 音符や休符に長さの指定がない場合の、デフォルトの音長(Length)を設定します。例えば`L8`と指定すると、以降長さの指定がない音符や休符は全て8分音符/休符として扱われます。初期値は4であることが一般的です。
`V`: 音量(Volume)を指定します。
`@`:
FM音源などにおいて、音色(プログラムチェンジ)を指定します。
`T`:
テンポ(Tempo)を指定します。`T120`と記述すると、120BPMで演奏されます。ただし、古い環境では指定した
テンポから実際の演奏にずれが生じる「
テンポずれ」が発生することがありました。
上記以外にも、音高を数値で直接指定する`N`コマンド、発音の長さを調整する`Q`コマンド(
レガートやスタッカート表現に利用)、音の定位(パン)を設定する`P`コマンドなど、多くのコマンドが存在します。
歴史的課題と対策:「テンポずれ」
初期のパソコンにおけるMML演奏システムの一部では、内部的な時間の分解能が低かったため、指定された
テンポや音長に対して厳密な時間が再現できず、リズムにずれが生じる「
テンポずれ」という問題が発生しました。特に、分数で表される音長を正確に表現することが困難でした。
この問題を回避するため、様々な運用上の工夫が考案されました。その一つが「最短音符合わせ」と呼ばれる技法です。これは、全ての音長をシステムの最も短い音符の長さで表現し、複数の短い音符をタイで繋げることで目的の長さを再現するというものです。「みんなまとめてずれれば、ずれが目立たない」という考え方に基づきますが、MMLの可読性は著しく低下しました。
例:通常の`C4D4E4F4`(または`L4CDEF`)を最短音符合わせで表現すると、`L16C&C&C&CD&D&D&DE&E&E&EF&F&F&F`のようになります。
その後、多くのプログラマーや企業が音源ドライバを開発し、
テンポずれが発生しないように設計が進められました。また、
テンポずれが発生する環境でも、可読性の悪い最短音符合わせを使わずにずれを防ぐ、より洗練された技法も編み出されました。これにより、最短音符合わせは徐々に使われなくなりました。
後発の音源ドライバでも発生した別の問題として、「特定の
テンポで目的の音長が正確に再現されない」という事象がありました。これは、システムが持つ1秒あたりの内部クロック数(tick数)と
テンポの関係、さらに音符の分数が特定の条件を満たさない場合に発生します。逆に言えば、この条件を満たす
テンポと音符の組み合わせを選ぶことで、音長のずれを防ぐことが可能でした。例えば、1秒間のtick数が60のシステムでは、
テンポを60, 75, 80, 90, 100, 120, 150, 180, 200, 225, 240などの値に限定することで、多くの一般的な音長を正確に再現できました。
さらに応用的なテクニックとして、分解能の低さから再現が難しかった
テクノポップなどで見られる複雑なリズムやグルーブ感を表現するために、「
テンポ数225と64分音符による音長表現法」などが考案されました。例えば、tickが1/60秒のシステムで
テンポを225に設定すると、64分音符がちょうど1tickの長さとなり、通常の音符では表現できなかった細かい音長を組み立てて再現することが可能になりました。これにより、非整数値の
テンポを持つような楽曲の一部もMMLで演奏できるようになりました。
これらの
テンポずれ対策や応用テクニックも、後に絶対的な音長を指定できる高性能な音源ドライバが登場するにつれて、その必要性は薄れていきました。
MMLは、シンプルなテキスト形式でありながら、音楽表現の多様なニーズに応えるために進化し、多くのユーザーに利用された歴史を持つ言語です。
関連項目
チップチューン
N88-
BASIC
ABC記譜法