|
■ データ作成の概要 |
|
文字表記から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です。
|