Specこの広告は、90日以上更新していないブログに表示しています。though).ドラゴンクエスト6とドラゴンクエスト3の音楽フォーマットのコマンドについて書き記しておきます。Specに記した任天堂標準フォーマットの変種です。いえ、その構造やコマンドは結構大幅に異なっているので、同一のフォーマットとして取り扱うのはあまり賢明ではありません。ドキュメント内容の転載等は自由です。...めんどくさがって疑似アセンブリの内容が幾分適当ですが......非常にシンプルで、かつまとまった構造をしています。ARAM上の絶対アドレスで位置を表現するフォーマットは多いですが、このエンジンでは、最初の楽曲位置はさておき、それ以降のシーケンスデータに関してはすべて「オフセット」で場所を示します。私が見た限り、曲へのポインタは上位バイトと下位バイトが少し離れた位置にありました。細かいことは、拙作のhbdqspcを通して生のデータと向き合えば、それなりにわかるのではないかと思います。Trackチャンネルの演奏データの終端を意味します。(0-15).コマンドバイト自身で音の長さを表します。通常24が四分音符に相当します。続くバイト($xyとする)が$80未満であればそれも処理します。xで音の長さ(クオンタイズ)、yで音の大きさを段階的に指定します。数値に対応してどのような比率が割り当てられているのかは、中のテーブルの値によります。このコマンドの効果は(細かいパラメータの違いは除いて)任天堂エンジンと同じです。デュレーションとベロシティのテーブルを以下に示します。cf音程を伴って音符を意味します。長さや強さは$01-7fで設定します。Offスラーの有効・無効を設定します。再発音することなく、音程のみ変更して音を鳴らす場合に使用します。it.)音色を設定します。実際に音源に設定されるSRCNやADSRの情報はテーブルに収められていて、このコマンドで指定するのはそのテーブルのインデックスです。UnknownDQ6とDQ3でコードが違ったかもしれません。nopのようにも見えますが、なぜかサイズテーブルには長さが7だと書かれています。本家BGM中には出現しません。(0-20).音の左右位置を設定します。値の範囲は0〜20と狭いです(実際の設定比率は内部テーブル定義)。10を中心として、値が小さくなるにつれ左、大きくなるにつれ右に音が移動します。$09でそれを決定します。20?)音の位置をxx時間かけて現在の値からyyへとフェード。depth.ビブラート(音程の揺れ)を有効にします。発音からxx時間後に、yyの早さでzzの大きさのビブラートがかかるよう設定します。value.ビブラートの深さを一時的に0に設定したのち、xx時間かけて滑らかに元の値へと変化させて演奏するよう設定します。Offビブラートを無効にします。Depthを0にしています。[xx]楽曲全体の音量をxxに設定します。初期値は最大値より幾分低い。destination.楽曲全体の音量をxx時間かけて現在の値からyyへとフェード。256楽曲の演奏速度を指定します。bpmを12240000/60000000した値で指定します。[xx]不明なイベントです。本家BGM中には出現しません。(signed)全チャンネルの演奏音程をxx上げます(負数も指定可)。(signed)単一チャンネルの演奏音程をxx上げます(負数も指定可)。depth.トレモロ(音量の揺れ)を有効にします。発音からxx時間後に、yyの早さでzzの大きさのトレモロがかかるよう設定します。Offトレモロを無効にします。destination.チャンネルの音量を設定。yy]チャンネルの音量をxx時間かけて現在の値からyyへとフェード。zz]不明なイベントです。本家BGM中には出現しません。ticks.以降の音が「xx時間後にyy時間かけてzzだけ高くなる」ように指定します。zzは半音単位で、負数も指定できます。ticks.以降の音が「通常よりzz高い音程で発音、xx時間後にyy時間かけて通常の音程に戻る」ように指定します。zzは半音単位で、負数も指定できます。Envelopeの効果を無効にします。higher.音程をわずかに変化させます。指定できる値は正の数のみなので、音程を下げることはできません。(EVOL(R)).エコーを有効にするチャンネルと音量を指定します。レジスタに設定される値そのままです。0..3).エコーの詳細を設定します。xxとyyはレジスタの値そのまま、zzはFIRフィルタの種類で、0〜3の範囲で指定します。zz]不明なイベントです。本家BGM中には出現しません。Onチャンネルのエコーを有効・無効にします。C7]FIRフィルタの係数を直接指定します。ADSR(2)]ADSRレジスタの内容を直接指定します。$01-7fデュレーション・ベロシティの設定をします。$01-7fの2番目の引数の処理をコマンドとして独立させたものです。通常$80以上は指定しません。sequence指定位置に無条件ジャンプします。位置はシーケンスのヘッダからの相対的なオフセットで指定します。ループに用いられます。$f4指定位置にサブルーチンジャンプします。$f2と違い、$f4で呼び出し位置に戻ります。特定フレーズを使い回すのに用いられます。サブルーチンのネストは許されません。Subroutine$f3によるサブルーチンジャンプから復帰します。OffSPC700のノイズを有効・無効にします。クロックは$f7で設定します。[NCK]ノイズのクロックを設定します。引数はNCKの値なので、$00-1fで指定します。Unknown不明なイベントです。本家BGM中には出現しません。Undefined処理テーブルの範囲外です。#サブコマンドを実行します。nnの値に応じてさまざまなコマンドを実行します。以下、サブコマンドに関して解説を続けます。nn以前の引数は省略しています。$01サブコマンド$01の条件ジャンプのループ回数を設定します。ループ部突入の直前に記せばよいでしょう。$00.条件ジャンプです。カウンタが0になるまでは、デクリメントとともにジャンプを続けます。カウンタの初期値はサブコマンド$00で指定します。Unknown不明なイベントです。本家BGM中には出現しません。nopっぽく見えます。[xx]ADSRのARを指定します。値の範囲は$00-0fです。[xx]ADSRのDRを指定します。値の範囲は$00-07です。[xx]ADSRのSLを指定します。値の範囲は$00-07です。[xx]デュレーションで設定された長さの発音終了後に設定される、ADSRのSRを指定します。値の範囲は$00-1fです。[xx]デュレーションで設定された長さの発音時に設定される、ADSRのSRを指定します。値の範囲は$00-1fです。on.波形の位相反転の有無を、左右それぞれ設定します。