このドキュメントでは、mck.txt / mckc.txt からの変更点を記します。 (pmckで追加された機能と、2chのパッチで追加された機能、ppmckで追加された機能 を記述しています) ------------------------------------------------------------------------ ドライバについて(普段は意識しなくていいので読み飛ばして下さい。) □define.inc (ppmckcが自動で出力するのであまり気にしなくてもよさそうです) □追加されたドライバコマンド ◆$ee, , , バンク切り替え … バンク値 , … ジャンプ先アドレス 現在のチャンネルのバンクをに切り替え、コマンド読み出しアドレスを 変更して続行します。 バンク値は切り替える際に使用する数値になっていて、 NSFの場合は指定バンク*2になります。(詳しくはnsfspec.txtとソースを) define.incにてALLOW_BANK_SWITCH=0と定義されている場合はバンクは切り替えず、 コマンド読み出しアドレスの変更だけを行います。 □仕様変更 mck.txt 「◆デューティエンベロープ」 の項の > データ値...3,7,11,15の値を書き込んで下さい > それぞれ >     3 - 12.5% >     7 - 25.0% >    11 - 50.0% >    15 - 75.0% > のデューティ比が鳴ります は > データ値...0,1,2,3の値を書き込んで下さい > それぞれ >     0 - 12.5% >     1 - 25.0% >     2 - 50.0% >     3 - 75.0% > のデューティ比が鳴ります と読み替えてください。 mck.txt 「◆$fe,データ値」 の項の > bit7がon の時、音色指定となります > bit2-3で音色(デューティ比)選択 > ソフトウェアエンベロープを有効にしたい場合は > bit0-1のbitを立ててください は > bit7がon の時、音色指定となります > bit0-1で音色(デューティ比)選択 と読み替えてください。 以上は内蔵矩形波の場合についてです。VRC6の矩形波については省略。 $ffコマンドは廃止(release 7c) $a1, $a0コマンド仕様変更(release 7c) FDSの$fdコマンド仕様変更(release 8) FDSのハードウェアエンベロープは$f0コマンドに(release 8) ------------------------------------------------------------------------ コンパイラについて □音長の扱い 音長を記述した後、さらに"-"または"~"を書いてもうひとつ音長を記述することにより 音長の減算ができます。たとえばc8~#5とすることで、8分音符から5フレーム引いた 音長になります。 □追加または仕様変更されたヘッダー #EX-VRC7 VRC7音源を有効にします。 トラックは6chで、GHIJKLになります。 音量範囲は v0-v15 です。 音色は、@@0がユーザー定義音色、@@1〜@@15がプリセット音色となります。 なお、ユーザー音色の定義の呼び出しはOPで行います。詳しくは@OPの項を 見てください。 #EX-VRC6 VRC6音源を有効にします。 トラックは3chで、MNOになります。 M, Nがデューティー比可変矩形波、Oがノコギリ波です。 M, Nは音量範囲が v0-v15 、デューティー比範囲が @0-@7 となります。 デューティーエンベロープ使用可能です。 音色指定とデューティー比の対応は次のようになります。 @0: 1/16th ( 6.25%) @1: 2/16ths (12.50%) @2: 3/16ths (18.75%) @3: 4/16ths (25.00%) @4: 5/16ths (31.25%) @5: 6/16ths (37.50%) @6: 7/16ths (43.75%) @7: 8/16ths (50.00%) Oは音量範囲が v0-v63 となります。 (実は音量を上げすぎると内部的に数値がオーバーフローしてノコギリ波じゃ なくなります。vrcvi.txt参照。v42まではOK) #EX-MMC5 MMC5音源を有効にします。 トラックは2chで、abになります。 音量範囲: v0-v15 デューティー比範囲: @0-@3 デューティーエンベロープ使用可能です。 内蔵音源の矩形波とほとんど同じです。(sweep機能なし) #EX-FME7 Sunsoft 5B音源を有効にします。 トラックは3chで、XYZになります。 音量範囲: v0-15 @OP = { 〜 } VRC7のFM音源の音色定義を行うことができます。 例: @OP0 = { $00,$00,$00,$00,$00,$00,$00,$00 } 8個のデータが必要です。数値の意味はvrcvii.txtや、 mckスレ過去ログ(part 5の最初)を参照してください。 @OPで定義した音色は、トラック中でOP(または@@)とすることでVRC7のレジスタに ロードされます。 例: @OP0 で定義した音色は G @@0 OP0 で使用します。 なお、ユーザー定義音色は同時に一種類しか使えません。@@0の音色は、 最後に(G〜Lのいずれかのトラックで)使用されたOPによって決まります。 ppmckではAから順にトラックを処理しているため、複数トラックで ユーザー定義音色を使用する場合、OPはGトラックに書いておくとよさそうです。 G @@0 OP0 c d ;Gトラックをユーザー定義音色にし、OP0を実行、cを発音した後で H @@0 e f ;Hトラックをユーザー定義音色にし、eを発音し(すでにOP0は実行されている) I @@0 g a ;Iトラックをユーザー定義音色にし、gを発音(すでにOP0は実行されている) 逆はダメです。 G @@0 c d ;(まだOP0は実行されていないのに)cを発音した後で H @@0 e f ;eを発音し I @@0 OP0 g a ;その後OP0を実行 #AUTO-BANKSWITCH バンクの自動切換えを行います。 は、bank 0のうちデータとして使用できる領域のサイズです。 とりあえず0を指定してコンパイルすればバンクが自動切換えされたデータになります。 nesasmでアセンブルした時に表示されるBANK 0のFREEバイト数をに指定すると さらに最適化されたデータ配置になります。 #AUTO-BANKSWITCHを指定した場合は、全ての#SETBANK, #BANK-CHANGE, およびNBが無視されます。 #AUTO-BANKSWITCHを複数回指定した場合は、最初に指定したが有効になります。 複数曲の場合は最初のMMLに書いてください。 #NO-BANKSWITCH (release 7c以降では、この機能はあまり意味がありません) バンク切り替え系のコマンドで0〜3以外のバンクが指定された場合にエラーにします。 #SETBANK ch,InitialBank (release 9以降では、この機能の替わりに#AUTO-BANKSWITCHを使うことを推奨します。) chはトラックで、A〜Zまたはabのどれか一文字を指定します。 (旧バージョンでは数字による指定もできましたが今では推奨されません。) InitialBankは、そのトラックの開始時のバンクを指定します。 ここでいうバンクは、nesasmの.bankコマンドの値に対応します。 各バンクは8KBです。 以下ではbank関連の挙動について詳しく見ていきます。 基本的に、ppmckcはトラックデータをsongdata.hにAから順番に書き出します。 SETBANKを何も指定しない場合、全てbank 0に書き込まれます。 //------------------------ 例 1: songdata_00: ;A : : : songdata_01: ;B : : : songdata_02: ;C ------------------------// #SETBANK A,4 とした場合、 Aトラック開始時に出力バンクがbank 4になります。 //------------------------------------------------ 例 2: #SETBANK A,4 とした場合 .bank 4 .org $a000 songdata_00: ;A : : : songdata_01: ;B : : : songdata_02: ;C ここで注意するべきことは、他にSETBANKやNBを使わなければ、 後続のB・Cトラックはbank 4に入るということです。 #SETBANK A,4 という指定で、Aトラックだけがbank 4に入るわけではありません。 ------------------------------------------------// //------------------------------------------------ 例 3: #SETBANK A,4 とし、 BトラックのどこかでNBコマンドを使う場合 .bank 4 .org $a000 songdata_00: ;A : : : songdata_01: ;B : : db $ee ;bank 変更命令(NB) db bank(songdata_bnk005)*2 ;NB命令の引数 dw songdata_bnk005 ;NB命令の引数 .bank 5 ;以降は bank 5 に書き込み .org $a000 songdata_bnk005: : : songdata_02: ;C この場合では、AトラックからBトラックの途中までは bank 4 に入り、 BトラックのNB以降(Cトラック以降も)は bank 5 に入ります。 ------------------------------------------------// //------------------------------------------------ 例 4: #SETBANK A,4 #SETBANK B,4 とした場合 .bank 4 ;「今から書くデータは、bank 4のアドレス$a000に書き込む」 .org $a000 ;というnesasmの命令 songdata_00: ;A : : .bank 4 ;「今から書くデータは、bank 4の続きに書き込む」 songdata_01: ;B : : : songdata_02: ;C ppmck04より、別のトラックを同じバンクで指定してもOKになりました。 ------------------------------------------------// @MW = { 〜 } FDS音源のエフェクト波形を定義します。は0〜7の値が入り、この数値 が後述の@MHヘッダーのの値になります。 "{"〜"}"内は32個の0〜7の範囲内の数値です。数値と波形の関係は以下の ような相対変化になります。 0 … 0 4 … 0にリセット 1 … +1 5 … -4 2 … +2 6 … -2 3 … +4 7 … -1 数字と数字の間は、スペースもしくは","で区切ります。 @MH = { , , , } FDS音源のハードウェアエフェクトデータを設定します。 は0〜15の値が入り、この数値が後述のMHコマンドの値になります。 はエフェクトがかかるまでの時間(ディレイ)で0〜255の値をとります。 はエフェクト周波数で、0〜4095の値をとります。値が大きくなる ほどエフェクト周波数が高くなります。 はエフェクトのかかり具合です。0〜63の値をとります。この 値が大きいほどエフェクトがかかります。 はエフェクトに使う波形を指定します。@MWで定義した 波形の番号を指定します。 @DPCM = { "", , , , } デルタPCMの音色を登録します。はデルタPCM番号で0〜63の値をとります。 この値が後述の直接ノート指定の値になります。 はデルタPCMのファイル名です。 は再生周波数パラメータで、0〜15の値をとります。値が大きくなる ほど再生周波数が高くなります。 は再生サイズです。再生サイズは4081以下である必要があります。 0を指定すると指定が省略されたとみなし、ファイルサイズが再生サイズに なります。 ただし、再生サイズは「16で割ると1余る」という条件を満たす必要が あります。(言い換えれば「16進数で表現した時に下1ケタが1」) この条件を満たさない場合は、条件を満たす最も近い値に切り上げ、0xAAで パディングします。 はデルタカウンタ初期値です。ここで指定した値が発音時に$4011へ 書き込まれます。ただし、$ffを指定すると発音時への$4011の書き込みを 行わないようになります。 なお、ファミコンには$4011に0以外の値を書き込むと三角波およびノイズの ボリュームが変わるという挙動があります。 はDMC再生モード指定です。0,1,2の値を取ることができます。 0は通常再生モードです。1はループ再生モードです。2は再生後にIRQを 発生させるモードですが、基本的に2は指定しないで下さい。 なお、以降は省略が可能です。 の省略時の値はファイルサイズになります。(再生サイズの条件を 満たさない場合パディングが実行されます) の省略時の値は0です。 の省略時の値は0です。 DPCMトータルサイズが0x4000バイトを超える場合、自動でバンク切り替えします。 この自動バンク切り替えが発生する場合は、DPCMが置かれるバンクと同じバンクを NBや#SETBANKで指定してトラックデータを書き込むことはできません。 #NO-BANKSWITCHを指定した場合はこの自動バンク切り替えは行われません。 なお、DPCMトータルサイズは各ファイルの単純な合計とは 一致しません。(アラインメントが入るので) #DPCM-RESTSTOP DPCMチャンネルでrコマンドを使った時の挙動を変更します。 このコマンドを指定すると、rコマンドの時に即座にDPCMの再生が止まります。 wコマンドの挙動は変わらないので使い分けてください。 #GATE-DENOM (8) デフォルトで8になっているクオンタイズコマンドの分母を変更します。 #PITCH-CORRECTION すべての音源について、ピッチエンベロープ、LFO、ディチューンの方向が 正しくなります。さらに、Namco 106チャンネルのディチューンの設定が オクターブに依存しないようになります。 □追加または仕様変更されたMMLコマンド  ()内はデフォルトの数値 コマンドは大文字、小文字を区別します。 ・クオンタイズ q, (8,0) 発音時間(クオンタイズ)の指定をします。 発音時間を音長*/8+だけ発音するようにします。(フレーム単位) の範囲は0〜8です。は正負の値を指定することができますが、 発音時間が音長の100%を超えたり0以下になるような指定はできません。 を省略した場合は0になります。 #GATE-DENOM を指定した場合、上記の説明で8となっている部分はに なります。 ・バンク移動 NB (release 9以降では、この機能の替わりに#AUTO-BANKSWITCHを使うことを推奨します。) を指定しない場合は次のバンクへ移行します。 を指定した場合はそのバンクへ移行します。 を指定しない場合、NBコマンドをリピートコマンド([ 〜 ])内で使用すると、 [ 〜 ]リピートで展開された数だけNBを実行してしまいます。これも注意してください。 を指定した場合はNBコマンドはリピートコマンド([ 〜 ])内で使用できません。 の指定に関わらず、リピート2コマンド(|: 〜 :|)内では使用できます。 ・テンポ2 @t, (4,30) 音長フレームになるようにテンポを指定します。 (14400 / / )のテンポに相当します。 例:@t4,24とした場合、4分音符を確実に24フレーム毎に等間隔で鳴らせます。 ・トランスポーズ K (0) これ以降の音程を半音だけ上下させます。 ・ハードウェアエフェクト MH (255) FDS音源トラックのみのコマンドです。ハードウェアエフェクトを 指定します。はハードウェアエフェクト番号です。255($ff)を 指定するとハードウェアエフェクトが解除されます。 ・ハードウェアエフェクト OFF MHOF ハードウェアエフェクトを解除します。MH255と同等の処理をします。 ・リリース時音色指定 @@r (255) @vrの音色版です。は0〜127の自作音色の番号です。 255を指定するとオフになります。 ・キーオフ k (4) リリースエンベロープを発動させ、で指定した音長ぶん待機します。 を省略した場合は、lコマンドの値を使用します。 「リリースエンベロープが発動する休符」ととらえてください。 ・セルフディレイ SD リリースエンベロープが発動するタイミングで、回前のノートオンの 音で残響音を付加します。 ふつうのリリースエンベロープの例: MML記述: @v0 @vr1 l4 q4 cdefg 実際の出力: l8 q8 @v0c@v1w@v0d@v1w@v0e@v1w@v0f@v1w@v0g@v1w セルフディレイの例: MML記述: SD1 @v0 @vr1 l4 q4 cdefg 実際の出力: l8 q8 @v0c@v1w@v0d@v1c@v0e@v1d@v0f@v1e@v0g@v1f ・セルフディレイ OFF SDOF セルフディレイを解除します。 ・セルフディレイ バッファリセット SDQR セルフディレイ用のバッファを空にします。つまり、ノートオンの履歴を忘れます。 例: MML記述: A SD1 @v0 @vr1 l4 q4 A cdefg A cSDQRdefSDQRg 実際の出力: A l8 q8 A @v0c@v1w@v0d@v1c@v0e@v1d@v0f@v1e@v0g@v1f A @v0c@v1g@v0d@v1w@v0e@v1d@v0f@v1e@v0g@v1w ・VRC7ユーザ音色定義読み込み OP @OPで定義したVRC7のユーザー音色定義をVRC7のレジスタにロードします。 の範囲は0〜63です。 ・音色1 @ (0) X, Y, Zチャンネルの場合は以下のようになります。 0 … ミュート 1 … トーン(初期設定) 2 … ノイズ 3 … トーン+ノイズ @2の時は、n0(o0c)〜n31(o2g)でノート番号がそのままノイズ周波数になります。 EPやENもノイズ周波数に反映されます。 ・Sunsoft 5B ハードウェアエンベロープ形状選択 S Sunsoft 5B音源(X, Y, Zトラック)用のコマンドです。 ハードウェアエンベロープ形状を選択します。 はPSGの13番レジスタに書き込む値(0〜15)です。 ・Sunsoft 5B ハードウェアエンベロープ周期設定 M Sunsoft 5B音源(X, Y, Zトラック)用のコマンドです。 ハードウェアエンベロープ周期を設定します。 はPSGの11,12番レジスタに書き込む値(0〜65535)です。 ・Sunsoft 5B ノイズ周波数設定 N Sunsoft 5B音源(X, Y, Zトラック)用のコマンドです。 ノイズ周波数を設定します。 はPSGの6番レジスタに書き込む値(0〜31)です。 @2を指定している時は無効です。 ・ピッチシフト量設定 SA N106音源(P〜Wトラック)用のコマンドです。 ディチューン、ピッチエンベロープ、ビブラートのかかり具合を強くします D、EP、MPの数値は回左シフトされてから周波数数値に加減算されます。 値の範囲は0〜8です。 #PITCH-CORRECTIONを使用した場合のみ使用可能です。 ------------------------------------------------------------------------ その他 □mk*.bat NSF作成の手順を説明します。 1) テキストエディタでMMLを記述します。 2) songsフォルダに保存します。ここではsongdata.mmlという名前で 保存したものとします。 3) songsフォルダにある00startcmd.batをダブルクリックして、 コマンドプロンプトを開きます。 4a) mknsf ファイル名(拡張子抜き) とタイプして、NSFファイルを作成します。 今の例では、 mknsf songdata とタイプします。コンパイルが成功すれば、songdata.nsfが作成されます。 4b) mknes songdata とタイプすると、iNES形式のROMイメージが作成されます。 マッパー#0なのでバンク切り替えや拡張音源は使えません。 4c) 複数曲を含んだNSFを作成する場合は mkmultinsf song1.mml song2.mml ... とタイプします。 □複数曲登録NSF作成時の注意: effect.hは共通です。よって@v等は、別のMMLであっても、エフェクト番号の 衝突が起こりえます。たとえばsong1.mmlで@v0を定義し、song2.mmlでも@v0を定義 した場合は一方しか有効になりません。 コンパイルする順番は、song1.mmlのトラックA, B, C, ..., song2.mmlの A, B, C, ... となっています。バンク設定もその順番で引き継がれます。 4d) mkmultines song1.mml song2.mml ... とタイプすると、複数曲が登録されたnesファイルが作成されます。 □注意 FDSと他の拡張音源を同時使用すると問題が生じます。FDS使用時は$6000-$DFFFが RAMとして扱われるため、この範囲にある拡張音源のレジスタに書き込もうとする ときに、$8000-$DFFFに存在するであろうプログラムやデータを破壊する可能性が あります。 (2a03.orgのForumより http://www.2a03.org/forum/viewtopic.php?id=198#1330) 参考までにこの範囲にあるレジスタを書いておきます。 $9000 W VRC6 squ1 $9001 W VRC6 squ1 $9002 W VRC6 squ1 $9010 W VRC7 address $9030 W VRC7 data $A000 W VRC6 squ2 $A001 W VRC6 squ2 $A002 W VRC6 squ2 $B000 W VRC6 saw $B001 W VRC6 saw $B002 W VRC6 saw $C000 W Sunsoft 5B address