Impulse Trackerの仕様を調べる会
一応MOD系もサポートするかということで、Impulse Trackerをターゲットにすることを考え中。長年XMだったんだけどまぁ.ITの方が(多分)スーパーセットだし。。
XMはMilky Tracker https://github.com/milkytracker/MilkyTracker がある。フォーマット: https://github.com/milkytracker/MilkyTracker/blob/master/resources/reference/xm-form.txt エンベロープは12点でパンとボリューム。サンプルのループは0〜1つのみで、ピンポンループ有。
情報源
ITTECH.TXT
が原典で、GitHubのWiki形式にしたものが https://github.com/schismtracker/schismtracker/wiki/ITTECH.TXT にある。
さらにOpenMPTやModPlugは専用の拡張を持っている https://wiki.openmpt.org/Development:_Formats/IT 特にOpenMPTは専用の拡張子(.mptm)もあり、テンポswingのような重要な機能を実装している。
Tickとテンポ
Module系統の音楽フォーマットには "tick" の概念があり、全てのパラメーターはtick単位で制御される。Module内の1行は "speed" 個のTickで構成され、1行進むごとにTickはspeedで初期化される。(Speedの値が小さければ小さいほど、曲は高速になる。)
それ以外にもTempoとかBPMといった様々な用語があり、まったく一貫性が無い。ただ、この辺は.modからほぼ拡張されていないため.modの実装を確認するのが簡単な気がする。要するに:
このコマンドは、xx が 20(訳注:16 進表記。以下同様)より小さいときは speed 値の設定を行い、 xx が 20 より大きい時は tempo の設定を行います。 丁度 20 を指定することはできません。なぜなら、丁度 20 を指定すると、 いくつかのプレイヤーが問題を起こすからです。 MOD 形式では、コマンド F20 は、speed 値の設定を行います。 しかし、XM 形式では、コマンド F20 は tempo(bpm)の設定を行います。 いずれも 16 進数表記です。
(訳注:speed 値とは、1 row 当りの tick 数です。 CubicPlayer を解析したところ、古い世代の MOD データでは、speed 値の設定しか出来ず、 1 tick = 1 VSync としていた事がわかりました。 しかしこれでは分解能が足りないという事で、後の世代で tempo の指定が出来るように 拡張し、0x20 を境目に機能を使い分けたようです。)
Default values are 6 ticks/division, and
125 beats/minute (4 divisions = 1 beat). The beats/minute tag is
only meaningful for 6 ticks/division. To get a more accurate view
of how things work, use the following formula:
24 * beats/minute
divisions/minute = -----------------
ticks/division
Hence divisions/minute range from 24.75 to 6120, eg. to get a value
of 2000 divisions/minute use 3 ticks/division and 250 beats/minute.
- デフォルトの "BPM" は
125
(定数) であり、これはファイルのSpeed = 6の時の値となる。 - SpeedとBPMは独立して設定可能である。BPM設定値によって最終的なTick間隔が導出される。
例えばtinymod.cppでは 1 tick あたりのサンプル数(TickRate)を上記の式で導出している。
インストゥルメント
XMやITの特徴的な機能はインストゥルメントの採用にある。ITのインストゥルメントは固定長で、以下のような機能を持つ:
- ノートのマッピング (音程により異なるサンプルを採用する)
- ピッチ/フィルタ、パン、ボリュームの3つのエンベロープ
- (エンベロープの) ループ、サスティンループ
DLS Level1等のハードウェア想定のフォーマットと比べると、エンベロープのポイントを最大12点設定できるのは強力と言える。
ループは設定点の単位で指定する(線分の途中でループすることはできない)。
サンプル
ITはMOD等に比べて順当な拡張を行っている。
- ループおよびサスティンループ
- ビブラート機能(sine、square、ramp down、ランダム)
ビブラートがサンプラー側に入っているのが特徴的な気もする。