MMLの成立
目次
Altair MUSIC の影響
SCORTOS には「休符」の記号がありません。上にも書きましたが、このために分かち書きが必要となっています。
ベーシックマスター、MZ-80K では「R」を使って分かち書きを不要にしましたが、if800 では「P」が休符記号になっています。
これはおそらく、Altair が内部表現として「Pause」を休符に使用していたため。これはあくまでも内部表現の話で、音を維持するのも含めて時間経過は「Pause」なのですが、この頭文字を休符に使ったものだと思います。
また、Altair MUSIC の記述言語は「MUSIC Language」でした。SCORTOS の記事サブタイトルと合わせ、Music Macro Language という名前に影響を与えているように思います。
Altair MUSIC の影響は、最初は上に書いた程度なのですが、改良されていく過程でどんどん存在感を増していき…最後にはまた、消えていきます。
一時期の MML では、音長に対し、実際に音を出す時間を N L S で変化できました。
Normal、Legato、Staccato の意味で、この表記方法は Altair MUSIC のものです。
最終的には、Q コマンドで音長に対する発音時間を自由に調整できるようになり、これらの発音時間コマンドは無くなります。
和音を出す際に、カンマ区切りで MML を並べる、というのも Altair MUSIC 風の記述。SCORTOS では「パート」ごとに完全に分離して作成していましたが、Altair MUSIC は、音符ごとのカンマ区切りでした。
マイクロソフトの MML では、中間的な落としどころとして、パートの断片を、カンマ区切りで記述するようになっています。もっとも、カンマでデータを区切るのは普通のことなので、これは Altair MUSIC の影響ではないようにも思います。
ベーシックマスター・MZ-80K の影響
ベーシックマスター、MZ-80K の影響は、少なからずあったように思います。これ、要求仕様ですから当然ですね。
ベーシックマスター・MZ-80K では、音階の「前に」 # を付けることでシャープを示しました。# は MML に残りましたが、SCORTOS と同じで「後ろに」付けるように変わっています。
SCORTOS のやり方だと、休符は音階なしの数値のみで、他の数値と区別するためにも、音符ごとにスペースを入れる必要がありました。ベーシックマスターでは休符に「R」を導入することでスペースを不要にしていますが、MML でもこれを導入。ただ、先に書いたように、if800 では、R ではなく P になっています。(後に R に変更)
あらかじめ音長を指定しておくことで、音階の後の音長指定を省略できる、という記法はベーシックマスターから導入。(MZ-80K にはなかった)
MUSYS の影響
こちらも「電子音楽」としては有名でしたし、詳細を解説した文献もありました。
これが参考にされたであろう、という話をするには、if800 の次に音楽演奏を可能とした、パソピアのT-BASICを思い出す必要があります。
MUSYS では、NOTE というマクロ命令が常用されていて、「音階、音量、音長」を指定すると音を出すことができました。演奏そのものは MUSYS 言語のプログラムによって行います。
T-BASIC では、 SOUND という命令があり、「音階、音長」を指定すると音を出します。そして、演奏そのものは BASIC のプログラムによって行います。
もちろんプロ用に作られた MUSYS の方が多彩な演奏ができるのですが、T-BASIC での音楽演奏は、Tiny MUSYS とでも言えるような方法をとっています。
if800 で、もっと高度な MML という体系を作っていたにもかかわらず、なぜ T-BASIC で原始的な方法を取ったのかは不明です。メモリ容量の都合で MML ほど高度なものが入れ込めなかったのかもしれませんし、ハッカーの倫理に従って「シンプルな」命令に戻してみたのかもしれません。
実際には DISK 版に MML が存在しますが、DISK は本体より高価で持っていた人はわずかです。これが「標準ではない」のは明らかです。
また、カタログなどには ROM の SOUND 命令を音楽演奏機能と書いてあり、これで十分だと判断されたものだと推察できます。
そのため、DISK 版の存在を知っても、考察の結論には影響を与えません。
いずれにせよ、パソピアの音楽演奏へのアプローチは、MUSYS と非常に似ているように見えます。そして、実は if800 でも、MUSYS の影響が見て取れるのです。
if800 の MML では、「音階を数字で指定する」方法がありました。N の後ろに 1~12で、1オクターブ中の音を指定できます。オクターブを変えるにはオクターブ指定を組み合わせる必要があるのですが、実は後の PC-6001 以降では、全オクターブを通じて連続した数値で音階を指定できるように改良されています。
MUSYS が「半音階ごとに 1 増加する数字で音階を示した」のと似ています。
さらに、MML の中の数値部分には、変数を埋め込むことができました。
BASIC ですから、文字列で指定される MML の中に変数を使いたいのであれば、文字列の連結演算子を使えば簡単にできます。にもかかわらず、変数を埋め込む方法がわざわざ用意されているのは何故なのでしょう?
実は、ここに MUSYS の影響と、「MML」という名前の秘密がある、と僕は思っています。
MUSYS には「マクロ機能」がありました。でも、この「マクロ」という用語の使い方、一般的なものとは異なります。長くなるので詳細は書きませんが、当時はまだマクロは比較的新しい概念で、MUSYS 言語の作者であるグロゴノが用法を間違えているのです。
グロゴノが使ったマクロの意味は、「音楽用に必要なパラメータを変数に入れ、展開する機能」とでも言えばいいでしょうか…
そして、マイクロソフトが作った Music "Macro" Language にも、「必要なパラメータを変数に入れ、展開する機能」があります。BASIC の変数を MML 内に記述して、その場で解釈させることができるのです。
えー、そんな機能知らない、という声が聞こえてきそう。
でも、if800 では X の後ろに1文字の変数名を、PC-6001 以降では、=と;の間に変数名(配列変数も可能だけど、文字列変数はダメ)を、また PC-8801mkII では ( ) 内に変数を名を書くことで、数値部分を変数に出来ました。
ただし、PLAY 文の「機能一覧」表には入っておらず、別の個所で説明される場合もあります。(NEC はそうみたい?) 知らない人が多いのも道理です。
ちなみに、X での変数呼び出しは形を変えて MSX で復活し、「文字列変数」に入れられた MML を演奏します。
おそらく、MML の 「Macro」 は、MUSYS 由来のマクロ…「変数展開機能」を持っていることを示す言葉だと思われます。グロゴノの勘違いが、こんなところに顔を出すということは、MML の作成時に MUSYS が参考にされていたという証拠でもあります。
Music Macro Language の由来は、SCORTOS の記事のサブタイトルでもあった「Music Language」と、Altair MUSIC の言語名である「MUSIC Language」に、MUSYS の「マクロ機能」をくっつけたものだ、と考えると、名前の上でも機能の上でも納得がいきます。
音楽専用インタプリタの意味でマクロかな…とも思うのですが、操作マクロ的な意味であれば、その言語内から別の機能を操作できる必要があります。
(それ以外の目的で、小さなインタプリタが組み込まれても「マクロ」とは呼ばない)
マクロは主に「操作マクロ」か、テキストフィルタである「マクロ言語」か、いずれかの意味で使われますが、MML はどちらでもなく、今回調べた中では MUSYS のマクロに一番近いのです。