# 4.3. MIDIマップを作成する

MIDIマップを生成するプログラムは何もないので、（お好みのテキストエディタを使って）手作業でファイルを編集しなければなりません。

MIDIマップは曲の再生時に必要になる翻訳をすべて保管するテキストファイルです。

MIDIマップは`PATCHMAP`、 `KEYMAP`、 `CHANNELMAP` および `OPTIONS`の４つのセクションから構成されています。

これらのセクションはそれぞれ1個しか入れられません。ただし、`KEYMAP` セクションは例外で、必要なだけ入れることができますが、それぞれについて別のTextIDを使わなければなりません（詳しい情報については、以降の説明をお読みください）。

マップファイルの一般的な構造

     DEFINE PATCHMAP
     ...
     END

     DEFINE KEYMAP "Name of Keymap"
     ...
     END

     DEFINE KEYMAP "Another Keymap"
     ...
     END

     DEFINE CHANNELMAP
     ...
     END

     OPTIONS
     ...
     END

`DEFINE`ワードは 起動するセクションを指定するのに使われ（ただし、`OPTIONS`は除く)、`END`はそれぞれのセクションの終わりに入力されているのがお分かりになると思います。

行の先頭に`#` 文字を入れると、コメントを入れることができます。

将来登場するKMidのバージョンに多数の非標準MIDI対応キーボードをサポートする機能が入れられるように、あなたが作ったマップファイルを筆者宛にEメールで送るのをお忘れなく。

## 4.3.1. `PATCHMAP`セクション

このセクションはGM規格からキーボード仕様に対応するように、パッチをマップする方法を指定するのに使います。一般的な使い方を下記に示します。

     (GMパッチ名の名前)=(N) [AllKeysTo M]

`N`はパッチをGM規格に対応するものに変更するためにキーボードが受け取る必要のある数字です。

等号記号の左側は無視され、GMパッチは0から127までの範囲で順番になっていなければならないので、行の順序を変更したり、128個の楽器のどれかを省略することはできない点に注意してください。

オプションの`AllKeysTo M`はその楽器を使用するすべての音符を`M`キーにマップする場合に使います。たとえば、あなたのMIDIキーボードに 銃声(GMパッチ127)が入っていないので、銃声のように聞こえるパーカッションドラム (キー60)にマップしたいという場合は、`PATCHMAP`セクションの127行目に入れることができます:

     Gunshot       =100 AllKeysTo 60

このように設定すれば、MIDIファイルがパッチ127（銃声）の音符を弾こうとするとき、MIDIファイルはパッチ100（キーボードのパーカッションパッチ）にマップされ、（これから演奏するキーとは無関係に）音符60を弾きます。

ここで使用している「パーカッションパッチ」という表現は、一部のキーボードに入っている可能性のある音や、それぞれのキーで同じドラムの異なる音色を演奏する可能性のある音ではなく、それぞれのキーがいろいろなドラム、シンバル、トムトム、マラカスなどを演奏するパッチを指している点に注意してください。

## 4.3.2. `KEYMAP`セクション

`KEYMAP`セクションは所定のチャネルまたは楽器内部でキーのマップの仕方を指定するのに使います。一般的な使い方を下記に示します。

     DEFINE KEYMAP "Name of Keymap"
     C 0 =0
     C#0 =1
     D 0 =2
     ...
     END

`PATCHMAP`セクションの場合と同じように、行の順序が重要で、128キーすべてが入っていなければなりません。

いろいろなチャネルや楽器に対して複数のキーマップを定義できますが、それぞれに異なる名前を1行目に入れなければなりません。

キーマップは主にパーカッションチャネルにキーをマップする場合に使います。サンプルとして、配布されているマップに目を通してください。

## 4.3.3. `CHANNELMAP`セクション

このセクションはいくつかのチャネルを別のチャネルにマップしたい場合に使えます。たとえば、最初のチャネルと2番目のチャネルを入れ替えたいというときは、`CHANNELMAP`セクションの内部で簡単に入れ替えられます。

このセクションは、ある指定したチャネルにパーカッションチャネルを割り当てる必要のあるキーボードに使うともっと便利です (GM規格はチャネル10を使用し、他はチャネル16やチャネル9を使用)。

MIDI機器は16チャネルを使用するので、`CHANNELMAP`セクションは下記に示すように0から15まで16行あります。

     (N) = (M) [Keymap "Name"] [ForcePatch x]

`N`は`M` チャネルにマップするチャネルです。 `Keymap`オプションを使用した場合、このチャネルでは`Name`という名前を持つキーマップが使われます(ただし、このキーマップはマップファイルの中であらかじめ定義しておく必要があります)。 `ForcePatch`オプションを使用すると、このチャネルで使用されるパッチを変更しようとするすべてのイベントは無視され、その代わりに パッチ`x`が使用されます。

`ForcePatch`オプションを使うと便利なのは、たとえばパーカッションチャネルで常にパーカッションパッチを使う場合です。

## 4.3.4. `OPTIONS`セクション

`OPTIONS`セクションには非常に便利な共通オプションがいくつかあります。

     OPTIONS
     PitchBenderRatio = r
     MapExpressionToVolumeEvents
     END

これらのオプショントは両方指定するか、片方だけを指定するか、あるいは何も指定しなくても構いません

`PitchBenderRatio r`値は、ピッチベンダーイベントと掛け合わせる倍数です。つまり、MIDIファイルが、値`n`を持つピッチベンダーイベントを送ろうとしたとき、送信される実際の値は、`n*(r/4096)`となります(値`4096`はマップファイルに小数点を入れなくても済むようにするためのもの)。

この値を使うのは、GM規格では、MIDIキーボードがデータ値4098を持つピッチベンダーイベントを受け取った場合は、高いノートにベンドしなければならないと規定していますが、一部のMIDIキーボードは4096を受信すると、最初のノートを2音以上高いノートにベンドしようとするからです（1オクターブ高くするものさえあります）。この問題は、別の値にすれば簡単に解消します。つまり、4096という値を送る代わりに、KMidは適切な値を送信します。

マップファイルに`MapExpressionToVolumeEvents` オプションを設定すると、MIDIファイルはエクスプレッションイベントを送ろうとし、KMidはGM非対応キーボードが認識し、同じような効果を持つボリュームイベントを送信します。エクスプレッションイベントを使って、曲の終わりをフェードアウトさせるMIDIファイルはたくさんあります。ソフトな音にしたいときは、このオプションをオンにし、思い通りの効果が得られるかどうか確認してください。というのは、MIDIシンセサイザはエクスプレッションイベントを認識しない場合には、それを無視する可能性があるからです。