- Gauche で MML (Music Macro Language) の文字列を解釈して、
PCMデータに変換するためのモジュールです。
結果をwavファイルとして出力可能です。
-
mmlproc.scm を Gauche でロード可能なフォルダにコピーします。
(例えば (gauche-site-library-directory) で表示されるフォルダ等) -
C言語の開発環境があれば、以下の手順で DLL を作成してインストールすることもできます。
DLL があると高速に PCM データへの変換が行えるようになります。./configure # Makefile等を生成します make # コンパイルを実行します make install # Gaucheのライブラリフォルダにインストールします make check # テストを実行します
<Windows で DLL を作成する場合のインストール方法>
- 以下のページの「インストール方法」の説明で、msicon を mmlproc に読み替えて実施ください。 https://github.com/Hamayama/msicon
(use mmlproc) ; モジュールをロードします
(define pcmdata (mml->pcm "cdefg")) ; MML文字列をPCMデータ(s16vector)に
; 変換します
(call-with-output-file "test.wav" (cut write-wav pcmdata <>))
; PCMデータ(s16vector)をwavファイルに
; 変換して出力ポートに書き出します
サンプリングレートは変数 mml-sample-rate で取得/設定できます。
(デフォルトは 22050 (Hz) です)
DLL がインストールされていれば、高速に PCM データへの変換が行えます。
DLL がロードされているかどうかは、mml-dll-loaded? でチェックできます。
mml->pcm のオプション引数に #f を指定すると DLL を使用しません。
- MML は "t120 !c0 @0 v120 cdefg" のように文字列で音楽を記述します。
本モジュールで使用可能な MML の命令は、以下の通りです。
(MML には方言が多数あり、本モジュールも独自文法になっています)
アルファベット、数字、記号は、すべて半角です。
アルファベットの大文字小文字の区別はありません。
割り当てのない記号や空白は、無視されます。
(1)テンポ(全チャンネル共通)
テンポは、t120 のように指定します。数字は20-1200までです。デフォルトは120です。
数字は 1分間に演奏する4分音符の数になります。
(2)チャンネル
チャンネルは、!c0 のように指定します。数字は0-7までです。デフォルトは0です。
複数のチャンネルは同時に演奏されます。
(3)音色(チャンネルごと)
音色は、@0 のように指定します。指定できる数字は以下の通りです。デフォルトは0です。
=0:方形波
=1:正弦波
=2:のこぎり波
=3:三角波
=4:ホワイトノイズ
=500:ピアノ(仮)
=501:オルガン(仮)
=502:ギター(仮)
(4)音符(チャンネルごと)
音符は、c+4. のように 音の高さ、変化記号(シャープ/フラット/ナチュラル)、
音の長さ、符点(音長を1.5倍します) の順に記述します。
音の高さ以外は省略可能です。
音の高さは、cdefgabの各文字が、ドレミファソラシに対応します。休符は r になります。
変化記号は、シャープが + になります。フラットが - になります。
ナチュラルが = になります。( + のかわりに #、 = のかわりに * を使うこともできます)
音の長さは、4分音符が4、8分音符が8 のようになります。
符点(.)をつけると音長を1.5倍します。
数字の前に%をつけると絶対音長の指定となり、
4分音符が48、8分音符が24 のようになります(c%48とc4は同じ意味)。
音の長さを省略した場合は、後述のデフォルト音長(Lコマンド)で指定した長さになります。
(デフォルトでは4分音符の長さになります)
また、タイ/スラーは、& 記号で音符をつないで表現します(c4&c4等)。
また、タイは、^ 記号で音長だけを連結することもできます(c4^4等)。
(5)オクターブ(チャンネルごと)
オクターブは、o4のように指定します。数字は0-8までです。デフォルトは4です。
また、< で 1オクターブ下げます。 > で 1オクターブ上げます。
また、!o で < と > の意味を逆にします(全チャンネル共通)。
(現状は、ある程度高い音や低い音が うまく再生できません
(オクターブがおおよそ3~6の間である必要があります))
(6)調号(チャンネルごと)
調号は、!+cfg のように シャープをつける音符を複数指定します。
また、!-eab のように フラットをつける音符を複数指定します。
また、!=cfg のように ナチュラルに戻す音符を複数指定します。
( + のかわりに #、 = のかわりに * を使うこともできます)
(演奏の音符と区別するため、この命令の終わりには空白を入れてください)
(7)ボリューム最大値(全チャンネル共通)
ボリューム最大値は、!v127 のように指定します。数字は1-1000までです。デフォルトは127です。
例えば、!v16 とすると チャンネル音量が 0-16 までであるようなMMLを実行できます。
(8)チャンネル音量(チャンネルごと)
チャンネル音量は、v120 のように指定します。
数字は0-ボリューム最大値(!vで指定した値)までです。デフォルトは120です。
(9)ベロシティ(チャンネルごと)
ベロシティ(音の強さ)は、k100 のように指定します。数字は0-127までです。デフォルトは100です。
(現状は、ベロシティは未対応です。記述しても無視されます)
(10)デフォルト音長(チャンネルごと)
デフォルト音長は、L4 のように指定します。音符の音の長さを省略した場合に この値が使われます。
数字は、4分音符が4、8分音符が8 のようになります。デフォルトは4です。
符点(.)をつけると音長を1.5倍します。
また、数字の前に%をつけると絶対音長の指定となり、
4分音符が48、8分音符が24 のようになります(L%48とL4は同じ意味)。
(11)発音割合指定(チャンネルごと)
発音割合指定は、q8 のように指定します。
数字は1-8で、音長の8分のいくつまで発音するかという意味になります。デフォルトは8です。
(12)ループ指定(チャンネルごと)
ループ指定は、[ abc : de ]2 のように指定します。
[ ] の中を、数字の回数だけ実行します。数字を省略した場合は 2回実行します。
(2より小さい数を指定した場合も 2回実行します)
また、: があると、最後の1回だけは : のところでループを終了します。
また、ループは入れ子にすることが可能です。
例えば、[cd:e [fg]3 ] を実行すると cde fg fg fg cd が実行されます。
注意点として、ループ指定はチャンネルごとであるため、
複数のチャンネルをまたぐようなループは実行できません。
- 演奏 1 秒あたり 22050 個の音声データを計算するため それなりに時間がかかります。
-
Scheme コードバトン
https://gist.github.com/koguro/297312
(wav ファイル出力の部分を参考にしました) -
c-wrapper の MML 音楽演奏サンプル
https://github.com/Hamayama/c-wrapper-mg/tree/master/examples_mingw/mml
(本モジュールを使用しています) -
Gauche-al の MML 音楽演奏サンプル
https://github.com/Hamayama/Gauche-al-mg/tree/master/example/mml
(本モジュールを使用しています)
- OS
- Windows 8.1 (64bit)
- Windows XP Home SP3
- 言語
- Gauche v0.9.6
- Gauche v0.9.5
- Gauche v0.9.4
- 2014-11-1 v1.00 (初版)
- 2014-11-3 v1.01 音符追加処理見直し等
- 2014-11-3 v1.02 サンプリングレートを設定可能に
- 2014-11-3 v1.03 mml-sample-rateのrenameをやめた(test-moduleで検出)
- 2014-11-3 v1.04 音声データ計算処理見直し
- 2014-11-5 v1.05 音声データ計算処理見直し
(sin → %sin のように実数用関数に変更。doループをvector-tabulateに変更) - 2014-11-6 v1.06 タイ記号(&)の前の 空白、タブ、改行 を許可
- 2014-11-7 v1.07 コメント修正のみ
- 2014-11-8 v1.08 C言語のDLLを使用して計算できるようにした
(DLLが存在しない場合は今まで通り計算) - 2014-11-8 v1.09 コメント修正のみ
- 2014-11-8 v1.10 コメント修正のみ
- 2014-11-8 v1.11 mml->pcmのオプション引数usedllを追加
- 2014-11-11 v1.12 音色生成関数のハッシュテープルmml-progfunc-tableをexportした。
これを利用して音色生成関数をユーザが追加できる(test4001.scmを参照)。
ただし、DLL未使用(mml->pcmのオプション引数に#f指定)でしか使えない。 - 2014-11-26 v1.13 コメント修正のみ
- 2015-1-18 v1.14 エラーチェック追加
- 2016-3-31 v1.15 get-wav-size手続きを追加
- 2016-4-16 v1.16 コメント追加等
- 2016-10-14 v1.17 README修正(Gauche v0.9.5 で動作確認)
MMLの小文字変換処理修正 - 2018-7-7 v1.18 コメント修正のみ(Gauche v0.9.6 で動作確認)
(2018-7-7)