Open5

Impulse Trackerの仕様を調べる会

okuokuokuoku

一応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つのみで、ピンポンループ有。

okuokuokuoku

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間隔が導出される。

https://github.com/halfbyte/ct2/blob/27f4c6ac3b710eb53d775043d1f11b4f470578fa/src/tinymod.cpp#L91-L92

https://github.com/halfbyte/ct2/blob/27f4c6ac3b710eb53d775043d1f11b4f470578fa/src/tinymod.cpp#L377-L380

例えばtinymod.cppでは 1 tick あたりのサンプル数(TickRate)を上記の式で導出している。

okuokuokuoku

インストゥルメント

XMやITの特徴的な機能はインストゥルメントの採用にある。ITのインストゥルメントは固定長で、以下のような機能を持つ:

  • ノートのマッピング (音程により異なるサンプルを採用する)
  • ピッチ/フィルタ、パン、ボリュームの3つのエンベロープ
  • (エンベロープの) ループ、サスティンループ

DLS Level1等のハードウェア想定のフォーマットと比べると、エンベロープのポイントを最大12点設定できるのは強力と言える。

ループは設定点の単位で指定する(線分の途中でループすることはできない)。

okuokuokuoku

サンプル

ITはMOD等に比べて順当な拡張を行っている。

  • ループおよびサスティンループ
  • ビブラート機能(sine、square、ramp down、ランダム)

ビブラートがサンプラー側に入っているのが特徴的な気もする。