超ミニBASIC for SHオルゴール専用MML

SHオルゴールのページに戻る 超ミニBASIC for SHオルゴールのページに戻る



 MMLの詳細です。世間一般に流通しているMMLを参考にはしていますが、まったく同じではないので、従来のMMLに慣れている方は気をつけてください
 なお、「超ミニBASIC for SHオルゴール専用MML」というのは長ったらしいので、以後略してCMBMMLと呼びます。

世間に流通しているMMLと大きく違う点

・音長指定方式の違い

 世間に流通しているMMLでは音符の長さを、たとえば16分音符ならそのまま16という数値で表していたのですが、CMBMMLでは一桁の数値で表します。
 全音符から32分音符までの音符のうち、よく使われるものを10種選びそれを「基本音符」と呼ぶことにします。この10種類の基本音符に1〜9、0の一桁の数字を割り当てました。
 実際にMML中で使う際には、この基本音符にさらに符点を付けたり、タイで音符を繋いだりすることもできます。

 なぜこういう形式にしたかというと世間一般で使われているMMLは、16分音符や12分音符などは使用頻度が高いにもかかわらず音長指定が2桁になってしまい、やたらテキスト量が増えてしまうからです。それに7分音符とか11分音符などの変な音長はめったに使うことはありませんので、そういう音長も表現可能な世間一般のMMLの音長指定方式は無意味に自由度が高すぎると思います。

 なお、あえて半端な音長を指定する場合、CMBMMLは「直接音長指定」という方法を使います。詳しくは音符の書き方の項を参照してください。

・タイとスラーを分離

 世間に流通しているMMLでは、同じ音をつなぐ「タイ」と違う音をつなぐ「スラー」も同じく’&’記号で表していますが、CMBMMLではタイを’&’、スラーは’_’に分離しました。タイの場合は次の音も同じ音だとわかりきっているので、音名は書かず音長のみ書きます(音名を書いてはいけません)。どちらかというと、タイは二つの音をつなぐというよりは、はじめから1つの音であり音長の表記法を拡張したという感じです。

・世間に流通しているMMLと微妙に違う点

Vコマンド、Qコマンドなどのパラメータの範囲が違います
L、V、Q、O、@コマンドなどでパラメータの省略はできません

MMLの書式

 基本的に、音符・休符とコマンドに大別されます。音符・休符は、指定音長による時間経過のあるものであり、それが無いのがコマンドです。
 MML中の英字は、大文字・小文字を区別しません。

MML一覧

先頭文字

パラメータ ([]は省略不可能なパラメータ、{}は省略可能なパラメータ)

備考



A,B,C,D,E,F,G
のいずれか

{変化記号}{音長}{スラー}

{音長} は、基本音符、付点、タイからなる



R

{音長}





<

なし


>

なし


@

[音色番号]

範囲は0〜15

L

[音長]

範囲は0〜9(符点、タイなどは使えない)

O

[オクターブ]

範囲は0〜9

Q

[ゲートタイム]

範囲は1〜16

V

[音量]

範囲は0〜255



音符


 音名は C,D,E,F,G,A,B のいずれかです。
 変化記号は #,+,- のいずれかで、#,+ はどちらも半音上げます。- は半音下げます。
 音長の指定には、基本音符方式と直接音長指定方式があります。詳しくは次項を参照してください。
 スラーを付けると、その音符に限りQコマンドを無視し発音時間=音長とします。

音長の表し方

・基本音符方式


・直接音長指定


休符

 音符の表し方とほぼ同じですが、変化記号やスラーを付けることはできません。音長の指定は、音符同様基本音符方式、直接音長指定どちらも使えます。基本音符を省略したときLコマンドで指定した値が使われるのも同様です。

@コマンド

 音色を指定します。パラメータは音色0〜15の音色番号です。パラメータの省略はできません。

Lコマンド

 デフォルトの基本音符を指定します。パラメータは0〜9で基本音符を指定します。Lコマンドで指定するのは「基本音符」ですので、符点やタイを付けることはできません。

Vコマンド

 音量を指定します。パラメータの範囲は0〜255で、大きいほど音量も大きくなります。パラメータの省略はできません。

Qコマンド

 ゲートタイム(音長に対する、実際に発音する時間)の割合を指定します。パラメータの範囲は1〜16で、16だと音長と同じ長さ発音することになり、8だと音長の半分の長さ発音することになります。パラメータの省略はできません。

Oコマンド

 オクターブを指定します。パラメータの範囲は0〜9で、大きいほど高いオクターブになります。パラメータの省略はできません。
 なお、発振器エミュレーションの精度の問題で、あまり高すぎたり低すぎたりするオクターブではあまりきれいな音が出ません。また、O9は実際にはO8と同じ高さの音が出ます(オシレータ割り込みの周期をもっと短くすれば本当のO9が出せるのですが)

>コマンド

1オクターブ上げます。現在すでにO9の場合エラーになります。

<コマンド

1オクターブ下げます。現在すでにO0の場合エラーになります。