Milord Club 
 Top  > 古今和歌集の部屋  > [音]  > データ作成の概要

  ■  データ作成の概要
    文字表記からwavファイル作成までの関連図
 
    マイクロチューニングなんていらない、むしろ十二平均律の方がいい、という場合にはどこを切ればよいかおわかりになると思います。ただその場合、提示しているデータはマイクロチューニング用になっているので多少手直しが必要です。「MML/MIDIデータ等」のページにあるテキスト音楽「サクラ」用のMMLの内容をここで説明しておきます。

  まず、MMLは一首につき一ファイルで次のようになっています。
//6,1,春たてば,花とや見らむ,白雪の,かかれる枝に,うぐひすの鳴く
Include(totata.h); TrackName={"6-1"}; Uta{
タトトトト。トタトトトタ-ト。トタトトト。トタタトトトト。トタトトトトト。
}
    一行目はコメントです。ニ行目、totata.hをIncludeしているのでそこにtotata.hの内容が展開されます。Utaはtotata.h内で定義されているユーザー関数で、それに引数として文字列を渡しています。三行目の文字列の中に「タ-」があります。文字表記の巻別一覧には「ト」と「タ」の二種類しか書いてありませんが、MMLの中には「少し低いト(ト-)」「少し高いト(ト+)」「少し低いタ(タ-)」「少し高いタ(タ+)」が含まれます。ただし、これら四つの音はオプション扱いで、実際には少ししか使われていません。  (参考:ト+-/タ+-を含むもの

  このようにすべてがtotata.hをIncludeしていて、そこでは共通の属性とUta関数が記述されています。
// totata.h
// =======================================
// TimeBase: 960
// BPM: 116
// Velocity: 120
// Gate: 100%
//
//----------------------------------------
Function Uta(Str N){
//***************************
Int U_Mode= 50;
//***************************
// <U_Mode>
// 0: ト(n67)/タ(n69)
// 1: ト(n69)/タ(n71)
// 2: Mode0と同じで音色指定
// 10: Mode0と同じで句切れを伸ばす
// 11: Mode0と同じでVelocityを変える。ト(v120)/タ(v80)
// 12: ピッチベンドを使用して1音でMode0
// 50: ト-(n60)/ト(n61)/+ト(n61)/タ-(n78)/タ(n79)/タ+(n80)
//
  SWITCH(U_Mode) {
    CASE(0){ U_00(); }
    CASE(1){ U_01(); }
    CASE(2){ U_02(); }
    CASE(10){ U_10(); }
    CASE(11){ U_11(); }
    CASE(12){ U_12(); }
    CASE(50){ U_50(); }
    DEFAULT{ U_00(); }
  }
}
//----------------------------------------
Function U_00(){
N.s({+},{});     +を空文字に置換(=削除)
N.s({-},{});
N.s({ト},{n67;});  トを"n67"に置換(ノート番号67on)
N.s({タ},{n69;});
N.s({。},{r;});     。を"r"に置換(休止符)
N.s({、},{});       、を削除(=無視)
N;          最終的に得られた文字列を発音
}
(中略)
Function U_50(){
N.s({ト-},{n60;});
N.s({ト+},{n62;});
N.s({タ-},{n78;});
N.s({タ+},{n80;});
N.s({ト},{n61;});
N.s({タ},{n79;});
N.s({。},{r;});
N.s({、},{});
N;
}

//========================================  ここから下が共通の属性の指定
TimeBase = 960;
System.ControllerShift(0);
TimeSignature = 4,4
//----------------------------------------
//_Track0.
Track(0); Channel(16); Time(1:1:0);
Tempo = 116; // BPM(Tempo)
//----------------------------------------
//_Track1.
Track(1); Channel(1); Time(1:1:0);
v120 // Velocity
q100 // Gate
l8 // Note Length
//========================================
    関数Utaは変数U_Modeの値により実際に処理を行なう関数に分岐しています。今の場合(デフォルトの)50なので関数U_50に飛びます。.sは文字列置換の機能です。こうして渡された文字列はMIDIノート番号を表わす表記に置き換えられます。
 
 ト-  60
 ト  61
 ト+  62
 タ-  78
 タ  79
 タ+  80
    これはノート番号81を440Hzにした10cent刻みのスケール用なので、十二平均律でそのまま再生すると変な音になります。十二平均律で鳴らす場合は変数U_Modeを0にします。すると関数U_00が呼ばれてノート番号の対応は次のようになります。つまり+/-を含んでいてもMML側を直す必要はありません。
 
 ト-  67
 ト  67
 ト+  67
 タ-  69
 タ  69
 タ+  69
    十二平均律ではノート番号67はGの音(ソ)、ノート番号69はAの音(ラ)です。
  (参考:十二平均律でのMIDIノート番号の対応表

[メモ]
  • Uta{トタタ}はUta({トタタ})の省略形です。
  • 引数の変数のスコープはローカルではないようです。
  • テキスト音楽「サクラ」の「MMLをMIDIファイルへ一括変換」機能を使うと1,100個のMMLファイルを一撃で1,100個のMIDIファイルに変換できます。
  • 使用したテキスト音楽「サクラ」のバージョンは2.37です。
( 2006/02/05 )