Skip to content

Gauche で MML の文字列を解釈して、PCMデータに変換するためのモジュールです。

Notifications You must be signed in to change notification settings

Hamayama/mmlproc

Repository files navigation

mmlproc

概要

  • 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 を作成する場合のインストール方法>

使い方

  (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 (Music Macro Language) について

  • 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. 演奏 1 秒あたり 22050 個の音声データを計算するため それなりに時間がかかります。

参考情報

  1. Scheme コードバトン
    https://gist.github.com/koguro/297312
    (wav ファイル出力の部分を参考にしました)

  2. c-wrapper の MML 音楽演奏サンプル
    https://github.com/Hamayama/c-wrapper-mg/tree/master/examples_mingw/mml
    (本モジュールを使用しています)

  3. 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)

About

Gauche で MML の文字列を解釈して、PCMデータに変換するためのモジュールです。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published