よもやもダンプ

音楽、サッカー、プログラムなどをだらだらと。

GoatTrackerのコマンド・パラメータまとめ

分かりづらかったところを補足しながら日本語でメモしてみる。
Google先生に頼ったりしたので、ところどころ日本語があやしいかも…
詳しい内容はreadmeや早見表を参照してください。


  • $のついている数字は16進表記、それ以外は10進表記。
  • 斜体のアルファベットは16進表記の任意の数。
  • tickとフレームは同義。
  • ノートは音符またはその高さのこと。
  • キーオンとゲートオン、キーオフとゲートオフは同義。

全般

GoatTrackerの曲データ(.sng)はサブチューン、チャンネルごとのオーダリスト、パターン、パターンステップ、tickの単位に分けられ、音色データのインストゥルメントデータ、波形・フィルタなどを制御する各種テーブルデータが存在する。

テンポ指定で決めたtick数をひとまとまりにしたものがパターンステップ、そのステップの列がパターンとなる。
パターンは演奏する順番にチャンネルごとのオーダリストに登録する。
さらに、1-3チャンネルのオーダリストで1つのサブチューンを構成し、複数のサブチューンを作ることができる。

なお、パターン/インストゥルメント/各テーブルは曲データ中共通である。

  • ステップはパターンエディタの行のこと。
  • 入力データの数値はすべて16進数。

主なキーコマンドについては以前のまとめを参照。

rerrahkr.hatenablog.com

オーダリストデータ

サブチューンは最大32個($00-$1F)まで登録できる。
サブチューンごとに3チャンネルのオーダリストが存在し、それぞれ演奏する順にパターンの番号を登録する。
パターン指定以外にトランスポーズ/リピートコマンドも登録できる。リストの最後尾にはリスタート・エンドマークが付く。
オーダリストにはパターンまたはコマンドを合計最大254個まで登録できる。
カーソルのあるパターン/コマンドの、そのチャンネルのオーダリスト中での位置はPOSで確認できる。

コマンド 説明 パラメータ範囲
+X トランスポーズ・アップ。以後のパターン列を半音単位でX回分上げる方向に移調する。 $0-$E(0-14)
-X トランスポーズ・ダウン。以後のパターン列を半音単位でX回分下げる方向に移調する。 $0-$F(0-15)
RX リピート。直後のパターンをX回繰り返す。ただし、R0のときは16回繰り返す。 $1-$F(1-15), $0(16)
RSTXY リスタート・エンドマーク。演奏位置がリストの最後尾に到達後、そのチャンネルのオーダリストのXY番目(POSXY)パターン/コマンドにジャンプする。 $00-$FD
  • リスタート・エンドマークの直前は必ずパターンを登録しておかなければならない。
  • トランスポーズ(移調)効果は演奏開始時のみリセットされる。よって、ジャンプごとにトランスポーズ効果をリセットするにはジャンプ先にトランスポーズコマンドを挿入すればよい。
  • あるパターン番号の前にトランスポーズコマンドとリピートコマンドが連続して並ぶ場合、トランスポーズが先に行われる。

パターンデータ

音符・休符、インストゥルメント変更やコマンドを時系列に登録する。
1パターンに最大128行登録できる。
パターンは1つの曲データ中に208個まで($00-$3F)作れる。

ステップ表記

行(ステップ)は以下のように表される。

f:id:RerrahKR:20170801233145p:plain

パターンで使用できる最高音はG#7。A7-B7を使うにはトランスポーズを使用する。 また、以下の特殊なノートを記述できる。

表示 効果
・・・ 休符
- - - キーオフ(ゲートビットマスクをクリア)
+ + + キーオン(ゲートビットマスクをセット)

ただし、音色がWavetableで明示的にキーオフされたときは、+++(キーオン)を無視する。

パターンコマンド

コマンドとデータバイトで様々な効果の指定が行える。

コマンド 効果
000 何もしない。
1XY ポルタメント・アップ。XYはSpeedtable内の参照するポルタメントデータの位置。
2XY ポルタメント・ダウン。XYはSpeedtable内の参照するポルタメントデータの位置。
3XY トーン・ポルタメント。ターゲットにしたノートの音の高さに達する方向へポルタメントを行う。目標の音の高さに到達した場合は無視される。XYはSpeedtable内の参照するポルタメントデータの位置。$00のとき、タイになる(即座にピッチが変わる)。
4XY ビブラート。XYはSpeedtable内の参照するビブラートデータの位置。
5XY エンベロープのアタック/ディケイ指定。データをアタック/ディケイレジスタにセットする。(値についてはインストゥルメントデータのAttack/Decayを参照)
6XY エンベロープのサスティン/リリース指定。データをサスティン/リリースレジスタにセットする。(値についてはインストゥルメントデータのSustain/Releaseを参照)
7XY 波形指定。データを波形レジスタにセットする。ただし、Wavetableでの波形変更を同時に行った場合、このコマンドは無視される。(値についてはテーブルデータのWavetableを参照)
8XY Wavetable参照(ポインタセット)。XYは参照位置。$00のときWavetableの実行を停止する。
9XY Pulsetable参照(ポインタセット)。XYは参照位置。$00のときPulsetableの実行を停止する。
AXY Filtertable参照(ポインタセット)。XYは参照位置。$00のときFiltertableの実行を停止する。
BXY フィルタ制御。$00でフィルタを切り、初期化。(それ以外の値についてはテーブルデータのFiltertableを参照)
CXY フィルタのカットオフ指定。実行中のFiltertableでカットオフ指定を行っている場合、このコマンドは無視される。(値についてはテーブルデータのFiltertableを参照)
D0Y マスターボリューム指定。Yはマスターボリュームの音量。デフォルトは最大値($F)。
EXY ファンクテンポ。パターンの偶数行と奇数行でテンポを変える(ステップ中のtick数を変える)。XYはSpeedtable内の参照するファンクテンポデータの位置。
FXY テンポ設定。$03-$7Fで全チャンネルに設定。$83-$FFで宣言したチャンネルのみに設定(実際のテンポの値は$80で引いたもの)。$00-$01は以前に宣言したEXY(ファンクテンポ)を再呼び出しする。

ポルタメント/ビブラートコマンドはそのステップでのみ有効になるので、持続させるにはそのコマンド以降も羅列する。

トーン・ポルタメントは、変化させるステップ列の先頭で変化目標となるノートの音の高さ(音名とオクターブ)を指定しておく。

  • ビブラート/ポルタメントコマンドは、途中で5XY-FXYのコマンドを挟んでいても続けて実行される。ただし、000コマンドのときは直ちに停止する。
    例) f:id:RerrahKR:20170801151214p:plain

インストゥルメントデータ

1つの曲データ中に63個のインストゥルメントデータを登録できる。

エンベロープはAttack,Decay,Sustain,Releaseの4パラメータ(ADSR)で指定する。

f:id:RerrahKR:20170730165337p:plain

パラメータ 説明
Attack/Decay 左側の数(上位4bit)がアタック、右側の数(下位4bit)がディケイ。ともに$0が最速。
Sustain/Release 左側の数(上位4bit)がサスティン、右側の数(下位4bit)がリリース。サスティンは$0が最小。リリースは$0が最速。
Wavetable Pos Wavetableの実行する最初の位置を指定。$00で実行停止。
Pulsetable Pos Pulsetableの実行する最初の位置を指定。$00で現在実行中のPulsetableを続けて実行する。
Filtertable Pos Filtertableの実行する最初の位置を指定。$00で現在実行中のFiltertableを続けて実行する。
Vibrato Param このインストゥルメントで使用するSpeedtable内の参照するビブラートデータの位置を指定。
Vibrato Delay 設定したtick数経過後にビブラートを開始する。$00でこのインストゥルメントのビブラートを切る。
HR/Gate Timer ノートを開始する前にその情報を呼び出し、現在鳴らしている音をゲートオフし、ハードリスタートするまでのtick数を指定(要するにゲートオフ指定)。最大でも現在のテンポ-1までしか設定できない。$80でハードリスタートを行わず、$40でゲートオフを行わない。
1stFrame Wave ノートの最初のフレームで使用される波形。通常は$09(ゲートビット+テストビット)。波形を変更せずにゲートオフするときは$FE、ゲートオンするときは$FF、ゲートを変えないときは$00を指定する。(その他の値についてはテーブルデータのWavetableを参照)
  • レガートさせるためにはHR/Gate Timerを$40にし、1stFrame Waveを$FFにすればよい。ただし、Wave/Pulse/Filtertableのポインタ参照やエンベロープ(ADSR)の初期化は行われる。同様のことは8XYコマンドを使っても実現可能。

テーブルデー

インストゥルメントの波形やアルペジオ、パルスモジュレーション、フィルタモジュレーションの実行を制御する。

パルス/フィルタモジュレーション効果は変調時間と変調速度で指定する。
変調時間は変調を実行する時間で、変調速度は1フレームに変調させる量。
変調時間が長いほど、または変調速度が大きいほど、大きく変調する。

  • パルス/フィルタモジュレーションの変調速度は正負の数で指定する。
    上昇方向が$01(1)→$7F(127)、下降方向は$FF(-1)→$80(-128)となる。

Wavetable

波形を指定する。発音するノートの指定もでき、アルペジオなどに使用する。

  • 左側の列の値
パラメータ 説明
$00 波形を変えない。
$01-$0F この行の実行を1-15フレーム遅らせる(ディレイ)。
$10-$DF 波形の値。詳しくは後述。
$E0-$EF $00-$0Fの指定した波形を消音する。
$F0-$FE 0XY-EXYのパターンコマンドを使用する。右側の列の値はパラメータ。ただし、0XY,8XY,EXYは使うべきでない。(コマンドについてはパターンデータのコマンドとデータバイトを参照)
$FF 右側の列の値の示す行へジャンプする。$00でジャンプせず、Wavetableの実行を終了する。
  • 右側の列の値
パラメータ 説明
$00-$5F 正の相対表記のノート(基準音より高い音)。
$60-$7F 負の相対表記のノート(基準音より低い音)。
$80 周波数を変えない。
$81-$DF C#0-B7の絶対表記

ノートの絶対/相対表記やアルペジオでのコードは付属の早見表をみるとわかりやすい。

SIDは三角波、ノコギリ波、パルス波、ノイズを発音することができ、ノイズ以外は波形を組み合わせることができる(ただし、音源によって効果が変わる)。また、オシレータシンク、リングモジュレーション機能が使える。

説明
$00 ゲートオフ(ゲートビットクリア)。
$01 ゲートオン(ゲートビットセット)。
$02 オシレータシンク。他のチャンネルの音をこの音と同期(シンク)させる。
$04 リングモジュレーション。他のチャンネルの音にこの音を掛け合わせる。波形に三角波を使うと最も強く効果が現れる。
$08 テストビット。消音してオシレータをリセットする。
$10 三角波
$20 ノコギリ波
$40 パルス波
$80 ノイズ

波形の値は上の表の値を足し合わせて定義する。
例えば$61はノコギリ波+パルス波をゲートオン、といったようになる。

オシレータシンクやリングモジュレーションは、

  • チャンネル1で使うとチャンネル3の音色を
  • チャンネル2で使うとチャンネル1の音色を
  • チャンネル3で使うとチャンネル2の音色を

変調させる。

  • ディレイ($01-$0F)や波形の切り替えをしない($00)コマンドはインストゥルメントのWavetable初期実行位置にセットすると音飛びの可能性があり避けるべき。ただし、パターンから8XYコマンドでジャンプさせてくる場合はOK。
    またこれらのコマンドで音の周波数を変更しなかったとき、同時にリアルタイムコマンドやインストゥルメントのビブラートが実行されてラスタタイムを多く使ってしまうことがある。
  • Wavetable内でパターンコマンドを使用した場合、同じフレームで波形やノートを変えることはできない。

Pulsetable

パルス波の設定をする。

左側の列の値 説明
$01-$7F パルス幅変調。左側の列で変調時間を、右側の列で変調速度を設定する。
$8X-$FX パルス幅を指定。左側の列のXと右側の列の計12bitを使って幅を指定する。
FF 右側の列の値の示す行へジャンプする。$00でジャンプせず、Pulsetableの実行を終了する。

Filtertable

フィルタの設定をする。

左側の列の値 説明
$00 カットオフ。右側の列でカットオフの位置を指定。
$01-$7F フィルタモジュレーション。左側の列で変調時間、右側の列で変調速度を設定する。
$80-$F0 フィルタパラメータ指定。詳しくは後述。
$FF 右側の列の値の示す行へジャンプする。$00でジャンプせず、Pulsetableの実行を終了する。

フィルタのパラメータをセット($80-$F0)した直後にカットオフ($00)を設定した場合、これらは同じフレームで実行される。

フィルタパラメータはフィルタモード(左列8bit)、レゾナンス(右列上位4bit)とチャンネルビットマスク(右列下位4bit)で構成される。

フィルタモード 説明
$80 なし(消音)
$90 ローパス
$A0 バンドパス
$B0 ローパス&バンドパス
$C0 ハイパス
$D0 ローパス&ハイパス
$E0 バンドパス&ハイパス
$F0 すべて

レゾナンスは$0が最小、$Fが最大。

チャンネルビットマスク フィルタ有効チャンネル
$0 なし
$1 1
$2 2
$3 1,2
$4 3
$5 1,3
$6 2,3
$7 1,2,3(全チャンネル)
  • フィルタを切って値を初期化するには$80 00と指定すればよい。これはB00コマンドでも実現できる。

Speedtable

ビブラート、ポルタメント、ファンクテンポのデータを指定する。

  • ビブラート - 左側の列でビブラートの変化方向が切り替わるまでの時間(スピード)、右側の列で1tickで変化させるピッチ(深さ:デプス)を指定する。
  • ポルタメント - 両側の列を使って1tickで変化させるピッチ量(音程)を指定する。
  • ファンクテンポ - パターンの偶数行と奇数行でそれぞれ異なるテンポを設定する(ステップ中のtick数を変える)。左側の列で偶数行の、右側の列で奇数行のテンポを指定する。

ビブラートやポルタメントでは左側の列のMSB(最大ビット)が立っているとき、ノート非依存のビブラートデプス/ポルタメントスピード(変化量)計算をして実行する。この時右側の列は「除数」の右ビットシフトする回数を指定する($00のとき除数は1、$04のとき16)。ビブラートデプスやポルタメントスピードは最大変化量をこの除数で割った量になる。(除数が大きくなると変化量は小さくなり、より多くのラスタタイムを消費する。)

  • ビブラートではスピードが左側の列の値から$80で引いたものとなり、デプスは右側の列だけ左シフトした除数で最大デプス量を割ったものになる。
  • ポルタメントでは左側の列は$80で、1tickで変化させるピッチ量が右側の列だけ左シフトした除数で最大デプス量を割ったものになる。

その他

ノート発音時のtick単位での処理の順序

各パターン列はテンポ/ファンクテンポコマンドで指定した、50Hz(PAL)/60Hz(NTSC)のtick数で行(ステップ)に分割されている。
いくつかのtickは特別な動作に充てられ、ラスタタイムを節約するため、Pulsetableやビブラート、ポルタメントの実行がスキップされる。

例として、テンポが6、ゲートオフタイマが2のときのtick単位での処理の順序は、以下の表のようになる。

tick 動作
0 新しいノートの初期化(この時点では発音しない)。
必要であればオーダリストを進める。
オーダリストを進めないときのみPulsetableを実行する。
Wavetableを実行する。
パターンコマンド5XY-FXYを実行する。
1 新しいノートを発音する。
Pulsetableを実行する。
Wavetableまたはパターンコマンド1XY-4XYを実行する。
2,3 Pulsetableを実行する。
Wavetableまたはパターンコマンド1XY-4XYを実行する。
4 パターンから新しいノートを取り出す。
ゲートオフし、ハードリスタートする。(次のノートの最初のフレームから2tick前:ゲートオフタイマが示す値)
Pulsetableは実行しない。
Wavetableまたはパターンコマンド1XY-4XYを実行する。
5 Pulsetableを実行する。
Wavetableまたはパターンコマンド1XY-4XYを実行する。

Filtertableはチャンネルの動作にかかわらず毎tick実行される。
Wavetableはスキップされないので、アルペジオやドラムの音色はいつも再生されるはず。

曲データを小さくする

  • コマンドの変更が少ないほどパターンのメモリ消費量は小さくなる。例えば長いビブラートやポルタメントコマンドで同じパラメータを使い続ける時は、1つのデータを参照し続けるようにすればよい。
  • インストゥルメントのビブラートを使えば4XYコマンドを使わなくて済み、メモリ消費も抑えられる。ノートにかかわらず同じ大きさでビブラートをかけるには、リアルタイムで計算されたノート非依存ビブラートデプスを使う(テーブルデータのSpeedtableを参照)。
  • パルス波を使用しないときにパルスモジュレーションをかけるのはラスタタイムの無駄遣いとなる。Pulsetableの実行を止めるには、パターン中に900コマンドを追加するか、 Pulsetableに以下のプログラムを追加し、それを実行させる。
    f:id:RerrahKR:20170801151024p:plain

  • 通常はテンポ3が最速となるが、ファンクテンポを使えばテンポ2を使用することができる。Speedtableにファンクテンポデータ$02 02を設定し、これをパターンに適用すればよい。ただしこのとき、全てのインストゥルメントのゲートオフタイマを1に設定し、(コマンドラインオプションで)パルス最適化スキップを無効にする必要がある。

  • 非常に最適化された曲データを作るには、パターンコマンドを使用せず、インストゥルメントで使用する各テーブル中で実現するようにする。
    63番目($3F)のインストゥルメントを使用しないのならば、そのAttack/Decayパラメータでデフォルトのテンポ設定を行うこともできる。

リミット基準のモジュレーション

パルス/フィルタモジュレーションはリミット基準で入力することができ、Shift+Lを押して時間基準の値に変換することができる。

例) Pulsetableの場合
f:id:RerrahKR:20170801151443p:plain

旧指定方法でのノート非依存ポルタメント/ビブラート

リアルタイムで計算するノート非依存ポルタメント/ビブラートを使用すると、プレーヤが重くなり遅くなる。このとき、Shift+Hを用いて、変化を事前に計算しておく旧方法のノート非依存ポルタメント/ビブラートが使用するのも手の1つ。
これは周波数テーブル中の隣り合う2つのノートの周波数差をとり、それを左ビットシフト(乗算)や右ビットシフト(除算)して処理をする。

使用するには、パターン中にポルタメントやビブラートコマンドが必要で、パターンの現在のステップ(テンポポルタメントのみその直前)に計算の基準となるノートが必要となる。シフト回数はコマンドのパラメータによって決まる。上位4bitは左シフトの回数で下位4bitは右シフトの回数である。カーソルがコマンド上にあるときShift+Hを押すと、Speedtableに新しいデータが登録され、コマンドのパラメータがそのデータの位置に書き換わる。

例)
f:id:RerrahKR:20170801151753p:plain

マルチスピード

  • マルチスピード機能を使えば、曲を通常のn倍の速度で再生することができ、より細かなステップを用いた曲作りができる。なお、最速は16倍で25Hzが最も遅い。
  • マルチスピードを用いる時は、テンポとゲートオフタイマーの値はスピードで掛けたものを考える必要がある。
    たとえば、通常でゲートオフタイマーが2ならば、2倍速のときの同じ長さは4となる。
  • n倍速再生時にビブラートを1倍速のときと同じ効果にするときは、ビブラートスピードをn倍してビブラートデプスを1/n倍する。必要であれば、ポルタメントやパルス/フィルタモジュレーションのスピードも1/n倍にしておく。
  • インストゥルメントにおいて、アタックを0にするとWavetableの最初の行の発音がとても小さくなることがある。このときは、アタックの値を大きくしたり、Wavetableのはじめに$E9 00(テストビット+ゲートオン)を挿入したりすればよい。