;サウンドドライバの仕様書 ###################### # エフェクトの仕様 # ###################### [ボリュームエンベロープ]------------------------------------------------------------------------------------------------------------------- ・通常は4bitごとにボリュームデータを指定する({9,8,7,6} なら $98,$76 という具合)。  1BYTEの中の上位4bitで$0を指定した場合、続く"4bit"でボリュームカウンタを減算する(例:$98,$76,$01 '987666...)。  1BYTEの中の下位4bitで$0を指定した場合、続く"8bit"でボリュームカウンタを減算する(例:$98,$70,$01 '987777...)。  いずれにしても減算する値が0なら、以降ボリュームを0にする(例:$98,$76,$00 '987600...)(例:$98,$70,$00 '987000...)。 ・EV_BORDERLINEで指定した値以上のボリュームインデックスを指定した場合は、ランレングス方式でデータを圧縮する。  上位4bitがボリューム値、下位4bitが持続フレーム数-1になる({9,9,9,9,8,8,7} なら $93,$81,$70 という具合)。  上位4bitで$0を指定した場合は通常のものと同じ。この方式だと、所要クロック数が徐々に増えていってしまう。 ------------------------------------------------------------------------------------------------------------------------------------------- [ノートエンベロープ]----------------------------------------------------------------------------------------------------------------------- ・0〜127の値で鳴らし始めの音程との相対位置を指定(64が0,65は+1,63は-1)し、-128($80)で以降同じ音程を保つ。  -128($80)以外のマイナス値なら、その値をピッチカウンタに加算。 ------------------------------------------------------------------------------------------------------------------------------------------- [ピッチエンベロープ]----------------------------------------------------------------------------------------------------------------------- ・0〜223の値で前回の周波数との上下差を指定(0が0,112は+1,111は-1)し、224($E0)で以降同じ周波数を保つ。  225(-31)以上の値なら、その値をピッチカウンタに加算。 ------------------------------------------------------------------------------------------------------------------------------------------- [ノイズのピッチエンベロープ]--------------------------------------------------------------------------------------------------------------- ・ノイズチャンネルには別にピッチエンベロープが用意されている。  また、ノイズチャンネルでは必ずこのピッチエンベロープを使うことになる。 ・ノイズチャンネルの第2レジスタに入れる値を直接指定し、-112($90)で以降同じ周波数を保つ。  -111以上のマイナス値なら、その値をピッチカウンタに加算。 ------------------------------------------------------------------------------------------------------------------------------------------- [デューティ比エンベロープ]----------------------------------------------------------------------------------------------------------------- ・2bitごとにデューティ比データを指定する({0,1,2,1} なら %00011001 という具合)。  %11を指定した場合、次の1バイトでデューティ比カウンタを減算する(例:%00011011,-2 '0121212...)。  減算する値が0なら、以降同じデューティ比を保つ(例:%00011011,$00 '0122222...)。 ------------------------------------------------------------------------------------------------------------------------------------------- ################ # 共有データ # ################ [デュレーションセット]--------------------------------------------------------------------------------------------------------------------- ・音の長さを指定する際に使うデータ。テンポのフレーム数のN+1倍を指定する。  データを参照する際は、デュレーションインデックスの値を一つ目のオフセットとし、  音を鳴らす(または無音)コードの下位2bitを二つ目のオフセットとする。つまり一つのコードで同時に選べる音の長さは、4種類のみとなっている。 ------------------------------------------------------------------------------------------------------------------------------------------- [音程セット]------------------------------------------------------------------------------------------------------------------------------- ・後述の8音程モードのとき、音程を指定する際に使うデータ。音程の1Aを0として、半音ずつ上がるごとに1足していった場合の値で音程を指定する。  データを参照する際は、音程インデックスの値を一つ目のオフセットとし、  音を鳴らすコードのbit4〜bit6を二つ目のオフセットとする。一つのコードで同時に選べる音の長さは8種類。  32音程モードの場合は音程セットは使わない。 ------------------------------------------------------------------------------------------------------------------------------------------- [DPCM]------------------------------------------------------------------------------------------------------------------------------------- ・DMCで使うDPCMを指定する際に使うデータ。DMCの第三レジスタと第四レジスタの値を指定する。 ------------------------------------------------------------------------------------------------------------------------------------------- ######################## # モード切替スイッチ # ######################## [ENorEV切り替えスイッチ]------------------------------------------------------------------------------------------------------------------- ・8音程モードのとき、Note1のコードでノート(ピッチ)エンベロープとボリュームエンベロープのどちらを使用するかを決めるフラグ。  %0(スイッチOFF)のときはノート(ピッチ)エンベロープ、%1(スイッチON)のときはボリュームエンベロープを使用する。  デフォルトでは%0(スイッチOFF)。  三角波チャンネルでは常にノート(ピッチ)エンベロープを使うので設定不要。ノイズチャンネルでは常に両方指定するので、これも設定不要。 ------------------------------------------------------------------------------------------------------------------------------------------- [音程指定形式切り替えスイッチ]------------------------------------------------------------------------------------------------------------- ・32音程モードと8音程モードのどちらを使用するかを決めるフラグ。  %0(スイッチOFF)のときは32音程モードを使用する。32音程モードでは、Note1のコードでエンベロープは指定できない。  %1(スイッチON)のときは8音程モードを使用する。8音程モードでは、Note1のコードでエンベロープが指定できる。  デフォルトでは%0(スイッチOFF)。  ノイズチャンネルでは音程の指定ができないので設定不要。 ------------------------------------------------------------------------------------------------------------------------------------------- [ENorEP切り替えスイッチ]------------------------------------------------------------------------------------------------------------------- ・ノートエンベロープとピッチエンベロープのどちらを使用するかを決めるフラグ。  %0(スイッチOFF)のときはノートエンベロープ、%1(スイッチON)のときはピッチエンベロープを使用する。  デフォルトでは%0(スイッチOFF)。  ノイズチャンネルでは常にノイズのピッチエンベロープを使うので設定不要。 ------------------------------------------------------------------------------------------------------------------------------------------- ################################ # 利用するメモリの名称と内容 # ################################ ・チャンネルポインタ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 演奏データのプログラムカウンタ。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・デュレーションインデックス''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 使用するデュレーションセットのオフセット(デュレーションは音の長さの事を指す)。 : デュレーションセットは、Note1のコードで指定できる4種類の音の長さのこと。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・デュレーションカウンタ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : これの値が0以外なら、ノートを演奏中。ノートを読むときにデュレーションカウンタの値がセットされる。 : テンポ消費フレームの値が$0F以下になる度に、カウンタの値がデクリメントされ、カウンタが0になるとまた新たにノートを読む。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・クオンタイズステート''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 下位4bitは、クオンタイズの値。最大値は15。クオンタイズのフレーム数はBGM(SE1,2)のテンポの値に由来する。 : クオンタイズの値が10で、テンポが$00(1フレーム)なら、10フレームのクオンタイズになり、 : クオンタイズの値が10で、テンポが$08(1.5フレーム)なら、15フレームのクオンタイズになる。 : 上位4bitは、前回のボリューム値。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・ピッチインデックス''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 使用するノート(ピッチ)エンベロープのインデックス番号。デフォルトは0で、「ノート(ピッチ)エンベロープなし」。最大値は127。 : 最上位bitは無音フラグ。無音フラグは一度ノートが無音になると立ち、以降次のノートまで無音のままになる。 : 上記は処理の機構上必要だが、副次的効果として無音フラグが立ったチャンネルは所要クロック数が下がり、ドライバの処理速度が上がる。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・ピッチカウンタ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 使用するノート(ピッチ)エンベロープの中身を参照するためのオフセット。1フレームごとにインクリメントされる。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・リターンアドレス''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : サブルーチンを使用する際に、現在のチャンネルポインタを覚えておくための変数。 : チャンネルポインタの値が後述のサブルーチンエンドに達したら、 : リターンアドレスの値をチャンネルポインタに入れて、サブルーチンから復帰する。 : サブルーチンは二重にすることができるので、リターンアドレスも二つある。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・サブルーチンエンド''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : サブルーチンを使用する際に、サブルーチンとして読み込む最後のアドレスの次のアドレスを覚えておくための変数。 : リターンアドレス同様、サブルーチンエンドも二つある。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・アウターループアドレス''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 二重にできるループのうち、外側になるループのコードがあるアドレス。 : ループのコードを読む際にアウターループアドレスを確認し、ループカウンタのインクリメントを選り分ける。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・ループカウンタ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : ループを抜けるために、ループ回数を覚えておく変数。 : 上位4bitが内側のループ用、下位4bitが外側のループ用となっている。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・フラグメモリ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : ノイズチャンネル以外では以下のようになっている。 : bit7:ENorEP切り替えスイッチ. bit6:音程指定形式切り替えスイッチ. bit5:ENorEV切り替えスイッチ. : bit4,3,2:ピッチエンベロープ用周波数上位3bit. bit1,0:Note1用エンベロープオフセット。 : : ノイズチャンネルでは以下のようになっている。 : bit7,6,5:未使用. : bit4,3,2:Note1用ボリュームエンベロープオフセット. bit1,0:Note1用ノイズのピッチエンベロープオフセット。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・ボリュームインデックス''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 使用するボリュームエンベロープのインデックス番号。エンベロープデータを設定できるのは$10以降の番号からで、 : $00〜$0Fの番号を指定すると、番号と同じ大きさの一定ボリュームで音を出し続ける。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・ボリュームカウンタ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 使用するボリュームエンベロープの中身を参照するためのオフセット。1フレームごとにインクリメントされる。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・デューティ比インデックス''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 使用するデューティ比エンベロープのインデックス番号。エンベロープデータを設定できるのは$03以降の番号からで、 : $00〜$02の番号を指定すると、番号と同じデューティ比の値で音を出し続ける。 : この変数は、矩形波1,2とSE1にのみ割り当てられている。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・デューティ比カウンタ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 使用するデューティ比エンベロープの中身を参照するためのオフセット。1フレームごとにインクリメントされる。 : この変数は、矩形波1,2とSE1にのみ割り当てられている。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・音程インデックス''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : Note1で音程を指定する際に使う変数。 : この変数は、矩形波1,2と三角波とSE1にのみ割り当てられている。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・前回の音程データ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 通常は前回のノートの音程を記憶しておく(前回とは言っても更新タイミングはノートを読んだ瞬間)。 : ピッチエンベロープ使用時は周波数の下位8bitを記憶しておく(上位3bitはフラグメモリのbit2,3,4)。 : Note2のコードではこの変数を利用するため、ピッチエンベロープ使用時にはNote2は本来の使い方ができないが、 : 変数の値は予測できるので変則的な使い方ができる(利便性はほとんどない)。 : この変数は、矩形波1,2と三角波とSE1にのみ割り当てられている。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・スイープステート''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 矩形波チャンネルで第2レジスタに入れるスイープ設定値。 : デフォルトでは%00001000の値になっている。この値でないとなぜか一定以下の低音が出ない。 : この変数は、矩形波1,2とSE1にのみ割り当てられている。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・デチューンステート''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : ノートで指定された音程の周波数から減算する値。 : ノート(ピッチ)エンベロープを使用してもちゃんと反映される。 : この変数は、矩形波1,2と三角波とSE1にのみ割り当てられている。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・BGM(SE1,2)のテンポ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 実質的には、BGM(SE1,2)の音の長さの最小単位で、曲のテンポを絶対値で指定するものではない。 : デフォルトの値が$10(2フレーム)なら、$00(1フレーム)で二倍の速さになり、$30(4フレーム)で1/2の速さになる。 : 仕様上、$E1以上になるとテンポが乱れるので、事実上の最大値は$E0(15フレーム)となっている。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・BGM(SE1,2)のテンポ消費フレーム''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : このメモリは毎フレーム$10ずつ減算され、値が$0F以下になる度にBGM(SE1,2)のテンポ+$10を加算する。 : BGM(SE1,2)のテンポが$E1以上だと、このメモリがいきなり$0F以下になってテンポが乱れることになる。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・現在鳴らしているSE1(2)の優先度''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 2つ以上のSE1(2)が競合する際に、新しく指定されたSE1(2)が現在鳴っているものをかき消して鳴らされるかを判断するのに使う。 : 指定値は1〜3で、値が大きいほうがより優先度が高い。新しく指定されたSE1(2)の優先度が、現在鳴っているものより大きいか同じ場合に、 : 現在鳴っているものをかき消して鳴らされ、優先度が現在鳴っているものより小さい場合は新しいほうが鳴らされずに終わる。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ###################################### # 演奏データのオペレーションコード # ###################################### ┏━━━━━━┳━━━━━━━━┓ ┃ Opcode ┃ Operands ┃:CodeName ┣━━━━━━╋━━━━━━━━┫ ┣━━━━━━╋━━━━━━━━┫ ┃ $00 to $7F ┃ ┃:Note1 ┠──────┸────────┸──────────────────────────────────────────────────── ┃・ノートを鳴らす。ビット配分%0xxxyyzz。%xxxで音程、%yyでエンベロープオフセット、%zzで音の長さを指定。 ┃ ┃・ノイズチャンネルでは%xxxでEP用エンベロープオフセット、%yyでEV用エンベロープオフセット、%zzで音の長さを指定。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $80 to $8F ┃ ┃:Note2 ┠──────┸────────┸──────────────────────────────────────────────────── ┃・ノートを鳴らす。ビット配分%1000xxxz。 ┃ %xxxで前回の音程との相対位置、%zで音の長さを指定。 ┃ 前回の音程との相対位置は半音ずつ、%000で4つ下、%001で3つ下、%010で2つ下、%011で1つ下、%100で1つ上…%111で4つ上。 ┃ ┃・ノイズチャンネルではDMCを鳴らす。ビット配分%1000xxxx。%xxxxで第1レジスタの下位4bitを指定。 ┃ さらに、1バイトのオペランドが付随し、DPCMインデックス番号を指定する。 ┃ DPCMインデックスの内容は、DMCの第3レジスタと第4レジスタの値。第2レジスタは使わない。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $90 to $9F ┃ ┃:Tie ┠──────┸────────┸──────────────────────────────────────────────────── ┃・ノートや無音の音の長さを伸ばす。ビット配分%1001xxxx。%xxxxで倍率を指定。 ┃・倍率は、%0000で2、%0001で3、...という具合に最大17倍まで指定可能。 ┃・ノートを鳴らすコードまたは無音コードの一つ前に置いて使う。 ┠──────────────────────────────────────────────────────────────────── ┃ ┃ ┣━━━━━━┳━━━━━━━━┓ ┃ $A0 to $AF ┃ ┃:ShiftMScaleIndex ┠──────┸────────┸──────────────────────────────────────────────────── ┃・音程インデックスを変更する。$A0〜$A7が、-8 〜 -1。$A8〜$AFが、+1 〜 +8。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $B0 to $B7 ┃ ┃:ShiftVolumeIndex ┠──────┸────────┸──────────────────────────────────────────────────── ┃・ボリュームインデックスを変更する。$B0〜$B3が、-4 〜 -1。$B4〜$B7が、+1 〜 +4。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $B8 to $BF ┃ ┃:ShiftPitchIndex ┠──────┸────────┸──────────────────────────────────────────────────── ┃・ピッチインデックスを変更する。$B8〜$BBが、-4 〜 -1。$BC〜$BFが、+1 〜 +4。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $C0 to $C7 ┃ ┃:ShiftDurationIndex ┠──────┸────────┸──────────────────────────────────────────────────── ┃・デュレーションインデックスを変更する。$C0〜$C3が、-4 〜 -1。$C4〜$C7が、+1 〜 +4。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $C8 to $CA ┃ ┃:SetDutyCycle ┠──────┸────────┸──────────────────────────────────────────────────── ┃・デューティ比インデックスにオペコードの下位2bitをストアする($C8なら0、$C9なら1、$CAなら2)。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $CB ┃ ┃:GetThroughWithSE ┠──────┸────────┸──────────────────────────────────────────────────── ┃・SEを終了する。サウンドレジスタに無音の値を入れて、SE番号を0(SEなし)にする。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $CC to $CF ┃ ┃:BeSoundless ┠──────┸────────┸──────────────────────────────────────────────────── ┃・指定した長さの分だけ無音にする。ビット配分%110011xx。%xxで音の長さを指定する。 ┃・長い無音は、Tieと組み合わせて作る。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $D0 to $DF ┃ ┃:SetQuantize ┠──────┸────────┸──────────────────────────────────────────────────── ┃・nsfで@vNと指定するクオンタイズの、Nの部分をオペコードの下位4bitで指定する(値は0〜15まで)。 ┠──────────────────────────────────────────────────────────────────── ┃ ┃ ┣━━━━━━┳━━━━━━━━┓ ┃ $E0 to $E4 ┃ $xx ┃:JumpSubRoutine2 ┠──────┸────────┸──────────────────────────────────────────────────── ┃・指定された開始位置から終了位置までのコードを実行する。 ┃・基本的には後述のJumpSubRoutine1と同じ挙動をする。相違点は開始位置が、オペコードの下位3bitとオペランドの上位3bitを合わせた値+1で現在の ┃ チャンネルポインタを減算した値。終了位置が、オペランドの下位5bitを開始位置に加算した値であること。 ┃・三角波チャンネルではReverseFlagOfEVorENが必要ないので、$E5まで使える。 ┃・ノイズチャンネルではさらに、$E7まで使える。 ┠──────────────────────────────────────────────────────────────────── ┃ ┃ ┣━━━━━━┳━━━━━━━━┓ ┃ $E5 ┃ ┃:ReverseFlagOfENorEV ┠──────┸────────┸──────────────────────────────────────────────────── ┃・Note1で ノート(ピッチ)エンベロープとボリュームエンベロープのどちらを指定するかのフラグ を反転する。 ┃・デフォルトではノート(ピッチ)エンベロープになっている。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $E6 ┃ ┃:ReverseFlagOfKey ┠──────┸────────┸──────────────────────────────────────────────────── ┃・Note1での音程の指定モードを指定するフラグ を反転する。 ┃・デフォルトではエンベロープを指定せず、音程を32種類指定するモードになっている。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $E7 ┃ ┃:ReverseFlagOfENorEP ┠──────┸────────┸──────────────────────────────────────────────────── ┃・ノートエンベロープとピッチエンベロープのどちらを使うかのフラグ を反転する。 ┃・デフォルトではノートエンベロープになっている。 ┠──────────────────────────────────────────────────────────────────── ┃ ┃ ┣━━━━━━┳━━━━━━━━┓ ┃ $E8 ┃ $xx ┃:SetSweepState ┠──────┸────────┸──────────────────────────────────────────────────── ┃・スイープステートにオペランドの値をストアする。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $E9 ┃ $xx ┃:SetDetuneState ┠──────┸────────┸──────────────────────────────────────────────────── ┃・デチューンステートに、オペランドの値をストアする。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $EA ┃ $xx ┃:Jump ┠──────┸────────┸──────────────────────────────────────────────────── ┃・ジャンプ命令。チャンネルポインタに、オペランドの値をストアする。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $EB ┃ $xx ┃:ShiftBGMNumber ┠──────┸────────┸──────────────────────────────────────────────────── ┃・BGM番号を変更する。オペランドで指定したBGM番号を設定した後、そのフレームのうちに新しいBGMを鳴らし始める。 ┃・その機構上、このコードは三角波の演奏データに書くことが望ましい。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $EC ┃ $xx ┃:SetMasterControl ┠──────┸────────┸──────────────────────────────────────────────────── ┃・現在のマスターコントロールの値がプラス値なら、マスターコントロールに、オペランドの値をストアする。 ┃・現在のマスターコントロールの値がマイナス値(ロックフラグが立っている)なら、何もせずに次のオペコードへ進む。 ┃ ┃・三角波以外のチャンネルでは、コードネームChoiceEDIndexとして処理をする。 ┃ その内容は、デューティ比インデックスに、オペランドの値をストアするというもの。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $ED ┃ $xx ┃:ChoiceMScaleIndex ┠──────┸────────┸──────────────────────────────────────────────────── ┃・音程インデックスに、オペランドの値をストアする。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $EE ┃ $xx ┃:ChoiceVolumeIndex ┠──────┸────────┸──────────────────────────────────────────────────── ┃・ボリュームインデックスに、オペランドの値をストアする。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $EF ┃ $xx ┃:ChoicePitchIndex ┠──────┸────────┸──────────────────────────────────────────────────── ┃・ピッチインデックスに、オペランドの値をストアする。 ┠──────────────────────────────────────────────────────────────────── ┃ ┃ ┣━━━━━━┳━━━━━━━━┓ ┃ $F0 to $FE ┃ $xx ┃:LoopControl ┠──────┸────────┸──────────────────────────────────────────────────── ┃・ループカウンタが一定の値以上になるまで、チャンネルポインタを指定した値に変える。ループ回数はオペコードの下位4bitで指定する。 ┃・ループカウンタが、オペコードの下位4bitより大きくなればループを抜けるので、$F0では1回ループ、$FEなら15回ループする。 ┃・ループを抜けると判断されない場合、オペランドの値がチャンネルポインタにストアされ、ループカウンタをインクリメントする。 ┃ ループを抜けると判断されれば、ループカウンタをクリアして次のコードへ進む。 ┃ ┃・ループは二重にすることが可能。アウターループアドレスがNULLのときは、現在のチャンネルポインタの値をアウターループアドレスにストアし、 ┃ ループカウンタを1インクリメントする。アウターループアドレスがNULLでないときは、ループカウンタを16インクリメントして、 ┃ 値を右4回シフトした値をカウンタとして利用する。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┳━━━━━━━━┓ ┃ $FF ┃ $xx,$yy ┃:JumpSubRoutine1 ┠──────┸────────┸──────────────────────────────────────────────────── ┃・指定された開始位置から終了位置までのコードを実行する。$xxが開始位置、$yyが終了位置。 ┃・挙動は、まず現在のチャンネルポインタの値をリターンアドレスにストアし、$yyをサブルーチンエンドにストアした後、 ┃ $xxをチャンネルポインタにストアする。そしてそのフレームのうちに、チャンネルポインタの位置にあるコードを読む。 ┃ あとは、チャンネルポインタがサブルーチンエンドと同じ値になるまでコードを読んでいき、同じ値になったところで、 ┃ リターンアドレスをチャンネルポインタにストアする。このとき、サブルーチンエンドの位置のコードは読まれない。 ┃ ┃・サブルーチンは二重にすることが可能。リターンアドレス1がNULLのときは、リターンアドレス1に現在のチャンネルポインタの値をストアし、 ┃ サブルーチンエンド1に終了位置をストアする。リターンアドレス1がNULLでないときは、リターンアドレス2・サブルーチンエンド2にそれぞれをストアする。 ┃ ドライバが新しくコードを読む際には、必ず先にサブルーチンエンドとチャンネルポインタの値を比較する。最初にサブルーチンエンド2を比較し、 ┃ 次にサブルーチンエンドを1比較する。これらが一致すれば、チャンネルポインタにリターンアドレスをストアして、リターンアドレスをクリアする。 ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ########################################################## # マスターボリューム本体とマスターコントロールのコード # ########################################################## ・マスターボリューム''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : ([マスターボリューム]/16+1) *[そのチャンネルの音量]/16 が、BGMを鳴らす各チャンネルの実際の音量になる(SE1,2は影響されない)。 : ただし三角波チャンネルだけは、[マスターボリュームの値が128以上で鳴らし、127以下で鳴らさない]という仕様になっている。 : また、マスターボリュームの値が$F0以上の場合計算の必要がないので、処理を飛ばすようになっている。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ・マスターコントロール''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' : 主にBGMのフェードイン・アウト用。 : 下位7bitはコントロールコード、最上位bitはロックフラグになっている。 : ロックフラグを立てている間は、BGMの演奏データからコントロールコードを変更することができない。 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,; ┏━━━━━━┓ ┃ Code ┃:CodeName ┣━━━━━━┫ ┣━━━━━━┫ ┃ $00 to $0F ┃:AddVolume ┠──────┸───────────────────────────────────────────────────────────── ┃指定した値をそのまま毎フレーム マスターボリュームに加算。マスターボリュームが255を超えたらSetMaximumと同じ処理へ。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┓ ┃ $10 to $1F ┃:SubVolume ┠──────┸───────────────────────────────────────────────────────────── ┃[指定した値 - $20]を毎フレーム マスターボリュームに加算。その加算によってキャリーが発生しなければSetMinimumと同じ処理へ。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┓ ┃ $20 ┃:SetMaximum ┠──────┸───────────────────────────────────────────────────────────── ┃マスターボリュームの値を255にした上で、CodeをNoSignalに変更。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┓ ┃ $21 ┃:SetMinimum ┠──────┸───────────────────────────────────────────────────────────── ┃マスターボリュームの値を0にした上で、CodeをNoSignalに変更。 ┠──────────────────────────────────────────────────────────────────── ┣━━━━━━┓ ┃ $7F ┃:NoSignal ┠──────┸───────────────────────────────────────────────────────────── ┃何もしない。 └────────────────────────────────────────────────────────────────────