DS WAVEミクシング再生を使うための設定として真っ先に必要なことは、MIDIディヴァイスを乗っ取らせることです。これは: コマンドでトラックにMIDIディヴァイスを関連付けた後、セッティングレジスタ#100に1を書き込んで実現します。
#1 :1,0 =100,1 / ディヴァイス1をDS WAVEとして扱う
次に、DS WAVEで扱う音色の設定を行う必要があります。
将来的にはDWP(音色定義用のファイル)を指定して一発設定できるようにする予定ですが、現在は未実装なので一つ一つ設定しなくてはなりません。
まず、DS WAVEで同時に扱う波形数をセッティングレジスタ#101に設定します。ここでいう"扱う"とは、音色に波形を割り当てることを指します。実際に再生されていなくても、割り当て済である間は波形を占有することになります。(DirectSoundの仕様なのねん)
つまり、使いたい波形それぞれについて同時に鳴らしたい数を決め、それらの総和が設定すべき値ということになります。
そして個々の音色設定。DS WAVEではMIDIのドラムセットのようにプログラム番号とノート番号の組み合わせで音色を指定します。その中から設定したい位置を選び、プログラム番号(0~127)の128倍にノート番号を加算した数をセッティングレジスタ#102へ書き込んでから任意の設定を行います。音色が複数ある場合はセッティングレジスタ#102を書き換えながら同様に設定していきます。
音色設定には以下の要素があります。
拡張コマンド | #128 | 波形のロード |
#129 | ロードした波形の複製(多重に鳴らしたい場合) | |
#144 | 音量エンヴェロープ | |
#145 | 定位エンヴェロープ | |
#146 | 音程エンヴェロープ | |
セッティングレジスタ | #109 | 音量(0~16384) |
#110 | 定位(-16384(左)~0(中央)~+16384(右)) | |
#111 | 音程(+256で半音上がる) | |
#115 | PCMファイルチャネル(次回ロードする波形番号) | |
#116~117 | PCMファイルフラグ(次回ロードする波形のフラグ) | |
#121 | フラグ(4=ループ再生, 8=エンヴェロープ有効化, 12=両方) |
#1 =101,10 / 同時に扱える波形数 =102,60 / @0o4c を設定対象にする =115,0 =116,0 =117,0 / 次にロードする波形のオプション(0なら本当は設定不要) ?128"hogehoge.wav" ?129{02} / 波形をロードし、3音同時に使えるように複製 =109,12345 =110,0 =111,-3072 / 音量,定位,音程 =121,12 / ループ再生&エンヴェロープ有効化 ?144{a0a00000 40404040 48645838 38481800 20308000 50202000} / 音量エンヴェロープ
音階を伴なうような音色を使う場合、それぞれのノートに個別のPCMを割り当てていくのは非効率極まりなさげ。
この対策として、別のノートで波形を共有することができます。このとき音色設定もコピーされますが、波形以外の設定は後で個別に再設定できます。
セッティングレジスタ | #118 | 同プログラム連続ノート |
#119 | 同プログラム連続ノート,音程を自動的にずらす | |
#120 | 別プログラム単一ノート |
#1 =102,&3c / コピー元(@0o4c) =118,&303b / @0o3c~bに同じ設定でコピー =119,&3d48 / @0o4c+~o5cに音程をずらしながらコピー =120,&013c / @1o4cに同じ設定でコピー
再生するときはMIDIと同じように書いていくだけでOKです。
一部、コントロールチェンジにも対応しています。
(というか、音量を明示的に設定しないと鳴らない)
有効なものは、#6(データエントリー(ベンドレンジ設定のみ)),#7(ヴォリウム),#10(パンポット),#11(エクスプレッション),#72(リリースレイト),#73(アタックレイト),#75(ディケイレイト),#100~#101(RPN)です。
#7,10,11については、MMLのV,P,Xコマンドがそのまま使えます。
#72,73,75は音色設定でエンヴェロープが有効なときだけ反映されます。何れも64が標準値で、0にすると元設定の1/16, 127にすると16倍の変化時間でエンヴェロープが進行します。
#1 `+6 @0 v127u100o4l2 cdefgab<c
1行目はシーケンスのトラックとストリームのコンテクストを関連付けています。複数のストリームを同時に扱うときは、セッティングレジスタ#130に別の値を設定してコンテクストを切り替えることで並行化できます。#1 =130,0 =115,0 ?132"stream.wav" ?137{00} ?134 ?137{01}