プチコンMML

【プチコン/mkII 両対応】 2011年12月8日 公開
2012年3月24日 更新

プチコンで音階演奏を行うプログラムです。
プチコンでの音階演奏用としてはコンパクトサイズであるOMP単音/和音/BGM)を発表していますが、「MMLが特殊」ということもあり、一般的なMMLに近いものを作ってみました。

@MML
Q=LEN (M$)-1:M=0:N=22:V=127:F=1
A$="09110002040507":T=120:O=2
VSYNC 0:FOR I=0TO Q
A=ASC(MID$ (M$,I,1))
M=M+(A==43)+(A==35)-(A==45)
O=O+(A==60)-(A==62):A=A-65
IF A>=0 AND A<7 THEN GOSUB @S
IF A==-19THEN F=1.5
IF A==-1 THEN GOSUB @N
IF A==11 THEN GOSUB @L
IF A==14 THEN GOSUB @O
IF A==17 THEN GOSUB @R
IF A==19 THEN GOSUB @T
IF A==21 THEN GOSUB @V
NEXT:RETURN
@S
GOSUB @P
B=VAL (MID$ (A$,A*2,2))
R=L:IF P THEN R=P
Z=O*12+M+B-24:M=0
@BP
BEEP N,341.3*Z,V
GOTO @W
@L
GOSUB @P:L=P:RETURN
RETURN
@N
GOSUB @P:N=P:RETURN
@O
GOSUB @P:O=P:RETURN
@R
GOSUB @P
R=L:IF P THEN R=P
GOTO @W
@T
GOSUB @P:T=P:RETURN
@V
GOSUB @P:V=P:RETURN
@P
P=VAL (MID$ (M$,I+1,Q-I))
RETURN
@W
VSYNC 14400/R/T*F:F=1:RETURN
QRコード(ファイル名:OCHAPMML)


《 使用方法 》

変数M$にMMLデータを入れてGOSUB @MMLとすれば音階演奏ができます。

なお本プログラムは1トラックの演奏のみのサポートとなっていますが、複数トラックでの演奏を可能に改造するのはこちらの講座に書いてあることを読めば簡単にできるので必要な方は各自でやってみてください
特に複数トラックである必要が無ければ1トラックでも和音を鳴らせる簡易和音演奏も搭載しているのでそれを利用するのもいいかもしれません。
※この簡易和音演奏機能は単音版OMPも隠し機能として備えています。

プログラムリストは短縮可能ですが、機能拡張をしやすくするためあえて行っていません。適当に改造して使ってください。

MMLについては下記のものをサポートしています。

基本機能
音符

 CDEFGABでドレミファソラシの音が鳴ります。
 休符はRです。

C8(8分音符でCの音を鳴らす)

 音長指定を省略した場合はデフォルトの長さで音が鳴ります。

R4(4分休符)

 長さ指定を省略した場合はデフォルトの長さになります。
 ※休符は単なる時間調整機能として働きます。

L16(デフォルト長を16に設定)

 Cn、Rn、Ln(0<n<524288)
#D(半音上げてDの音を鳴らす)
+E(半音上げてEの音を鳴らす)※#と+は同一機能です
-F(半音下げてFの音を鳴らす)

 ※シャープやフラットは指定している音符のみ有効となるので必要な場合はその都度指定してください。
 1つ書くごとに半音変わっていくため2つ連続して書けば全音分変わります。

T120(テンポを120に設定する)

 Tn(0<n<524288)※デフォ値は120

O2(オクターブを2に設定する)

 On(0≦n≦3)※デフォ値は2

<>でオクターブの上げ下げもできます。

@20(音色を20に設定する)

 @n(0≦n≦69)※デフォ値は22

V127(ボリュームを127に設定する)

 Vn(0≦n≦127)※デフォ値は127

拡張機能
音符、休符、テンポの長さ指定に関してはプチコンで扱える範囲内の数が小数を含めてすべて使えます。
本MMLは連符の音符やスタッカートなどをサポートしていませんが拡張機能によって擬似的に可能になります。

 ※これらの機能は標準的なMMLから大きく外れていることを承知の上で使用ください。
.C4(付点4分音符でCの音を鳴らす)

 ※当MMLは音長指定に小数点が使えるため一般的なMMLのように音長の後に点を入れるのではなく音名の前に付点を入れる必要があります。
   なお、付点音符はデフォルト長には設定できません。

 また、付点4分音符=4分音符の1.5倍の長さなので 4÷1.5≒2.67 となるためC2.67で付点四分音符を表現できます。
 ※音長を小数指定の場合には正確な音長を出すことはできないため注意して使用ください。
   正確さを求める場合は14400をテンポ指定値で割った数値(小数点以下は切り捨て)の休符を入れる(テンポ100ならば144分休符 R144を入れる)ことで1フレーム単位で調整できるため問題ないと思います。


D4.57(複付点8分音符でDの音を鳴らす)

 複付点8分音符=8分音符の1.75倍の長さなので 8÷1.75≒4.57

E12(4分音符の三連符でEの音を鳴らす)

 三連符=元の音符の1/3倍の長さなので 4×3=12

F40(8分音符の五連符でFの音を鳴らす)

 五連符=元の音符の1/5倍の長さなので 8×5=40

S1(音を1つだけ残して残りは消す)

 プチコンのBEEPは短い音を鳴らせないのでこれを使って鳴りすぎている音があれば消してください。

 ※最近鳴らした音が優先して残ります。

 Sn(0≦n≦7)
 指定値を省略した場合は鳴っているすべての音が消えます。(つまり、SS0と同じ)

T120L32CDEFGS2 (最近鳴らした2つの音、つまりGとFを残してすべて消える)

 これを使えばスタッカートも表現できます。
 T120L99CSR4DSR4ES (「S」を取って消音効果を確認してみてください)

簡易移調機能

 全体的に少し高い(低い)音にしたいという場合に調整できます。

O2.33 (O2と比べて全体の音を半音4つ分だけ高めます)

 半音 = 1/12オクターブ ≒ 0.083オクターブ
 であるため0.083単位でオクターブ指定の数値を変えれば全体の音を半音単位で調整できます。

 ※この機能を使用する場合は曲の途中でのオクターブ変更はオクターブの上げ下げ機能を使ってください。

簡易和音演奏機能

 Lの指定値を極端に大きな値にすることで複数の音を同時に鳴らせます。(最大8チャンネルまで発音)
 極端に大きな値とは14400÷テンポ指定値よりも大きな値のことです。(つまり、音の長さが0になるような指定)

L999CEG (コードC:ドミソの和音を鳴らす) C999E999G999と同じ意味です。(指定値は999を推奨)

 うまくRで時間調整を行えば複数トラックと同じ感覚で和音演奏も可能です。

PLAY "T120O3{CEG}4{CEG}4","O4C8E8G4"一般的なMMLで表記したもの
T120O1L999C<C12>E24<E24>G12C<G12>E12G12この簡易和音演奏機能で表記したもの

複数トラックをサポートしている和音演奏ソフトにありがちな音ずれは発生しません。

複数トラックの演奏が可能なものにするのは簡単ですが、これらの拡張機能がほぼすべて使えなくなるだけでなく音長やテンポ指定にも制限が出てきます。
したがって、複数トラックでの演奏機能を追加する予定はありません。


簡易和音演奏機能をもう少しだけ解説

童謡「ちょうちょ」最初の4小節
T120L999G>CE4<E4E2F>FG4<D4D2C>CE4<D4E4F4G>G4<G4G2

G>CE4<同時に鳴らす音を羅列して最後に音長指定(※次に鳴らす音符に合わせ長さにする)
E4E2同時に鳴らす音がないときは普通に演奏
F>FG4<以下同じ

すでに複数トラックに分かれている状態のMMLをこの簡易和音演奏用に書き直すのは大変ですが、楽譜を見ながら書けば「次に演奏する音符」は一目瞭然であるためそれほど難しくはありません。
ギターコード(ピアノコード)のような和音演奏がメインの場合はL999CEG4CEG#A4C#DG4C、C7、Cmが鳴らせるため複数のトラックに分けて書くよりも分かりやすくて簡単でしょう。

《更新履歴》

ver.1.1(2012年3月24日)


RETURN/RETURN *MAIN

inserted by FC2 system