# 音源定義ファイルの仕様

### 概要

音源定義ファイルとは、その音源の持つ音色名や、各種設定方法などを定義するファイルです。
Dominoはこの定義ファイルにもとづいて音源を操作します。
音源定義ファイルはDomino.exeと同じ位置にある「Module」フォルダ内に格納されています。
音源定義ファイルを自作する場合や、他から貰ってきた場合はこのフォルダに作成・コピーしてください。
音源定義ファイルは１音源につき、１ファイル作成します。
（１ファイルで複数の音源を定義する、という事は通常はしません）

### 主な構造

音源定義ファイルはXML（Extensible Markup Language）という形式で記述します。
（HTMLのようにタグを用います。）
定義ファイルの主な構造は次のようになっています。

    <?xml version="1.0" encoding="Shift_JIS"?>

    <ModuleData （音源の基本情報を記述）>
    	（オプションを記述）
    	<InstrumentList>
    		（音色情報を記述）
    	</InstrumentList>
    	<DrumSetList>
    		（ドラムセット情報を記述）
    	</DrumSetList>
    	<ControlChangeMacroList>
    		（コントロールチェンジマクロ情報を記述）
    	</ControlChangeMacroList>
    	<TemplateList>
    		（テンプレート情報を記述）
    	</TemplateList>
    	<DefaultData>
    		（デフォルトデータ情報を記述）
    	</DefaultData>
    </ModuleData>

（タブや空行などは自由に入れられます。）
あとはカッコで書かれている部分を書き込めば定義ファイルとなります。
各部分について説明いたします。

### 音源の基本情報

ModuleDataタグの属性として、音源および定義ファイルの基本情報を記述します。
例）

    <ModuleData Name="SC-8850" Folder="Roland" Priority="100" FileCreator="Takabo Soft" FileVersion="1.00" WebSite="http://www.tkb-soft.hmcbest.com/">

ModuleDataタグの属性は次の通りです。
（属性名やタグ名は大文字・小文字を区別しません。また、属性の順番は自由です。）

属性 | 省略時 | 意味
--- | --- | ---
Name | 必須 | 音源名を指定します。
Folder |  | Domino上で音源を選ぶ際の画面で、ここで指定したフォルダに入ります。
Priority | 100 | 同じフォルダ内の優先度（順番）を指定します。値が小さいほど、早い順番になります。
FileCreator |  | 定義ファイルの作成者名を指定します。
FileVersion |  | 定義ファイルのバージョンを指定します。定義ファイルを修正した場合にはバージョン番号を上げておくと良いでしょう。
WebSite |  | 定義ファイルの配布サイトもしくはホームページを指定します。

定義ファイルの作成者名やバージョン情報は、[ヘルプ]メニューの[音源定義ファイル]情報から確認できます。

### オプション

ModuleDataタグの要素としていくつかオプションを指定する事ができます。
例）

    <RhythmTrackDefault Gate="1" />
    <ExclusiveEventDefault Data="f0h 41h 10h 42h f7h" />
    <ProgramChangeEventPropertyDlg AutoPreviewDelay="0" />

RhythmTrackDefaultタグ
  Gate属性で、リズムトラックにおけるノートのゲート値を指定します。
ExclusiveEventDefaultタグ
  Data属性で、エクスクルーシブイベントのデフォルトデータを指定します。
ProgramChangeEventPropertyDlgタグ
  AutoPreviewDelay属性で、[プログラムチェンジイベントのプロパティ]画面の自動プレビューまでの遅延時間を指定します（ミリ秒単位、デフォルトは0）。
  MIDI機器によっては、プログラムチェンジを送信してから実際に音色が切り替わるまで時間の掛かるものがあります。その場合、この遅延時間を指定しておけば、自動プレビュー時に正しい音色が発音されるようになります。

なお、XMLのルールにより、タグを閉じる必要がない（一つのタグだけで完結する）ものは、 タグの最後にスペースとスラッシュを必ず入れてください。

### 音色情報

音色情報は、[マップ]、[PC]、[バンク]の三階層になっています。
音源自体にバンクが存在しなくとも、PC１つにつき１つのバンクが必要です。
例）

    <Map Name="55Map">
    	<PC Name="Piano 1" PC="1">
    		<Bank Name="Piano 1" LSB="1" MSB="0" />
    		<Bank Name="Piano 1w" LSB="1" MSB="8" />
    		<Bank Name="Piano 1d" LSB="1" MSB="16" />
    		<Bank Name="Piano 2" LSB="1" MSB="126" />
    		<Bank Name="Acou Piano1" LSB="1" MSB="127" />
    	</PC>
    	<PC Name="Piano 2" PC="2">
    		<Bank Name="Piano 2" LSB="1" MSB="0" />
    		<Bank Name="Piano 2w" LSB="1" MSB="8" />
    		<Bank Name="Piano 2" LSB="1" MSB="126" />
    		<Bank Name="Acou Piano2" LSB="1" MSB="127" />
    	</PC>
    </Map>

#### Mapタグ

Mapタグはマップを定義します。
Mapタグは複数定義する事ができます。
Mapタグは複数のPCタグを要素として持つことができます。
Mapタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Name | 必須 | マップ名を指定します。

#### PCタグ

PCタグはPC情報を定義します。
PCタグは複数定義する事ができます（必ず128個定義する必要はありません）。
PCタグは複数のBankタグを要素として持つことができます。
PCタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Name | 必須 | PC名（楽器名）を指定します。
PC | 必須 | PC番号を1〜128の範囲で指定します。

#### Bankタグ

Bankタグはバンク情報を定義します。
Bankタグは複数定義する事ができます（PC１つにつきバンク１つは必須です）。
Bankタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Name | 必須 | バンク名（楽器名）を指定します。
LSB |  | Bank Select LSBとして送信する値を指定します。省略、または255を指定した場合は送信しません。
MSB |  | Bank Select MSBとして送信する値を指定します。省略、または255を指定した場合は送信しません。

### ドラムセット情報

ドラムセット情報は、「音色情報」とほとんど同じですが、Bankタグの要素として複数のToneタグを定義する事ができます。
例）

    <Map Name="55Map">
    	<PC Name="STANDARD" PC="1">
    		<Bank Name="STANDARD" LSB="1" MSB="0">
    			<Tone Name="High Q" Key="27" />
    			<Tone Name="Slap" Key="28" />
    			<Tone Name="Scr.Push" Key="29" />
    			<Tone Name="Scr.Pull" Key="30" />
    			<Tone Name="Sticks" Key="31" />
    			<Tone Name="Sq.Click" Key="32" />
    			<Tone Name="Mt.Click" Key="33" />
    			<Tone Name="Mt. Bell" Key="34" />
    			<Tone Name="Kick 2" Key="35" />
    			<Tone Name="Kick 1" Key="36" />
    			（省略）
    		</Bank>
    	</PC>
    </Map>

#### Toneタグ

ToneタグはBankタグで定義されたドラムセットの、各キーにおける楽器名を定義します。
Toneタグは複数定義する事ができます（省略可）。
Toneタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Name | 必須 | 楽器名を指定します。
Key | 必須 | 音階（ノート番号）を0〜127の範囲で指定します。

### コントロールチェンジマクロ情報

コントロールチェンジマクロ機能は、コントロールチェンジ機能を擬似的に拡張した機能です。
マクロを定義する事で、ユーザーはコントロールチェンジと同じ感覚で様々な設定を行うことができるようになります。
そうしたマクロ情報を、ここで定義します。
例）

    <Folder Name="Sample">
    	<CCM ID="1" Name="PitchBend" Color="#0fa806" Sync="Last">
    		<Value Min="-8192" Max="8191" Offset="8192" />
    		<Memo>音程を変化させます。</Memo>
    		<Data>@PB #VH #VL</Data>
    	</CCM>

    	<CCM ID="161" Name="Dr:Level">
    		<Value />
    		<Gate Type="Key" />
    		<Memo></Memo>
    		<Data>@NRPN 1AH #GL #VL #NONE</Data>
    	</CCM>

    	<CCM ID="259" Name="Part Mode">
    		<Value Max="2">
    			<Entry Label="Normal" Value="0" />
    			<Entry Label="Drum1" Value="1" />
    			<Entry Label="Drum2" Value="2" />
    		</Value>
    		<Memo>通常の楽器パートか、ドラムセットパートかを設定します。</Memo>
    		<Data>@SYSEX F0H 41H 10H 42H 12H [ 40H #1RCH 15H #VL ] F7H</Data>
    	</CCM>

    	<CCM ID="500" Name="TableTest" Color="#0fa806">
    		<Value Min="0" Max="3" TableID="1" />
    		<Memo>テーブル参照サンプルです。</Memo>
    		<Data>@SYSEX （省略）</Data>
    	</CCM>

    	<CCMLink ID="500" Value="1" />
    </Folder>

    <Table ID="1">
    	<Entry Label="0ms" Value="0" />
    	<Entry Label="0.1ms" Value="1" />
    	<Entry Label="0.2ms" Value="2" />
    	<Entry Label="0.3ms" Value="3" />
    </Table>

#### Folderタグ

各CCMタグは、自由にフォルダを作成でき、その中へ入れることができます。
こうすることにより、ユーザーが目的のマクロを探しやすくするようにできます。
Folderタグはそのフォルダを定義します（必要ではありません）。
FolderタグはCCMタグ、Folderタグを要素として複数持つことができます（１つも無いとフォルダは表示されません＾＾；）。
Folderタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Name | 必須 | フォルダ名を指定します。
ID | -1 | FolderLinkとしてリンクを貼る必要がある場合に0以上のIDを指定しておきます。

#### CCMタグ

CCMタグはコントロールチェンジマクロ（ControlChangeMacro）を定義します。
CCMタグは複数定義する事ができます。 CCMタグはValueタグ、Gateタグ、Memoタグ、Dataタグを要素として持つことができます。
CCMタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
ID | 必須 | マクロIDを指定します。IDは0〜1300の範囲で、重複しないでください。
Name | 必須 | マクロ名を指定します。
Color | #000000 | イベントリスト上の表示色を指定します。
Sync |  | [MIDI機器と状態を合わせる]機能を使う際、この属性を利用します。 未指定・・・何も処理しません。 Last・・・イベントリスト上で、最後のイベントだけを処理します。単独でいつ実行しても効果があるイベントに付けておくと良いでしょう。 LastEachGate・・・Lastはイベント毎の処理ですが、LastEachGateはイベント＆Gate毎に処理します。Gateを音階として利用しているドラムパラメーター変更系イベントで用います。

#### Vauleタグ、Gateタグ

Valueタグ、Gateタグの属性などは同一です。
ValueタグはイベントのValue値の範囲などを定義します。
GateタグはイベントのGate値の範囲などを定義します。
定義しない場合は、Value欄/Gate欄は無効となります。
Valueタグ、GateタグはテーブルのデータとしてEntryタグを複数持つことができます（無くても構いません）。
Valueタグ、Gateタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Default | 0 | デフォルト値を指定します。
Min | 0 | 最小値を指定します。
Max | 127 | 最大値を指定します。
Offset | 0 | 実際にデータを送信する際にプラスする値を指定します。 例えばパンポットは-64から+63の範囲で指定しますが、midi機器に送信する際にはこの値に+64してから送信しないといけません。こうした場合にはOffsetを64に指定します。
Name |  | 値の名前を指定します（あまり画面には出てきません）。
Type |  | 「Key」を指定するとプロパティ画面でキーボードを参照するボタンが出ます。
TableID |  | 共通テーブルを使用する場合にはテーブルIDをここで指定します。

#### Entryタグ

Entryタグはテーブルの１データを定義します。
EntryタグはGateタグやValueタグ、Tableタグの要素として複数定義します。
Entryタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Label | 必須 | 表示するテキストを指定します。
Value | 必須 | 値を指定します。

こうしてテーブルを定義すると、ユーザーは値だけでなく、表から選ぶことができるようになります。

#### Memoタグ

Memoタグは、コントロールチェンジマクロのメモを定義します。
コントロールチェンジイベントのプロパティ画面などで利用されます。
文中に改行を入れたい場合は「\n」と記入してください。

#### Dataタグ

DataタグはMIDI機器にどんな情報を送信するのかを定義します。
Dataタグの内容は、アットマークの付いた命令コマンドと、値（固定値・変動値）を組み合わせて定義します。
例）

    <Data>@NRPN 1AH #GL #VL #NONE</Data>

命令や値はスペースで区切ってください。
「@命令コマンド 値 値 ・・・ @命令コマンド 値 値 ・・・」のようにいくつも定義することができます。
（ただし、実際に処理されるのは同時期ですので、重たい処理をいくつも同時に送信させるのはよくありません。）
命令コマンドの一覧は次の通りです。

構文 | 意味
--- | ---
@PB [HighValue] [LowValue] | ピッチベンドを送信します。
@CP [Value] | チャネルプレッシャーを送信します。
@PKP [Key] [Value] | ポリフォニックキープレッシャーを送信します。
@CC [ControlChangeNumber] [Value] | コントロールチェンジを送信します。
@SYSEX F0H ..... F7H | システムエクスクルーシブを送信します。 [ と ] を使用すると、囲った部分のチェックサムを ] 部分へ自動的に挿入してから送信します。
@RPN [RPN MSB] [RPN LSB] [Data MSB] [Data LSB] | RPNを送信します。
@NRPN [NRPN MSB] [NRPN LSB] [Data MSB] [Data LSB] | NRPNを送信します。

命令コマンドに引き続いて決まった数だけ値を指定する必要があります。
１０進数の固定値を指定するには「1」や「10」のように記入します。
１６進数の固定値を指定するには「1h」や「10H」、「0x20」のように記入します。
固定値だけでなく、変動する値も利用することができます。
変動する値（および特殊な値）一覧は次の通りです。

構文 | 意味
--- | ---
#NONE | 値そのものを持ちません。@RPNの[Data LSB]部分で利用できます。
#VL | Value値の下位7bitを参照します。
#VH | Value値の上位7bitを参照します。
#GL | Gate値の下位7bitを参照します。
#GH | Gate値の上位7bitを参照します。
#CH | チャンネルを元に00H〜0FHまでの値を作ります。
#2CH | チャンネルを元に20H〜2FHまでの値を作ります。
#3CH | チャンネルを元に30H〜3FHまでの値を作ります。
#1RCH | ローランド社の音源マニュアルで「1x」（xはブロックナンバー≒チャンネル）と表記されている部分の値を作ります。
#2RCH | ローランド社の音源マニュアルで「2x」（xはブロックナンバー≒チャンネル）と表記されている部分の値を作ります。
#4RCH | ローランド社の音源マニュアルで「4x」（xはブロックナンバー≒チャンネル）と表記されている部分の値を作ります。
#VF1 | Value値の1〜4bitを元に00H〜0FHまでの値を作ります。
#VF2 | Value値の5〜8bitを元に00H〜0FHまでの値を作ります。
#VF3 | Value値の9〜12bitを元に00H〜0FHまでの値を作ります。
#VF4 | Value値の13〜16bitを元に00H〜0FHまでの値を作ります。

他にも必要な値がある場合は、使い道を添えて要望を出してください。

#### CCMLinkタグ

CCMLinkタグは、他のCCMタグと内容がほぼ同じで、ValueやGateのデフォルト値だけ変えてその位置に配置したいときに利用します。
（SC-8850の場合は、EFXマクロで多用しています。）
CCMLinkタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
ID | 必須 | リンク先のマクロIDを指定します。
Value |  | Valueのデフォルト値を変えたい場合に指定します。
Gate |  | Gateのデフォルト値を変えたい場合に指定します。

#### FolderLinkタグ

FolderLinkタグは、他ののフォルダと内容がほぼ同じで、ValueやGateのデフォルト値だけ変えてその位置に配置したいときに利用します。
（SD-80等のようなMFXが複数系統ある機種で利用されます。）
FolderLinkタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Name | 必須 | フォルダ名を指定します。リンク先と同じである必要はありません。
ID | 必須 | リンク先のFolderのIDを指定します。
Value |  | Valueのデフォルト値を変えたい場合に指定します。
Gate |  | Gateのデフォルト値を変えたい場合に指定します。

#### Tableタグ

通常テーブルは、ValueタグやGateタグの要素としてEntryタグを用いて定義しますが、 共通テーブルとしてテーブルを定義しておくと、同じテーブルを複数のマクロで使い回すことができます。
TableタグはControlChangeMacroListタグの直下もしくはFolderタグの直下で定義できます。
Tableタグは複数のEntryタグを要素に持つことができます。
Tableタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
ID | 必須 | テーブルIDを指定します。0以上を指定し、重複してはいけません。

### テンプレート情報

テンプレート機能は、CCイベントなどを複数まとめて１テンプレートとして定義しておき、ユーザーによって挿入ができる機能です。
そうしたテンプレートを情報をここで定義します。
例）

    <Template ID="0" Name="トラック初期化">
    	<Memo>トラック初期化用テンプレートです。</Memo>
    	<CC ID="7" Value="100" />
    	<CC ID="10" Value="0" />
    	<PC Mode="Auto" />
    	<CC ID="91" Value="40" />
    	<CC ID="93" Value="0" />
    	<CC ID="94" Value="0" />
    	<CC ID="74" Value="0" />
    	<CC ID="71" Value="0" />
    	<CC ID="130" Value="0" />
    	<CC ID="11" Value="127" />
    	<CC ID="76" Value="0" />
    	<CC ID="77" Value="0" />
    	<CC ID="78" Value="0" />
    </Template>

#### Folderタグ

各Templateタグは、自由にフォルダを作成でき、その中へ入れることができます。
こうすることにより、ユーザーが目的のテンプレートを探しやすくするようにできます。
Folderタグはそのフォルダを定義します（必要ではありません）。
Folderタグは複数のTemplateタグを要素として持つことができます（１つも無いとフォルダは表示されません＾＾；）。
Folderタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Name | 必須 | フォルダ名を指定します。

#### Templateタグ

要素としてMemoタグ、CCタグ、PCタグ、Commentタグを持つことができます。
これによって、テンプレートにどんなイベントを含めるかを指示します。
Folderタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
ID |  | テンプレートIDを指定します。0以上を指定してください。デフォルトデータから参照する際に使用します。
Name | 必須 | テンプレート名を指定します。

#### Memoタグ

テンプレートのメモ（説明）を記入します。
メモは[テンプレート]画面で表示されます。

#### CCタグ

コントロールチェンジイベントの挿入を指示します。
CCタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
ID | 必須 | マクロIDを指定します。
Value |  | Valueのデフォルト値を変えたい場合に指定します。
Gate |  | Gateのデフォルト値を変えたい場合に指定します。

#### PCタグ

プログラムチェンジイベントの挿入を指示します。
PCタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
PC | 1 | PC番号を1〜128の範囲で指定します。
MSB |  | Bank Select MSB値を指定します。
LSB |  | Bank Select LSB値を指定します。
Mode |  | Drumset・・・ドラムセットの音色モードということを指定します。 Auto・・・トラックの種類が「リズム」になっている場合はドラムセットの音色モードにします。

#### Commentタグ

コメントイベントの挿入を指示します。 Commentタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Text |  | コメントデータを指定します。

### デフォルトデータ情報

デフォルトデータとは、Dominoを起動した時や新規作成した際に、あらかじめ用意されているデータの事です。
このデータを定義する事ができます。
例）

    <Mark Meas="2" Name="Start" />
    <Track Mode="Conductor">
    	<Tempo Tick="0" Tempo="120.0" />
    	<EOT Tick="1920" />
    </Track>
    <Track Name="Setup" Ch="1">
    	<CC Tick="0" ID="200" />
    	<CC Tick="240" ID="201" />
    	<EOT Tick="1920" />
    </Track>
    <Track Ch="1" Current="1">
    	<Template ID="0" Tick="480" />
    	<EOT Tick="1920" />
    </Track>
    （省略）
    <Track Name="Rhythm" Ch="10" Mode="Rhythm">
    	<Template ID="0" Tick="480" />
    	<EOT Tick="1920" />
    </Track>
    （省略）

#### Markタグ

Markタグはデフォルトのマーク情報を定義します。
Markタグは複数定義することができます。
Markタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Meas | 必須 | マークする小節を指定します。1以上を指定してください。
Name |  | マーク名を指定します。

#### Trackタグ

Trackタグは１つのトラック情報を定義します。
（実際は、置かれている順番どおりにトラックが作成されます。）
要素としてCCタグ、PCタグ、Commentタグ、Templateタグ、EOTタグを持つことができます。
これによって、トラックにどんなイベントを含めるかを指示します。
Trackタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Name |  | トラック名を指定します。
Ch | 1 | チャンネル番号を指定します。1〜16の範囲で指定してください。
Mode |  | 「Conductor」を指定すると、コンダクタートラックになります（１つのみ指定可能）。 「Rhythm」を指定すると、リズムトラックとして扱われます。

#### CCタグ

コントロールチェンジイベントの挿入を指示します。
CCタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
ID | 必須 | マクロIDを指定します。
Value |  | Valueのデフォルト値を変えたい場合に指定します。
Gate |  | Gateのデフォルト値を変えたい場合に指定します。
Tick |  | 挿入する絶対Tickを指定します。無い場合は最後の指定されたStep値によって自動的に配置されます。
Step |  | このイベント以降の配置間隔を指定します。

#### PCタグ

プログラムチェンジイベントの挿入を指示します。

属性 | 省略時 | 意味
--- | --- | ---
PC | 1 | PC番号を1〜128の範囲で指定します。
MSB |  | Bank Select MSB値を指定します。
LSB |  | Bank Select LSB値を指定します。
Mode |  | Drumset・・・ドラムセットの音色モードということを指定します。 Auto・・・トラックの種類が「リズム」になっている場合はドラムセットの音色モードにします。
Tick |  | 挿入する絶対Tickを指定します。無い場合は最後の指定されたStep値によって自動的に配置されます。
Step |  | このイベント以降の配置間隔を指定します。

#### Commentタグ

コメントイベントの挿入を指示します。 Commentタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Text |  | コメントデータを指定します。
Tick |  | 挿入する絶対Tickを指定します。無い場合は最後の指定されたStep値によって自動的に配置されます。
Step |  | このイベント以降の配置間隔を指定します。

#### Templateタグ

定義済みのテンプレートを利用してイベントの挿入を指示します。
定義ファイルのサイズ節約（＝メモリ節約）にもなります。
Templateタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
ID |  | 参照するテンプレートIDを指定します。
Tick |  | 挿入する絶対Tickを指定します。無い場合は最後の指定されたStep値によって自動的に配置されます。
Step |  | このイベント以降の配置間隔を指定します。

#### EOTタグ

End of Trackの位置を指示します（無ければ自動的に追加されます）。
EOTタグの属性は以下の通りです。

属性 | 省略時 | 意味
--- | --- | ---
Tick |  | 挿入する絶対Tickを指定します。