MML仕様書




専門知識がなくても、楽譜などから曲を出来るだけ簡単に入力できる様にしてあります。


フォーマット



const unsigned char songdata[]のカッコ内にテンポ、音階、長さを入れていきます。最後にCMD ENDで終了とします。
区切りは、スペースかタブで区切ります。


const unsigned char songdata[]={
CMD 100 TEMPO //テンポ定義
R L8D F$ T12 C$ T24 F$ T24 F$ T24 〜 G$ T12 F$ T48 //楽譜
CMD END //曲の終わり
};



コマンド



コマンドは合計4つあります。

曲の終わり CMD END 曲の最後に必ず記入します
テンポ指定 CMD 数字 TEMPO テンポは0〜254まで設定でき、0が一番速く、数字が大きくなると遅くなります。
テンポチェンジはどこで行っても構いません。
255はコマンドの予約語で使用不可です。


CMD 150 TEMPO
C L4 A$ L2
CMD 80 TEMPO
D L4 G L16
CMD END
音階指定 音階を参照 音階を特定の記号でセットします。
音符長指定 音符長を参照 音階の音符長をセットします。 音階の後に必ずセットします。省略はできません。




例外処理



ダイレクト数値設定は可能ですが、音階と音符長関係が分かりにくくなったりするなど、作業効率が低下する原因となり、あまりお勧めしません。

音符長のダイレクト指定 数字, 直接音の長さを指定する場合は、直接数値を入力できます。
その場合は , (セミカンマ)を数字の後に入れます。また扱える数字は1〜254です。
255はコマンドの予約語で使用不可です。

例 C L4 D 254, E L6 F 122, A
音階のダイレクト指定 数字, アラビア音階や純旋律音階など、平均調律以外の音を使う場合は、直接数字を使って入力できます。
227以上は、割り込みが間に合わなくなる可能性があり、正常な動作ができません。


C L4 D L4 157, F L8 .....




音階のダイレクト指定時の数字

音階 setdata 音階 setdata 音階 setdata
-1oct middle +1oct
C 261.63 19 523.25 139 1,046.50 198
C# 277.18 33 554.37 145 1,108.73 202
D 293.66 45 587.33 152 1,174.66 205
D# 311.13 57 622.25 158 1,244.51 208
E 329.63 68 659.26 163 1,318.51 211
F 349.23 79 698.46 169 1,396.91 213
F# 369.99 89 739.99 174 1,479.98 216
G 392.00 99 783.99 178 1,567.98 218
G# 415.30 108 830.61 183 1,661.22 220
A 440.00 116 880.00 187 1,760.00 222
A# 466.16 124 932.33 191 1,864.66 224
B 493.88 131 987.77 195 1,975.53 226




音階



半音上げる記号#は$を使います。A#→A$
フラット♭については、シャープに読み替えます。 B♭→A$
これら音階と休符の後には必ずスペースもしくはタブで文字間を空けて、
音符長データを付加させます。
休符はRを使用します。無音となります。


音階(#) ド# レ# ファ ファ# ソ# ラ#
C C# D D# E F F# G G# A A# B
音階(♭) レ♭ ミ♭ ファ ソ♭ ラ♭ シ♭
C D♭ D E♭ E F G♭ G A♭ A B♭ B
-1oct. CL C$L DL D$L EL FL F$L GL G$L AL A$L BL
default C C$ D D$ E F F$ G G$ A A$ B
+1oct. CH C$H DH D$H EH FH F$H GH G$H AH A$H BH
休符 R

      






音符長データ

English 日本語 100%GATE 66%GATE
whole 全音符/休符 L1 T192
half 2分音符/休符 L2 T96
triplets half 3連2分音符/休符 L3 T64
quater 4分音符/休符 L4 T48
dotted quater 付点4分音符/休符 L4D T72
triplets quater 3連4分音符/休符 L6 T32
eighth 8分音符/休符 L8 T24
dotted eighth 付点8分音符/休符 L8D T36
triplets eighth 3連8分音符/休符 L12 T16
sixteenth 16分音符/休符 L16 T12
dotted sixteenth 付点16分音符/休符 L16D T18
triplets sixteenth 3連16分音符/休符 L24 T8
32th 32分音符/休符 L32 T6
dotted 32th 付点32分音符/休符 L32D T9
triplets 32th 3連32分音符/休符 L48 T4
64th 64分音符/休符 L64 T3
triplets 64th 3連64分音符/休符 L96 T2
192th(The minimum unit) 192分音符/休符 L192 T1

※音符について詳しい事はWikipediaの音符等を参照してください。




打ち込みノウハウ

装飾音や効果音への利用



32分音符以上の速い音符は装飾音や効果音位の利用となるでしょう。上記表中で3連音符と書いていますが、便宜上であり、曲によっては5連符や7連符だったり、装飾音だったりします。

例 4分音符でドレミファ C L4 D L4 E L4 F L4



全休符以上の音の対応



全音符以上の長さの場合は、同じ音をつなげます。同じ音が続くと、実際の再生は音がつながります。

 例 ドの音がスラーで4小節続く場合 C L1 C L1 C L1 C L1


同音を切りたい場合



同じ音が続いて音を切りたい場合は、休符を入れます。その場合は音符+休符でオリジナルの音符長になるようにします。

 例 1小節中に ラの音が4つある
A L4 A L4 A L4 A L4 //これだと音がつながって、全音符のラの音になってしまう。
A L8D R L16 A L8D R L16 A L8D R L16 A L8D R L16 //付点8分音符と16分休符の組み合わせを使う。



簡単に歯切れのよい曲ができるTxxコマンド



同音を簡単に切れるようにTxx を用意しています。これを使えば音符を簡単に分ける事ができて、煩わしい休符計算が不要になります。なお、数字がLxxと違う表記ですが、全音符を192タイムコードと意識した表現になった為です。

A T48 A T48 A T48 A T48 //66%ゲートで全音符が4回切れて聞こえる


メモリーを節約するには



Txxコマンドは便利ですが、1音符について2回分のデータを消費します。Rなどの休符の後や異なる音符が続く場合は、Txxコマンドを使わずにLxxコマンドを使用する事でメモリー消費を抑える事ができます。



電子オルゴールの記事へ戻る








旧仕様

melodyc.c , melodyc2.cのみ----------------------------------------------



現在の仕様書と同じです。

melodyb.c melodyd.cのみ----------------------------------------------



テンポ指定 直接メモリーに値を入れます。
テンポチェンジはどこで行っても構いません。
例 tempocont = 176;

特別ルール
全音符以上の長さの場合は、同じ音の指定を省略できます。
C L1 C L1 C L1 →C L1 L1 L1
直接音の長さを指定する場合は、wtime();を使います
例 C L4 D wtime(254); E L6 F wtime(122); A


melodyd.cのみ----------------------------------------------



2和音が使用できます。
2つ目のパートは最初にHをつけます。
音が切り替わったパートに対して音符長データをつけます。
// CH1 CH2 Length
FL HA L8
AL L8
C L8
F L8

出来るだけ、音がダブらないように入力するほうが良い音がだせます。
C HC L8 → 同じドの音がなる。
CL HC L8 → チャンネル1のドの音を1オクターブ低くした





履歴

2011/12/18 一部修正、加筆。
2011/9/3 HI-TECH C PRO for the PIC10/12/16 MCU Family (Lite mode)に対応に伴う説明変更。
2003/12/23 初版





(C)2003-2011 air variable All Rights Reserved..