diff --git a/bin/nsc.exe b/bin/nsc.exe index a1bd8f7..7287e58 100644 Binary files a/bin/nsc.exe and b/bin/nsc.exe differ diff --git a/bin/nsd.bin b/bin/nsd.bin index 39b24fb..0f6136e 100644 Binary files a/bin/nsd.bin and b/bin/nsd.bin differ diff --git a/bin/nsd_all.bin b/bin/nsd_all.bin index 86156ad..c22bab6 100644 Binary files a/bin/nsd_all.bin and b/bin/nsd_all.bin differ diff --git a/bin/nsd_all2.bin b/bin/nsd_all2.bin index 96b7e28..7f8fda7 100644 Binary files a/bin/nsd_all2.bin and b/bin/nsd_all2.bin differ diff --git a/bin/nsd_fds.bin b/bin/nsd_fds.bin index c24a3dc..a04c7d5 100644 Binary files a/bin/nsd_fds.bin and b/bin/nsd_fds.bin differ diff --git a/bin/nsd_hfe4.bin b/bin/nsd_hfe4.bin index cdbe040..36c8596 100644 Binary files a/bin/nsd_hfe4.bin and b/bin/nsd_hfe4.bin differ diff --git a/bin/nsd_hfx4.bin b/bin/nsd_hfx4.bin index 6b90019..73f1d65 100644 Binary files a/bin/nsd_hfx4.bin and b/bin/nsd_hfx4.bin differ diff --git a/bin/nsd_mmc5.bin b/bin/nsd_mmc5.bin index da8b3cf..76348bc 100644 Binary files a/bin/nsd_mmc5.bin and b/bin/nsd_mmc5.bin differ diff --git a/bin/nsd_n163.bin b/bin/nsd_n163.bin index 1665bd8..7c6a91e 100644 Binary files a/bin/nsd_n163.bin and b/bin/nsd_n163.bin differ diff --git a/bin/nsd_oall.bin b/bin/nsd_oall.bin index f766738..1677b51 100644 Binary files a/bin/nsd_oall.bin and b/bin/nsd_oall.bin differ diff --git a/bin/nsd_opll.bin b/bin/nsd_opll.bin index 28fdf05..ab82aa0 100644 Binary files a/bin/nsd_opll.bin and b/bin/nsd_opll.bin differ diff --git a/bin/nsd_s5b.bin b/bin/nsd_s5b.bin index 043dcf6..7a2fc6c 100644 Binary files a/bin/nsd_s5b.bin and b/bin/nsd_s5b.bin differ diff --git a/bin/nsd_vrc6.bin b/bin/nsd_vrc6.bin index d8e78d9..c676e46 100644 Binary files a/bin/nsd_vrc6.bin and b/bin/nsd_vrc6.bin differ diff --git a/bin/nsd_vrc7.bin b/bin/nsd_vrc7.bin index 954cce6..cd79fcc 100644 Binary files a/bin/nsd_vrc7.bin and b/bin/nsd_vrc7.bin differ diff --git a/doc/nsdl.chm b/doc/nsdl.chm index 80e7223..33ccc29 100644 Binary files a/doc/nsdl.chm and b/doc/nsdl.chm differ diff --git a/doc/readme.txt b/doc/readme.txt index 3f34f00..0cc04f9 100644 --- a/doc/readme.txt +++ b/doc/readme.txt @@ -1,6 +1,6 @@ +----------------------------------------------------------------------------- | タイトル | NES Sound Driver Library -|ファイル名| NSDL116.ZIP +|ファイル名| NSDL117.ZIP | カテゴリ | Sound Driver for NES | 動作機種 | NES (Nintendo Entertainment System) |前提ソフト| cc65 (Complete cross development package for 65(C)02 systems.) @@ -28,4 +28,4 @@ This is developed as object library, and user application can control it. ・mixi http://mixi.jp/show_profile.pl?id=16558 ======================================================================== -製作のファイルは【NSDL116.ZIP】です。 +製作のファイルは【NSDL117.ZIP】です。 diff --git a/lib/NSD.lib b/lib/NSD.lib index 18f0e89..10b346f 100644 Binary files a/lib/NSD.lib and b/lib/NSD.lib differ diff --git a/lib/NSD_ALL.lib b/lib/NSD_ALL.lib index 8d7e936..f9fa701 100644 Binary files a/lib/NSD_ALL.lib and b/lib/NSD_ALL.lib differ diff --git a/lib/NSD_ALL2.lib b/lib/NSD_ALL2.lib index f4305da..b060a5d 100644 Binary files a/lib/NSD_ALL2.lib and b/lib/NSD_ALL2.lib differ diff --git a/lib/NSD_FDS.lib b/lib/NSD_FDS.lib index abbe73f..8706bad 100644 Binary files a/lib/NSD_FDS.lib and b/lib/NSD_FDS.lib differ diff --git a/lib/NSD_HFE4.lib b/lib/NSD_HFE4.lib index c7c306e..03fc33e 100644 Binary files a/lib/NSD_HFE4.lib and b/lib/NSD_HFE4.lib differ diff --git a/lib/NSD_HFX4.lib b/lib/NSD_HFX4.lib index 5739d69..42a3aa2 100644 Binary files a/lib/NSD_HFX4.lib and b/lib/NSD_HFX4.lib differ diff --git a/lib/NSD_MMC5.lib b/lib/NSD_MMC5.lib index 4cac2a0..77f55a7 100644 Binary files a/lib/NSD_MMC5.lib and b/lib/NSD_MMC5.lib differ diff --git a/lib/NSD_N163.lib b/lib/NSD_N163.lib index 7e19393..cff7850 100644 Binary files a/lib/NSD_N163.lib and b/lib/NSD_N163.lib differ diff --git a/lib/NSD_OALL.lib b/lib/NSD_OALL.lib index f22a39a..c7fe314 100644 Binary files a/lib/NSD_OALL.lib and b/lib/NSD_OALL.lib differ diff --git a/lib/NSD_OPLL.lib b/lib/NSD_OPLL.lib index d2ec0b8..b91bdfe 100644 Binary files a/lib/NSD_OPLL.lib and b/lib/NSD_OPLL.lib differ diff --git a/lib/NSD_VRC6.lib b/lib/NSD_VRC6.lib index 3dd4cb1..22656af 100644 Binary files a/lib/NSD_VRC6.lib and b/lib/NSD_VRC6.lib differ diff --git a/lib/NSD_VRC7.lib b/lib/NSD_VRC7.lib index 7fb8594..3c2306e 100644 Binary files a/lib/NSD_VRC7.lib and b/lib/NSD_VRC7.lib differ diff --git a/lib/NSD_s5b.lib b/lib/NSD_s5b.lib index 176cc28..a8f5025 100644 Binary files a/lib/NSD_s5b.lib and b/lib/NSD_s5b.lib differ diff --git a/src/help/func_nsd_main_bgm.BAK b/src/help/func_nsd_main_bgm.BAK deleted file mode 100644 index a879e3f..0000000 --- a/src/help/func_nsd_main_bgm.BAK +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -nsd_main() - - - - - - - -
-

nsd_main_bgm()

- - -
-

定義(Define)

-
-        void    __fastcall__    nsd_main_bgm(void );
-
-
- - -
-

引数(Inputs)

-

- 無し(no input) -

-
- - -
-

戻り値(Outputs)

-

- 無し(no output) -

-
- - -
-

内容(Contents)

-

-音源ドライバーのメインルーチン(BGM)です。
-1/60秒毎に呼び出してください。
-

-

- -

-
- - -
-

注意(Notes)

-

-一般的な手法としては、VBlank割り込み(NMI)ルーチンから呼び出します。
-本関数では、a,x,yレジスタの保存および、`rti'命令による割り込みの復帰は行っていません。
-また、VBlank割り込み(NMI)を用いる場合は、ユーザーアプリケーション側にて、 -nsd_init()関数を呼び出し後に、VBlank割り込みを`有効'にPPUを設定してください。
-

-

-この関数は、BGMのみを再生します。
-本関数を呼ぶ前に、ROMは曲データがあるバンクに切り替えて置いてください。
-

-

-BGMと効果音を同一のバンクに配置する場合は、 -nsd_main()関数を用いる事で、関数呼出しのクロック数を1つ削減できます。
-

- -

nsd_main_bgm(void)関数の呼び出し例

-
-        .import         _nsd_main
-.segment        "CODE"
-NMI_Start:
-        pha
-        txa
-        pha
-        tya
-        pha
-
-        ; PPU Control code.
-        ; 
-        ; to do 垂直同期期間中にVRAMへアクセスするコードを配置してください。
-        ;       通常、画面処理は、サウンド処理より先に行います。
-        ; 
-
-        ; Bank change for BGM. (曲データをメモリ空間にマッピングします。)
-        lda     #BGM_bank
-        jsr     _bank_change            ;   bank_change(BGM_bank);
-
-        ; Play BGM. (曲の再生。)
-        jsr     _nsd_main_bgm           ;   nsd_main_bgm();
-
-        ; Bank change for SE. (効果音データをメモリ空間にマッピングします。)
-        lda     #SE_bank
-        jsr     _bank_change            ;   bank_change(SE_bank);
-
-        ; Play BGM & SE. (効果音の再生。)
-        jsr     _nsd_main_se            ;   nsd_main_ses();
-
-        ; Return the bank number. (バンクを元に戻します。)
-        lda     #prog_bank
-        jsr     _bank_change            ;   bank_change(prog_bank);
-
-        pla
-        tay
-        pla
-        tax
-        pla
-        rti
-
-
- -
- - - - - - - diff --git a/src/help/func_nsd_main_se.BAK b/src/help/func_nsd_main_se.BAK deleted file mode 100644 index 16cd717..0000000 --- a/src/help/func_nsd_main_se.BAK +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -nsd_main() - - - - - - - -
-

nsd_main_se()

- - -
-

定義(Define)

-
-        void    __fastcall__    nsd_main_se(void );
-
-
- - -
-

引数(Inputs)

-

- 無し(no input) -

-
- - -
-

戻り値(Outputs)

-

- 無し(no output) -

-
- - -
-

内容(Contents)

-

-音源ドライバーのメインルーチン(効果音)です。
-1/60秒毎に呼び出してください。
-

-

- -

-
- - -
-

注意(Notes)

-

-一般的な手法としては、VBlank割り込み(NMI)ルーチンから呼び出します。
-本関数では、a,x,yレジスタの保存および、`rti'命令による割り込みの復帰は行っていません。
-また、VBlank割り込み(NMI)を用いる場合は、ユーザーアプリケーション側にて、 -nsd_init()関数を呼び出し後に、VBlank割り込みを`有効'にPPUを設定してください。
-

-

-この関数は、効果音のみを再生します。
-本関数を呼ぶ前に、ROMは効果音データがあるバンクに切り替えて置いてください。
-

-

-BGMと効果音を同一のバンクに配置する場合は、 -nsd_main()関数を用いる事で、関数呼出しのクロック数を1つ削減できます。
-

- -

nsd_main_se(void)関数の呼び出し例

-
-        .import         _nsd_main
-.segment        "CODE"
-NMI_Start:
-        pha
-        txa
-        pha
-        tya
-        pha
-
-        ; PPU Control code.
-        ; 
-        ; to do 垂直同期期間中にVRAMへアクセスするコードを配置してください。
-        ;       通常、画面処理は、サウンド処理より先に行います。
-        ; 
-
-        ; Bank change for BGM. (曲データをメモリ空間にマッピングします。)
-        lda     #BGM_bank
-        jsr     _bank_change            ;   bank_change(BGM_bank);
-
-        ; Play BGM. (曲の再生。)
-        jsr     _nsd_main_bgm           ;   nsd_main_bgm();
-
-        ; Bank change for SE. (効果音データをメモリ空間にマッピングします。)
-        lda     #SE_bank
-        jsr     _bank_change            ;   bank_change(SE_bank);
-
-        ; Play BGM & SE. (効果音の再生。)
-        jsr     _nsd_main_se            ;   nsd_main_ses();
-
-        ; Return the bank number. (バンクを元に戻します。)
-        lda     #prog_bank
-        jsr     _bank_change            ;   bank_change(prog_bank);
-
-        pla
-        tay
-        pla
-        tax
-        pla
-        rti
-
-
- -
- - - - - - - diff --git a/src/help/mml.html b/src/help/mml.html index 4d78b76..b2647a8 100644 --- a/src/help/mml.html +++ b/src/help/mml.html @@ -47,19 +47,24 @@ #timebase n 以降のBGM, SE, Subブロックの四分音符の分割数を設定します。(Default: n = 24)
何度でも指定可能であり、各BGM, SE, サブルーチン毎に設定することもできます。
MMLコンパイラの疑似命令です。 -#octaveReverse 本コマンドを記述することで、相対オクターブの`<'と`>'を入れ替えます。 -#rest n シーケンス記述ブロック内におけるr コマンドのモードを設定します(Default: n = 2)
+#octaveReverse 本コマンドを記述することで、シーケンス記述ブロック内における相対オクターブコマンド + `<'と`>'を入れ替えます。 +#rest n シーケンス記述ブロック内におけるr コマンドのモードを設定します(Default: n = 2)
 0 … 強制的に、音量を0にします。儕CMの場合はKeyOffします。
 1 … 直前のノートを、R@, Rvコマンドの値で鳴らします。
 2 … 直前のノートのエンベロープ(音色・音量)を継続します。(Default)
-#wait n シーケンス記述ブロック内におけるw コマンドのモードを設定します(Default: n = 0)
+#wait n シーケンス記述ブロック内におけるw コマンドのモードを設定します(Default: n = 0)
数値の意味は、#rest コマンドと同じです。 -#QMax n シーケンス記述ブロック内におけるQ コマンドの分母を設定します(Default: n = 8)
- 実際の発音音長は、音長 × Qコマンドの値 ÷ n となります。 -#offsetE@ n シーケンス記述ブロック内にて、E@コマンドの引数を指定数値だけずらします。(Default: n = 0) -#offsetEv n シーケンス記述ブロック内にて、Evコマンドの引数を指定数値だけずらします。(Default: n = 0) -#offsetEm n シーケンス記述ブロック内にて、Emコマンドの引数を指定数値だけずらします。(Default: n = 0) -#offsetEn n シーケンス記述ブロック内にて、Enコマンドの引数を指定数値だけずらします。(Default: n = 0) +#QMax n シーケンス記述ブロック内におけるQ コマンドの分母を設定します(Default: n = 8)
+ 実際の発音音長は、音長 × Q コマンドの値 ÷ n となります。 +#RepeatMode n シーケンス記述ブロック内におけるリピート(A)コマンドのコンパイル方法を設定します。(Default: n = 0)
+ nは0〜2の範囲で指定します。数値の詳細は、リピート(A)コマンドを参照。 +#ReleaseVolume n シーケンス記述ブロック内におけるRvコマンドの初期値を設定します。(Default: n = 2)
+ nは0〜15の範囲で指定します。 +#offsetE@ n シーケンス記述ブロック内にて、E@コマンドの引数を指定数値だけずらします。(Default: n = 0) +#offsetEv n シーケンス記述ブロック内にて、Evコマンドの引数を指定数値だけずらします。(Default: n = 0) +#offsetEm n シーケンス記述ブロック内にて、Emコマンドの引数を指定数値だけずらします。(Default: n = 0) +#offsetEn n シーケンス記述ブロック内にて、Enコマンドの引数を指定数値だけずらします。(Default: n = 0) #offsetPCM address 儕CMを配置するアドレスを指定します。(Default: address = $10000(儕CM無し))
シーケンスデータはこのコマンドで指定したアドレス-1の領域まで使えます。
NSF music formatを出力する場合は、このアドレスよりΔPCMの実体が配置されます。
diff --git a/src/help/mml_repeatA.html b/src/help/mml_repeatA.html index 63cccc1..2a84852 100644 --- a/src/help/mml_repeatA.html +++ b/src/help/mml_repeatA.html @@ -26,11 +26,19 @@

MML reference: Repeat(A)

定義(Define)

+

記法1

         [count
 	:
 	]count
 
+

記法2

+
+        [:count
+	:
+	:]count
+
+
@@ -49,23 +57,70 @@

count

内容(Contents)

リピート(繰り返し)を記述します。
-リピート(A)は、同じパターンが何度も繰り返される時に、スライド辞書による圧縮を手動で記述し曲データサイズを小さくします。
-リピートというよりは、手動でスライド辞書圧縮するためのコマンドです。

-
-
[
リピートの開始位置を示します。
-
:
最終リピート時に、]コマンドの位置までジャンプします。
-
]
リピートの終了位置を示します。
-
+ + + + + + +
コマンド内容
[
[:
リピートの開始位置を示します。
: 最終リピート時に、リピートを終了します。
記法1、記法2で共通です(MMLコンパイラが自動で判別します)。
]
:]
リピートの終了位置を示します。
+ +

+#RepeatModeコマンドで設定したリピートモードにより、リピートの展開方法が異なります。
+

+ +

リピートモード 0 (Default)

+

+記法1のリピートコマンドのみで、ネスティングを含めたリピート(繰り返し)を行えます。
+本モード時は、自動でMMLコンパイラがコンパイル方法を決定するため、 +ユーザーはドライバ実装のリピート、コンパイラ展開のリピートを意識する必要はありません。
+

+

+具体的には、 +記法1によるリピートを記述した場合、標準ではドライバ実装のリピートを使用します。
+但し、ネスティングした場合は、2段目以降のリピートコマンドはMMLコンパイラにて展開します。
+記法2によるリピートを記述した場合は、強制的にMMLコンパイラにてリピートを展開します。
+尚、サブルーチン記述ブロックの場合は、リピートモード2と同様の処理となります。
+

+ +

リピートモード 1

+

+リピートコマンドを、ドライバ実装のリピートを使用するか、MMLコンパイラで展開するかユーザで制御したい場合にご使用ください。
+ユーザ・アプリケーションへの組込等、メモリの制約がある場合に、ご利用ください。
+

+

+記法1によるリピートを記述した場合、ドライバ実装のリピートを使用します。ネスト不可です。
+記法2によるリピートを記述した場合、MMLコンパイラにてリピートを展開します。
+

+ +

リピートモード 2

+

+リピートコマンドを、ドライバ実装のリピートを使用するか、MMLコンパイラで展開するかユーザで制御したい場合にご使用ください。
+ユーザ・アプリケーションへの組込等、メモリの制約がある場合に、ご利用ください。
+

+

+記法1によるリピートを記述した場合、MMLコンパイラにてリピートを展開します。
+記法2によるリピートを記述した場合、ドライバ実装のリピートを使用します。ネスト不可です。
+

+

注意(Notes)

+ +

+ドライバ実装のリピートは、ネスト不可となります。
+

-リピート(A)のネストはできません。
-リピート(A)の区間でリピート(B)を使用する場合、リピート(B)の区間を終了してからリピート(A)を終了してください。
+本コマンド『リピート(A)』の区間で『リピート(B)』を使用する場合、リピート(B)の区間を終了してからリピート(A)を終了してください。

+

+MMLコンパイラによる展開を使用した場合、展開した分だけコンパイル後のシーケンスサイズが大きくなります。
+なるべくMMLコンパイラによるリピートの展開は使わず、サブルーチンに置き換えるなどの工夫をお勧めします。
+

+
diff --git a/src/help/nsc_option.BAK b/src/help/nsc_option.BAK deleted file mode 100644 index c50a3f1..0000000 --- a/src/help/nsc_option.BAK +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - -コマンドラインオプション(Command line option) - - - - - - - -
-

コマンドラインオプション(Command line option)

- -
-

-本MMLコンパイラは、CUI(Command line User Interface)のアプリケーションです。
-以下のように、記述してください。
-何も指定しない場合は、NSFに変換します。
-

-
- -
-

概要(Overview)

- -
-	nsc -option filename(*.mml)
-
- -
-
-a
Compile to assembly langage. (*.s)
-
-n
Compile to NSF music format. (*.nsf)
-
-e
Error/Warning messages out the Stadard error (stderr).
-
-t
Disable tick counting.
-
-lfilename
Set the filename of the rom code for NSF.
-
-fafilename
Set the filename of the output assembly langage file.
-
-fnfilename
Set the filename of the output NSF music format.
-
-o
Optimize.
-
-h
Print the this help.
-
-
- -
-

詳細(Detail)

-

-a

-

-MMLファイルをアセンブリ言語ソース(ca65.exe用)へ変換します。
-出力されるアセンブリ言語ソースは、そのままca65.exeでアセンブル可能なソースになっており編集不要です。
-ソースを編集すると、再生に影響を及ぼす可能性がありますので、編集せずにアセンブルしてください。
-ユーザー・アプリケーションのビルドの際に、そのオブジェクト・ファイルをリンクして下さい。
-

-

-出力するアセンブリ言語ソースの詳細は、出力するアセンブリ言語ソースについてを参照して下さい。
- -

- -

-n

-

-NSF Music formatへ変換します。
-コンパイラで直接NSFを生成する場合、 -実行コード、曲データ、凾oCMデータの合計が32kByteまでとなります。
-

- -

-e

-

-エラー/ワーニングを、標準エラー出力に出力します。
-デフォルトでは標準出力に返しますが、ファイルに関するエラーのみは、標準エラー出力固定となります。
-

- -

-t

-

-Tick数のカウントを無効化します。
-指定しない場合は、 -

- -

-lfilename

-

-NSF Music formatへ変換する際の実行コードファイルを指定します。
-このオプションを指定した場合、MML中の"#code"コマンドは無視されます。
-ファイル名は、スペースを開けずに記述してください。
-

- -

-fafilename

-

-アセンブリ言語ソースのファイル名を指定できます。
-指定がない場合は、入力されたmmlのファイル名で、拡張子を`.s'にして出力します。
-ファイル名は、スペースを開けずに記述してください。
-

- -

-fnfilename

-

-NSF Music formatのファイル名を指定できます。
-指定がない場合は、入力されたmmlのファイル名で、拡張子を`.nsf'にして出力します。
-ファイル名は、スペースを開けずに記述してください。
-

- -

-o

-

-NSFファイルにビルドする際に、バンク構成を最適化しファイルサイズを小さくします。
-儕CMを用いるMMLをコンパイルする場合に、効果が得られる場合があります。
-但し、バンクが不連続に配置されたnsfに非対応の実機再生環境では、儕CMの再生が正常に行われない場合があります。
-(現状、TNS-HFC3にて確認しています)。
-

-

-このオプションスイッチでは、未使用のメモリ空間のバンクは作らず、必要なバンクだけを作成します。
-これは、儕CMを使用する際に発生します。
-たとえば、シーケンスデータが$9FFF番地で終わり儕CMが$C000番地から配置される場合$A000〜$BFFFのメモリ領域は不要となります。
-その領域をnsfファイル化せず、$8000〜$9FFF, $C000〜を領域のみをnsfファイル化して、ファイルサイズを小さくするためのオプションです。
-Version 0.10β〜0.17βでのデフォルトの動作です。
-

-

-また、儕CMでバンクに対応した.binを使用時において、このオプションスイッチを指定しない場合は、 -NSFのバンク数が最低8バンク(NSFヘッダーを除き32kByte)になるように調整します。
-このオプションスイッチを指定する場合は、8バンク(NSFヘッダーを除き32kByte)以下のNSFも作成可能ですが、 -バンクが不連続に配置されたnsfに非対応の実機再生環境では、正常に再生できない可能性があります。
-

- -

-h

-

-簡易ヘルプを表示します。
-

- -
- -
- - - diff --git a/src/help/nsdl.chm b/src/help/nsdl.chm index 80e7223..33ccc29 100644 Binary files a/src/help/nsdl.chm and b/src/help/nsdl.chm differ diff --git a/src/help/revision.BAK b/src/help/revision.BAK deleted file mode 100644 index b02ec25..0000000 --- a/src/help/revision.BAK +++ /dev/null @@ -1,413 +0,0 @@ - - - - - - - -改訂履歴 - - - - - - - -
-

改訂履歴(Revision)

- -
-

改訂履歴

-

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ヴァージョン内容改定日
1.16●音源ドライバー本体
- ・利便性を考え、makefileや、ヘッダーファイルを作り直した。
- ・nsd_main_bgm()関数及び、nsd_main_se()関数を実装した。
-  これにより、マッパーLSI使用時に、BGMと効果音を異なるバンクに配置することが出来ます。
- ・演奏状態を保存するnsd_save()関数及び、演奏状態をロードするnsd_load()関数を実装した。
-  これにより、別の曲を鳴らしていても、演奏状態を保存した曲を途中から再生可能です。
- ・制御用構造体を最適化し、使用するRAMの量を減らした。
-  拡張音源無しの`nsd.lib'では、セグメント"bss"(未初期化データ)領域が14[Byte]減ります。
- ●サンプル
- ・makefileや、ヘッダーファイルの作り直しに伴う改定。
- ●MMLコンパイラ
- ・Tick数をカウントする処理を追加した。また、-t オプションにて無効にできます。
-
2014年 4月27日
1.15●音源ドライバー本体
- ・ポルタメント後にスラーで繋げた場合、繋げた先の音符でポルタメントの変位がそのままになってしまうバグをFixした。
- ●MMLコンパイラ
- ・エラー・ワーニングの出力先を標準エラー出力に設定するオプションスイッチを実装した。
- ・それに伴い、エラー、ワーニングの出力先のデフォルトは、標準出力とした。
- ・Jコマンドにて、ポルタメントも無視するようにした。
- ・相対音量コマンドにて、数値指定し変化量を指定できるようにした。
- ・{}コマンドにて、ポルタメントを簡素化して記述できるようにした。
- ・マクロ定義の中で、`{'の個数分だけ`}'を記述できるようにした。
-  これに伴い、マクロの中で、K{}コマンド、{}コマンドが使えるようになります。
- ・ド♭、シ#がある場合、疑似エコーコマンドにて疑似エコーを正常に生成できていなかったバグを修正。
- ・kコマンドによる、MMLコンパイラ側での移調に対応した。
- ・音長に0を指定するとハングするバグが再発していたので、修正した。
- ●取扱説明書
- ・エンベロープの説明にて、FDS音源のキャリアとモジュレータの説明が逆になっていたのを修正。
-
2014年 3月 4日
1.14●MMLコンパイラ
- ・エラー、ワーニングは、標準出力ではなく、エラー出力に出力するようにした。
-  これにより、アプリケーション組み込み時のmakefile等が作りやすくなります。
- ・音符、休符、サブルーチン、効果音呼出を無視するコマンドに対応。
-  このコマンドにより、コメントアウトしないでも、シーケンスの途中から鳴らすことができます。
- ・ゲートクオンタイズに対応。また、分母も曲毎に設定可能です。
-
2014年 2月25日
1.13●音源ドライバー本体
- ・nsd_all.bin, nsd_all2.bin, nsd_oall.bin, nsd_hfe4.bin, nsd_hfx4.binにて、 - Version 1.12におけるシーケンス64kByte化の副作用として、音量エンベロープが効かなくなることがあるバグ及び、 - ΔPCMのIRQが使えなくなっていたバグをFix。
- ・ノートコマンドのオペコードのビット位置を最適化のためを変更しました。
- ・オクターブコマンドで指定できるオクターブを2〜9から1〜8へ変更しました。
- ●MMLコンパイラ
- ・疑似エコーのバッファをリセットするコマンドを実装した。
- ・EC(疑似エコー)コマンドにオプションで第三パラメータを追加し、 - 休符を書かないでも疑似エコーをできるようにした。
- ・音符及び休符にて、lコマンドと音長が同じ場合は、1Byte短いオペコードを出力するようにした。
- ・音量、ゲートタイムの指定値が前回と同じ場合は、コンパイルしないようにした(リピート、ダルセーニョ後は除外)。
-
2014年 1月19日
1.12●音源ドライバー本体
- ・Sunsoft 5Bにて、sコマンド使用時にプチノイズが入る場合があるバグを修正。
- ・効果音の優先度設定に対応。
- ・効果音にて、パルス波ch2, ノイズchで個別の効果音を鳴らせるようにした。
- ・nsd_all.bin, nsd_all2.bin, nsd_oall.bin, nsd_hfe4.bin, nsd_hfx4.binにて、シーケンスを64KByteまで使えるようにした。
- ●MMLコンパイラ
- ・マクロ名の検出アルゴリズムを変更し、長いマクロ名を優先するようにしました。
- ●取扱説明書
- ・Tipsのスケールとコードに、各コード(和音)毎に使えるスケール(旋法)を記載しました。
-
2014年 1月 3日
1.11●音源ドライバー本体
- ・フレームオーバーによる暴走回避ルーチンを実装。
- ・移調の演算を、エンベロープの処理ルーチンから、ノート番号の計算ルーチンへ移動。
- ・nsd_hfx4.bin を新設。OPLLを含む全ての拡張音源を使用可能です。
- ●MMLコンパイラ
- ・w コマンド(休符2)を実装しました。
- ・休符のモードを設定する、#rest コマンド、 #wait コマンドを実装しました。
- ・音長の減算を`~'でもできるようにしました。
- ・マクロ名の検出アルゴリズムを変更し、スペースを置く必要を無くしました。
- ・Mode(), Major, Minor, MMinor(), HMinor()コマンドを新設しました。
- ●コンパイル済み音源ドライバ
- ・TNS-HFCシリーズにおいて、nsd_all.bin, nsd_all2.bin使用時にリセットボタンを連打するとハングする不具合を修正。
- ・TNS-HFC4にVRC6, VRC7を差した時に、ハングする不具合を修正。
-  但し、nsd_all.bin, nsd_all2.binをリンクした場合は、TNS-HFC4に直接VRC6, VRC7を刺すとハングします。
-  これらのドカモリ用のbinにおいて、TNS-HFC4でVRC6, VRC7を使う場合は、TNS-HFX4が必須となります。
2013年 9月16日
1.10●音源ドライバー本体
- ・VRC7, OPLLにて、音色切り替わり時に最初の音が正常に発音されない場合があったバグを修正。
- ●コンパイル済み音源ドライバ
- ・ΔPCM-IRQの割り込み処理中にNMI割り込みが発生した場合に、ΔPCMが正常に発音されなくなるバグを修正。
2013年 6月 9日
1.09●音源ドライバー本体
- ・VRC7, OPLLの@コマンド及び音色エンベロープにて、ユーザー音色のTL, MLを操作出来るようにした。
-  (ドライバー内部での論理演算により他のパラメータに影響を与えずに設定します。)
2013年 5月29日
1.08●音源ドライバー本体
- ・儕CMが停止できなくなっていたバグを修正。
- ●MMLコンパイラ
- ・cis-moll, gis-moll, dis-mollの不具合を修正。
2013年 5月13日
1.07●音源ドライバー本体
- ・ノイズチャンネルで音色エンベロープが出来なかったバグを修正。
- ・再生ルーチン処理中にIRQが発生するNSFプレイヤーにおいて、 - 儕CM-IRQを使用時に正常に再生されない可能性があるバグを修正。
- (※実機では、NMIの方が優先順位が高いため、この現象は発生しません。)
- ●MMLコンパイラ
- ・NSFへビルドする場合に、音源ドライバー情報をNSFに含めるようにした。
- (※この情報は、音源ドライバのライブラリ本体には含まれていません。)
- ・NSFへビルドする場合に、サイズ、バンク数などの情報を出力するようにした。
- ・K{}コマンドにおいて、短調の調号指定が一部音楽理論的に間違えていたミスを修正。
- ・エラー、警告のメッセージの内容を全体的に見直した。
- ●取扱説明書
- ・スケールとコードの関係表に4和音のコードを追加。
- ・FAQによくある質問を追加した。
- ・いくらかの誤植を修正。
2013年 5月12日
1.06●音源ドライバー本体
- ・効果音発音終了時に、BGMの音程に戻らない場合があるバグを修正。
-
2013年 4月13日
1.05●音源ドライバー本体
- ・nsd_vrc6.binが、TNS-HFC3で鳴らなくなっていた不具合を修正。
- ●MMLコンパイラ
- ・Scale()コマンドを実装した。
-  K{}コマンドの調指定とあわせ、その調におけるスケール(20種)を設定できるようになりました。
- ●取扱説明書
- ・いくらかの誤植を修正。
2013年 4月10日
1.04●MMLコンパイラ
- ・オプションスイッチで何も指定しない場合は、NSFに変換するようにした。
-  MMLをD&Dしてコンパイルできるようになりました。
-  (※その場合は、カレントディレクトリは、MMLコンパイラのあるディレクトリです。)
- ・K{}コマンドで、調(例:C-Dur, c-moll, etc..)で指定できるようにした、
- ●ROMイメージ(nsf)の起動コード & MMLコンパイラ
- ・TNS-HFC3で、儕CMのIRQを使用する方法を思いついたので、対応した。
- ●取扱説明書
- ・チュートリアル作成中(まだ、作り途中です)。
2013年 4月 6日
1.03●MMLコンパイラ
- ・ストトン記法に対応。
- ●その他
- ・`sample\template'フォルダーに、「MML記法」及び「ストトン記法」のテンプレートを追加した。
2013年 3月12日
1.02●MMLコンパイラ
- ・NSFヘッダーの拡張音源フラグを指定する#Externalコマンドを実装した。
- ・#Bankコマンド指定時に、NSF中でシーケンス領域を固定で24kByte確保いていたのを、サイズに合わせるようにした。
- ●取扱説明書
- ・儕CMの定義ブロック部において、サンプリングレートの説明が抜けていた。
2013年 2月20日
1.01●音源ドライバー本体
- ・nsd_all.bin 及び nsd_all2.bin にて、儕CMのバンク切り替え及びIRQに対応した。
- ●MMLコンパイラ
- ・#Bankコマンド(上述の.binを使う場合に指定)を追加した。
- ・儕CMの記述ブロックにおいて、IRQに対応した。
- ●取扱説明書
- ・各.lib/.binの仕様の説明を追加した。
2013年 2月15日
1.00●音源ドライバー本体
- ・一時停止関数(nsd_pause_bgm())及び、再生再開関数(nsd_resume_bgm())を実装した。
- ・nsd_stop_bgm()関数で再生停止したときに発音中の音があった場合、鳴りっぱなしになっていたバグを修正。
- ●MMLコンパイラ
- ・マクロに対応した。
- ・疑似エコーに、スラーで繋げるモードを追加した。
- ・リピート(A)コマンドにて、リピート回数をどちらにも記述できるようにした。
- ・アセンブリ言語ソースを出力する際に、数値が3桁毎にカンマが出てしまっていたバグを修正。
- ・#SegmentPCMコマンドが機能していなかったバグを修正。
- ・#SegmentPCMコマンドにて""を指定した際、アセンブリ言語で儕CMの実体を出力しないようにした。
- ●取扱説明書
- ・これまでに質問があった内容を、FAQに記載しました。
- ・その他、色々と見直しました。
- ●その他
- ・アセンブリ言語から nsd.lib を制御するサンプルソースを作った。
2013年 2月 9日
-
- -
-

改訂履歴(α・β版)

-

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ヴァージョン内容改定日
0.27β●音源ドライバー本体
- ・使用するRAMの量を若干減らした。
- ●MMLコンパイラ
- ・TRコマンドにて複数トラックの指定に対応した。
2013年 1月18日
0.26β●音源ドライバー本体
- ・拡張音源使用時に、使用するRAMの量を若干減らした。
- ●MMLコンパイラ
- ・#timebase コマンドを実装した。
2013年 1月11日
0.25β●音源ドライバー本体
- ・FDSに対応。
- ・BGMから、SE(効果音)を呼べるようにした。
- ・効果音発音終了時に、BGMへうまく復帰できていなかったバグを修正。
- ●MMLコンパイラ
- ・FDS関連のコマンド群を実装した。
- ・SEを呼ぶコマンド SE を実装した。
2013年 1月10日
0.24β●MMLコンパイラ
- ・#offsetE@, #offsetEv, #offsetEm, #offsetEnコマンドを追加した。
- ●取扱説明書
- ・Spcial Thanksを追加しました。
- ・VRC7の音色について、また、少し数学的な解説を追記した。
2013年 1月 5日
0.23β●MMLコンパイラ
- ・エンベロープ定義で、(start,end,length)の指定をできるようにした。
- ●取扱説明書
- ・VRC7の音色パラメータについて、少し解説を追記した。
- ・nsd_oall.binの仕様を記載(書き忘れていた)。
2012年12月22日
0.22β●MMLコンパイラ
- ・gccでコンパイルできるように、ソースを修正。
-  (C++の機能だけを使っているつもりが、Visual C++の機能を使っていた。)
- ●その他
- ・修正BSDライセンス(但しNSFデータは除外)に変更しました。
-
2012年12月 1日
0.21β●音源ドライバー本体
- ・OPLLのリズム音源の仕様を変更。音程を持たせれるようにした。
- ・OPLLのリズム音源がちゃんとなってなかったバグをFix。
- ・曲頭の休符に、通常の休符を使うと不要な音が鳴ってしまっていた仕様を改善。鳴らなくした。
-
2012年11月19日
0.20β●音源ドライバー本体
- ・ノートナンバー64以降の儕CMの定義が適用されていなかったバグを修正。
- ・OPLLに対応(改造VRC7搭載カートリッジ)。
- ●MMLコンパイラ
- ・儕CMを使う曲をnsfにビルドする際に、少しファイルサイズが小さくなるようにした。
- ●取扱説明書
- ・疑似エコー及び、制御トラックが説明不足だった点を加筆。
2012年11月13日
0.19β●音源ドライバー本体
- ・"nsd_all.bin"に、音源に割り当てないトラックを設けた。
-  テンポコマンドや、n106/163とVRC7の音色設定等の設定トラックとして使用可能です。
- ・いつの間にか、効果音がならなくなっていたバグを修正。
- ●MMLコンパイラ
- ・疑似エコー(MMLコンパイラ側の命令です)を実装しました。
- ・範囲コメントの終端 */ の直後(スペースを空けず)に記述したコマンドが認識されなかったバグを修正。
- ●取扱説明書
- ・ちょっと見やすさを考えてみた。
2012年11月12日
0.18β●音源ドライバー本体
- ・Sunsoft 5Bに対応。
- ・Rm0コマンドで、儕CMが指定音長でKeyOffされなかったバグをFix。
- ●MMLコンパイラ
- ・バンクが不連続に配置されたnsfに非対応の実機再生環境に対応(TNS-HFC3など)。
- ●取扱説明書
- ・Rm0コマンドで、儕CMが指定音長でKeyOffされる旨を記載(書き忘れていた)。
2012年10月22日
0.17β●音源ドライバー本体
- ・n163にて、アドレス$40番地以降(@命令にて32に相当するアドレス)の波形データを破壊してしまっていたバグを修正。
-
2012年10月19日
0.16β●音源ドライバー本体
- ・Version 0.10β〜0.15βにて、実機で鳴らなくなっていた不具合を修正。
- ●取扱説明書
- ・n163の使い方の解説ページを追加。
2012年10月15日
0.15β●音源ドライバー本体
- ・n163に対応。
2012年10月11日
0.14β●音源ドライバー本体
- ・色々と拡張音源を実装するに当たり、改めてコードを再確認。無駄なコードを省いて若干最適化した。
- ・nsd_all.binを作った。現状、内蔵音源及びVRC6 VRC7 MMC5のみに対応です。
- ●取扱説明書
- ・取説を見直して、若干、再構成した。
2012年10月 6日
0.13β●音源ドライバー本体
- ・VRC7に対応。
2012年10月 3日
0.12β●音源ドライバー本体
- ・儕CMの休符の処理で、r,r+ の挙動と、 r- の挙動が逆になってたバグをFix。
2012年10月 2日
0.11β●音源ドライバー本体
- ・VRC6に対応。
- ・MMC5に対応。
2012年10月 1日
0.10β●音源ドライバー本体
- ・儕CMに対応。
- ●MMLコンパイラ
- ・儕CM対応により、DPCM{}記述ブロックが増えました。
- ・TR5の各音階に、儕CMを割り当てることができます。
- ●取扱説明書
- ・「索引」と「検索」を実装した。
2012年 9月30日
0.07α●音源ドライバー本体
- ・儕CMルーチンを開発中(未デバッグです)。
- ●MMLコンパイラ
- ・コンパイルオプションで、NSF用の実行コード(*.bin)を指定できるようにした。
- ・nsfにコンパイルする場合において、実行コードを0xE000番地から0x8000番地に変更した。
-  これにより、儕CMが実装できれば、合計16KByte(0xC000〜0xFFFF番地)使えるようになります。
- ・"#offsetPCM"コマンドを実装。曲データはこのアドレス-1までの領域とし、これ以後を儕CMの領域として割り当てます。
- ・それに伴い、シーケンスデータが"#offsetPCM"コマンドで指定したアドレスを超えた場合に、エラーを吐くようにした。
-  (シーケンスデータが32kByteを超えると、コンパイラがハングするバグがありました。)
- ・アセンブリ言語出力に対応した。
- ・また、それに伴い、出力するアセンブリ言語に対して、各種設定するコマンドを実装。
- ・アセンブリ言語出力に対応したので、アーカイブ中の"\sample\cc65\"のサンプルC言語コードも書き直しました。
-
2012年 9月25日
0.06α●音源ドライバー本体
- ・ポルタメントに対応した。
- ●MMLコンパイラ
- ・エンベロープ・サブルーチンにおいて、0〜4294967295番まで指定できるようにした(以前は0〜65535番でした)。
- ・エンベロープのパターン定義において、Lコマンドを省略できるようにした。
- ・エンベロープのパターン定義において、音源ドライバが暴走するようなパターン定義の場合、エラーを吐くようにした。
- ・K{}コマンド(調号)により、r(休符)にも自動で調号(キーオフのモード指定)を付けられるようにした。
- ●取扱説明書
- ・休符や、エンベロープについて説明が足りていなかったので、追記した。
- ・FAQのページを作成した。
2012年 9月17日
0.05α●音源ドライバー本体
- ・効果音処理ルーチンを開発中(一応、効果音が使えるようになってますが、未デバッグです)。
- ●取扱説明書
- ・BGM,SEデータフォーマット(Format of BGM and SE)のページにおいて、エンベロープがまだ実装されていないことになっていた記述を修正。
- ●SDK
- ・アセンブリ言語及び、C言語用のヘッダーファイルを作成した。"include"フォルダを参照。
- ●MMLコンパイラ
- ・音名・休符コマンドに、付点のみを指定できなかったバグを修正。
2012年 9月12日
0.04α●取扱説明書
- ・主に、ノイズチャンネル関連の説明が不足していた点を加筆。
- ●MMLコンパイラ
- ・0及び9から始まる音長を、コンパイルできなかったバグを修正(水平展開できてなかった)。
- ・音長で0を指定すると、例外が発生して異常終了するバグを修正。
2012年 9月 7日
0.03α●音源ドライバー本体
- ・エンベロープを4系統実装した。
- ●MMLコンパイラ
- ・オクターブの設定値が1つ高かったバグを修正。
- ・0及び9から始まる数値を、コンパイルできなかったバグを修正。
- ・サブルーチン番号で128を超えた場合に、コンパイルできないことがあったバグを修正。
- ・トラック先頭に L コマンドを書いた場合、無限ループされないコードにコンパイルしていたバグを修正。
2012年 9月 6日
0.02α●音源ドライバー本体
- ・休符時の音量の状態が設計どおりで無かったバグを修正。
- ・サブルーチンからの復帰時に、戻り先のアドレスがずれていたバグを修正。
- ・リピート(A)命令でリピートされなかったバグを修正。
- ・リピート(B)命令をもう1系統作った。(op-code 0x18〜0x1A)
- ・音色命令を追加(op-code 0x1B)。この命令は、音色エンベロープと排他的に使用できる予定です。
- ●MMLコンパイラ
- ・作りました。
2012年 9月 3日
0.01αα版です。
- どこまで動くかは分からないが、評価版として公開。
- まずは、音源ドライバーを設計。
- 効果音はまだ実装していませんので、効果音関係の関数は呼ばないでください。
2012年 8月10日
-
-
- - - \ No newline at end of file diff --git a/src/help/revision.html b/src/help/revision.html index 970917e..93e38f0 100644 --- a/src/help/revision.html +++ b/src/help/revision.html @@ -25,6 +25,13 @@

+ + +
ヴァージョン内容改定日
1.17●MMLコンパイラ
+ ・MMLコンパイラ展開のリピートを実装した。
+ ・#RepeatModeコマンド(リピートコマンドの展開方法の設定)を実装した。
+ ・#ReleaseVolumeコマンド(デフォルトのリリース音量の設定)を実装した。
+
2014年 5月12日
1.16 ●音源ドライバー本体
・利便性を考え、makefileや、ヘッダーファイルを作り直した。
diff --git a/src/help/variable.BAK b/src/help/variable.BAK deleted file mode 100644 index 0b96953..0000000 --- a/src/help/variable.BAK +++ /dev/null @@ -1,604 +0,0 @@ - - - - - - - -音源ドライバーの制御用変数 - - - - - - - -
-

音源ドライバーの制御用変数

- -
-

-音源ドライバーの制御用変数です。
-本音源ドライバーを用いたアプリケーションを開発する際に、 -音源ドライバーの制御状態を知りたい時にご参照ください。
-尚、音源ドライバーの制御用変数にアクセスするには、アセンブリ言語中にて以下の通り外部宣言することで可能です。
-

- -
-        .include        "nsd.inc"
-
- -

-配列変数で記載されるメンバー変数は、構造体定義内容の通り2Byte毎に配置しています。
-xレジスタ等に、(トラック番号−1)×2の値を書くと、アクセスに便利です。
-

- -

-尚、ヴァージョンアップにより、制御変数の構造体の構成が変わる場合がある旨、ご理解の程、宜しくお願い致します。
-又、拡張音源用のメンバー変数は割愛します(拡張音源を使用しない場合は、拡張音源用のメンバー変数は構造体のメンバーに入りません)。
-

- - -
- -
-

Segment "zeropage" に配置される変数

- -
-

nsd_work_zp

-

-Zeropageに置かれる制御用変数(構造体)です。
-頻度に(1tick中で何度も)使用するため、アクセス速度の速いZeropage領域に配置しています。
-

- - - - - - - - - - - - - - - - - - - - - - - - - - -
変数の内容
変数名内容
__ptr汎用変数(ポインター用)
- 尚、内容を保持する必要はありません。
- ユーザーがこの領域を一時的な変数領域として使用して構いませんが、 - 本音源ドライバのライブラリ関数を呼んだ場合、内容は破壊される旨、ご留意ください。
__tmp汎用変数(計算用)
- 尚、内容を保持する必要はありません。
- ユーザーがこの領域を一時的な変数領域として使用して構いませんが、 - 本音源ドライバのライブラリ関数を呼んだ場合、内容は破壊される旨、ご留意ください。
channel現在制御中のチャンネル
- 尚、内容を保持する必要はありません。
- ユーザーがこの領域を一時的な変数領域として使用して構いませんが、 - 本音源ドライバのライブラリ関数を呼んだ場合、内容は破壊される旨、ご留意ください。
__flag音源ドライバ全体のフラグ
__Tempoテンポ(tコマンドの数値)
__Tempo_ctrテンポカウンタ
__Sequence_ptr演奏ポインタ
__Length_ctr音長カウンタ
__Gate現在の音符のゲートタイム
__Envelop_V音色・音量エンベロープのホールドタイム用のカウンタ
__Envelop_F音程・ノートエンベロープのホールドタイム用のカウンタ
- -

-以下は、実際の構造体定義です。 -

-
-typedef struct NSD_work_zp {
-    int     _ptr;
-    int     _tmp;
-    char    channel;
-    int     Sequence_ptr[n];
-    struct  NSD_Length_Cnt {
-                char    counter;
-                char    gate;
-            } Length[n];
-    struct  NSD_Envelop {
-                char    V;
-                char    F;
-            } Envelop[n];
-} nsd_work_zp;
-
- -

-メモリ節約のため、一部の変数(__flag, __Tempo, __Tempo_ctr)は、 -三角波トラック、凾oCMのトラックでは使われない領域を使用します。 -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
構造体メンバーと、変数名の関係
メンバー名変数名ch1ch2ch3ch4ch5
_ptr __ptr
_tmp __tmp
channel __channel
Sequence_ptr[n] __Sequence_ptr
NSD_Length[n]_Cnt.counter __Length_ctr
NSD_Length[n]_Cnt.gate __Gate
NSD_Envelop[n].V __Envelop_V __flag __Tempo_ctr
NSD_Envelop[n].F __Envelop_F __Tempo
-
- - -
- -
- -
-

Segment "bss" に配置される変数

- -
-

nsd_work

-

-通常のRAM領域に置かれる制御用変数(構造体)です。
-音源ドライバーだけでzeropageを占有できないので、通常のRAM領域に配置します。
-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
変数の内容
変数名内容
__chflagチャンネル毎のフラグ
__gatemode.... ..rr : ゲートモード(Rmコマンドの設定値)
- .... e... : 音色エンベロープのスイッチ
- vvvv .... : リリース時の音色(R@コマンドの数値)
__length音長省略時の音長(lコマンドの設定値)
__taiスラー・タイ制御
__gate_qゲートタイム(qコマンドの設定値)
__gate_uゲートタイム(uコマンドの設定値)
__note現在発音しているノートナンバー
__octave現在のオクターブ(oコマンドの数値×12)
__detune_centcent単位のディチューン(Dコマンドの数値)
__detune_fineレジスタ単位のディチューン(D%コマンドの数値)
__por_targetポルタメント制御用(目標値)
__por_depthポルタメント制御用(一回の変化量)
__por_ctrポルタメント制御用(カウンター)
__por_rateポルタメント制御用(何フレームで変化するか?)
__por_nowポルタメント制御用(現在の変位)
__trans移調(_コマンドの数値)
__trans_one一回限りの移調(', "コマンド制御用)
__repeat_ctrリピートAのカウンタ
__repeat_ctr2リピートBのカウンタ
__volume音量(v, Rvコマンドの数値)
__env_vol_now音量エンベロープの現在値
__env_freq_now音程エンベロープの現在値
__env_note_nowノートエンベロープの現在値
__env_vol_ptr音量エンベロープの推移制御用のポインタ
__env_voi_ptr音色エンベロープの推移制御用のポインタ
__env_freq_ptr音程エンベロープの推移制御用のポインタ
__env_note_ptrノートエンベロープの推移制御用のポインタ
__env_volume音量エンベロープ・テーブルのポインタ
__env_voice音色エンベロープ・テーブルのポインタ
__env_frequency周波数エンベロープ・テーブルのポインタ
__env_noteノートエンベロープ・テーブルのポインタ
__frequency現在発音している音程(音程・ノートエンベロープ適用後)
__subroutineサブルーチンの戻りアドレス
__repeat2リピートBでの次のジャンプ先アドレス
__dpcm_info儕CM制御構造体のポインタとして使用する。
__apu_voice_set1APU ch1の音色(レジスタ書込みの為の論理演算用)
__apu_voice_set2APU ch2の音色(レジスタ書込みの為の論理演算用)
__apu_voice_set4APU ch4の音色(レジスタ書込みの為の論理演算用)
__apu_voice_set1SE ch1の音色(レジスタ書込みの為の論理演算用)
__apu_voice_set2SE ch1の音色(レジスタ書込みの為の論理演算用)
__apu_frequency1APU ch1の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
__apu_frequency2APU ch2の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
__apu_frequency3APU ch3の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
__se_frequencySE ch1の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
__sweep_ch1APU ch1のsweepレジスタの現在値
__sweep_ch2APU ch2のsweepレジスタの現在値
- - -
-typedef struct NSD_work {
-    struct  NSD_Flag {
-                char    flag;
-                char    gatemode;
-            } Flag[n];
-    struct  NSD_length {
-                char    length;
-                char    tai;
-            } Length[n];
-    struct  NSD_gatetime {
-                char    q;
-                char    u;
-            } Gatetime[n];
-    struct  NSD_note {
-                char    note;
-                char    octave;
-            } Note[n];
-    struct  NSD_Detune {
-                char    cent;
-                char    fine;
-            } Detune[n];
-    struct  NSD_Por_Lv {
-                char    target;
-                char    depth;
-            } Por_Lv[n];
-    struct  NSD_Por_Co {
-                char    count;
-                char    rate;
-            } Por_Co[n];
-    int     Por_now[n];
-    struct   NSD_Trans{
-                char    trans;
-                char    onetime;
-            } Trans[n];
-    struct   NSD_Repeat{
-                char    count1;
-                char    count2;
-            } Repeat[n];
-    struct   NSD_volume{
-                char    volume;
-                char    volume_env;
-            } Volume[n];
-    struct   NSD_Env_F_Now{
-                char    Frequency;
-                char    Note;
-            } Env_F_Now[n];
-    struct   NSD_Env_V_Ptr{
-                char    Volume;
-                char    Voice;
-            } Env_V_Ptr[n];
-    struct   NSD_Env_F_Ptr{
-                char    Frequency;
-                char    Note;
-            } Env_F_Ptr[n];
-    int     Envelop_Volume[n];
-    int     Envelop_Voice[n];
-    int     Envelop_Freq[n];
-    int     Envelop_Note[n];
-    int     Frequency[n];
-    int     SubRoutine[n];
-    int     Repeat2[n];
-} nsd_work;
-
- -

-メモリ節約のため、一部の変数は、三角波トラック、凾oCMのトラックでは使われない領域を使用します。 -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
構造体メンバーと、変数名の関係
メンバー名変数名ch1ch2ch3ch4ch5
Flag[n].flag__chflag
Flag[n].gatemode__gatemode
Length[n].length__length
Length[n].tai__tai
Gatetime[n].q__gate_q
Gatetime[n].u__gate_u
Note[n].note__note
Note[n].octave__octave
Detune[n].cent__detune_cent
Detune[n].fine__detune_fine
Por_Lv[n].target__por_target __apu_frequency1
Por_Lv[n].depth__por_depth __apu_frequency2
Por_Co[n].count__por_ctr __apu_frequency3
Por_Co[n].rate__por_rate __se_frequency
Por_now[n]__por_now __mmc5_frequency1
__mmc5_frequency2
Trans[n].trans__trans
Trans[n].onetime__trans_one
Repeat[n].count1__repeat_ctr
Repeat[n].count2__repeat_ctr2
Volume[n].volume__volume __sweep_ch1
Volume[n].volume_env__env_vol_now __sweep_ch2
Env_F_Now[n].Frequency__env_freq_now
Env_F_Now[n].Note__env_note_now
Env_V_Ptr[n].Volume__env_vol_ptr __dpcm_info (LSB)
Env_V_Ptr[n].Voice__env_voi_ptr __dpcm_info (MSB)
Env_F_Ptr[n].Frequency__env_freq_ptr __se_voice_set1
Env_F_Ptr[n].Note__env_note_ptr __se_voice_set2
Envelop_Volume[n]__env_volume __apu_voice_set1
__apu_voice_set2
Envelop_Voice[n]__env_voice __apu_voice_set4
Envelop_Freq[n]__env_frequency __mmc5_voice_set1
__mmc5_voice_set2
Envelop_Note[n]__env_note __vrc6_voice_set1
__vrc6_voice_set2
Frequency[n]__frequency
SubRoutine[n]__subroutine
Repeat2[n]__repeat2
-

- -
- -
- -
- - - diff --git a/src/nsc/MMLfile.cpp b/src/nsc/MMLfile.cpp index 849e14d..bc86e3d 100644 --- a/src/nsc/MMLfile.cpp +++ b/src/nsc/MMLfile.cpp @@ -19,6 +19,8 @@ MMLfile::MMLfile(const char* strFileName): offset_Ev(0), offset_En(0), offset_Em(0), + iReleaseVolume(2), + iRepeatMode(0), timebase(24), octave_reverse(false), rest(2), diff --git a/src/nsc/MMLfile.h b/src/nsc/MMLfile.h index f4ba71a..8c0f501 100644 --- a/src/nsc/MMLfile.h +++ b/src/nsc/MMLfile.h @@ -37,6 +37,8 @@ class MMLfile // : int offset_Ev; // int offset_En; // int offset_Em; // + int iReleaseVolume; // + int iRepeatMode; // int timebase; // bool octave_reverse; //Octave Reverse int rest; // r コマンドの挙動 diff --git a/src/nsc/MusicFile.cpp b/src/nsc/MusicFile.cpp index 8b85421..be2b407 100644 --- a/src/nsc/MusicFile.cpp +++ b/src/nsc/MusicFile.cpp @@ -48,6 +48,8 @@ enum Command_ID_MusicFile { id_OctaveReverse, id_bgm_num, id_se_num, + id_releaseVolume, + id_repeatMode, id_offset_Ei, id_offset_Ev, id_offset_En, @@ -121,6 +123,10 @@ const static Command_Info Command[] = { { "#SE", id_se_num }, { "#se", id_se_num }, { "効果音数", id_se_num }, + { "#releaseVolume", id_releaseVolume}, + { "#ReleaseVolume", id_releaseVolume}, + { "#repeatMode", id_repeatMode }, + { "#RepeatMode", id_repeatMode }, { "#OffsetE@", id_offset_Ei }, { "#offsetE@", id_offset_Ei }, { "#OffsetEv", id_offset_Ev }, @@ -262,6 +268,18 @@ const static Command_Info Command[] = { case(id_OctaveReverse): MML->octave_reverse = true; //これは、MMLファイルの属性。 break; + case(id_releaseVolume): + MML->iReleaseVolume = MML->GetInt(); + if((MML->iReleaseVolume<0) || (MML->iReleaseVolume>15)){ + MML->Err(L"#ReleaseVolumeコマンドは、0〜15の範囲で指定してください。"); + } + break; + case(id_repeatMode): + MML->iRepeatMode = MML->GetInt(); + if((MML->iRepeatMode<0) || (MML->iRepeatMode>2)){ + MML->Err(L"#RepeatModeコマンドは、0〜2の範囲で指定してください。"); + } + break; case(id_offset_Ei): MML->offset_Ei = MML->GetInt(); break; diff --git a/src/nsc/MusicItem.cpp b/src/nsc/MusicItem.cpp index 0ce245b..a52f5db 100644 --- a/src/nsc/MusicItem.cpp +++ b/src/nsc/MusicItem.cpp @@ -36,7 +36,7 @@ MusicItem::~MusicItem(void) { //---------------------- //Local変数 - vector< MusicItem*>::iterator itItem; + list< MusicItem*>::iterator itItem; //---------------------- //Delete Class @@ -88,7 +88,7 @@ unsigned int MusicItem::SetOffset(unsigned int _offset) { //---------------------- //Local変数 - vector< MusicItem*>::iterator itItem; + list< MusicItem*>::iterator itItem; //Debug message (うざい程出力するので注意。) if(cOptionSW->cDebug & 0x02){ @@ -142,7 +142,7 @@ void MusicItem::getCode(string* _str) { //---------------------- //Local変数 - vector< MusicItem*>::iterator itItem; + list< MusicItem*>::iterator itItem; _str->append(code); @@ -155,6 +155,21 @@ void MusicItem::getCode(string* _str) } } +//============================================================== +// コードの設定 +//-------------------------------------------------------------- +// ●引数 +// string* _str +// ●返値 +// 無し +//============================================================== +void MusicItem::setCode(string* _str) +{ + code.clear(); + code.assign(*_str); + iSize = code.size(); +} + //============================================================== // コードの取得 //-------------------------------------------------------------- @@ -168,7 +183,7 @@ void MusicItem::getAsm(MusicFile* MUS) //---------------------- //Local変数 unsigned int i = 0; - vector< MusicItem*>::iterator itItem; + list< MusicItem*>::iterator itItem; if(code.size() > 0){ while(i < code.size()){ diff --git a/src/nsc/MusicItem.h b/src/nsc/MusicItem.h index 148979e..70690b0 100644 --- a/src/nsc/MusicItem.h +++ b/src/nsc/MusicItem.h @@ -16,7 +16,7 @@ class MusicItem //メンバー変数 protected: const wchar_t* strName; //オブジェクトの名称 - vector ptcItem; //構造化 + list ptcItem; //構造化 string code; size_t iSize; unsigned int iOffset; //SNDファイルポインタ @@ -33,5 +33,6 @@ class MusicItem unsigned char getCode(int n); virtual void getCode(string* _str); + virtual void setCode(string* _str); virtual void getAsm(MusicFile* MUS); }; diff --git a/src/nsc/MusicTrack.cpp b/src/nsc/MusicTrack.cpp index 79a9aa9..82d4b2b 100644 --- a/src/nsc/MusicTrack.cpp +++ b/src/nsc/MusicTrack.cpp @@ -22,6 +22,7 @@ MusicTrack::MusicTrack(MMLfile* MML, const wchar_t _strName[]): offset_repeat_a_b(0), //リピートA offset_repeat_b_s(0), //リピートB offset_repeat_b_b(0), //リピートB + sp_repeat_c(0), DefaultLength(-1), volume(15), octave(5), @@ -76,16 +77,16 @@ unsigned int MusicTrack::TickCount(MusicFile* MUS, unsigned int iLength) { //---------------------- //Local変数 - vector< MusicItem*>::iterator itItem; + list< MusicItem*>::iterator itItem; unsigned char iCode; - vector< MusicItem*>::iterator itRepeatA_start; - vector< MusicItem*>::iterator itRepeatA_end; + list< MusicItem*>::iterator itRepeatA_start; + list< MusicItem*>::iterator itRepeatA_end; int iRepeatA_count = 0; bool f_RepeatA = false; - vector< MusicItem*>::iterator itRepeatB_start; - vector< MusicItem*>::iterator itRepeatB_end; + list< MusicItem*>::iterator itRepeatB_start; + list< MusicItem*>::iterator itRepeatB_end; int iRepeatB_count = 0; bool f_RepeatB = false; @@ -441,10 +442,19 @@ void MusicTrack::SetEvent(MusicItem* _item) // ●返値 // size_t //============================================================== -size_t MusicTrack::SetEnd(void) +size_t MusicTrack::SetEnd(MMLfile* MML) { mml_Address* _event; + //リピートのチェック + if(offset_repeat_a_s != 0){ + MML->Err(L"リピート(A)が終わっていません。"); + } + if(sp_repeat_c != 0){ + MML->Err(L"リピート(C)が終わっていません。"); + } + + //オブジェクトの作成 if(loop_flag == false){ SetEvent(new mml_general(nsd_EndOfTrack,L"End of Track")); } else { @@ -474,178 +484,452 @@ void MusicTrack::SetLoop() } //============================================================== -// [ リピート(A) 開始 +// |: リピート(B) 開始 //-------------------------------------------------------------- // ●引数 // MMLfile* MML MMLファイルのオブジェクト // ●返値 // 無し //============================================================== -void MusicTrack::SetRepeat_A_Start(MMLfile* MML) +void MusicTrack::SetRepeat_B_Start() { - unsigned char cData = MML->GetChar(); -// int times = MML->GetInt(); + SetEvent(new mml_general(nsd_Repeat_B_Start, L"Repeat(B) Start")); + offset_repeat_b_s = offset_now; // :| コマンドでは、次のコマンドに戻る。 + offset_repeat_b_b = 0; - MML->Back(); + Reset_opt(); +} - if((cData < '0') || (cData > '9')){ - count_repeat_a = -1; - } else { - count_repeat_a = MML->GetInt(); - if( (count_repeat_a > 255) || (count_repeat_a < 1) ){ - MML->Err(L"リピート回数は1〜255の範囲で指定して下さい。"); +//============================================================== +// \ リピート(B) 分岐 +//-------------------------------------------------------------- +// ●引数 +// MMLfile* MML MMLファイルのオブジェクト +// ●返値 +// 無し +//============================================================== +void MusicTrack::SetRepeat_B_Branch(MMLfile* MML) +{ + if(offset_repeat_b_s != 0){ + if(offset_repeat_b_b == 0){ + offset_repeat_b_b = offset_now; //コマンドがあった事を示す。 + SetEvent(new mml_general(nsd_Repeat_B_Branch, L"Repeat(B) Branch")); + } else { + MML->Err(L"リピート(B)内で \\ コマンドが重複しています。"); } + } else { + MML->Err(L"リピート(B)の開始 |: コマンドがありません。"); } - _old_repeat = new mml_repeat(); - - SetEvent(_old_repeat); - offset_repeat_a_s = offset_now; // ] コマンドでは、次のコマンドに戻る。 - offset_repeat_a_b = 0; - - Reset_opt(); } //============================================================== -// : リピート(A) 分岐 +// :| リピート(B) 終了 //-------------------------------------------------------------- // ●引数 // MMLfile* MML MMLファイルのオブジェクト // ●返値 // 無し //============================================================== -void MusicTrack::SetRepeat_A_Branch(MMLfile* MML) +void MusicTrack::SetRepeat_B_End(MMLfile* MML) { - if(offset_repeat_a_s != 0){ - if(offset_repeat_a_b == 0){ - offset_repeat_a_b = offset_now + 1; //引数の位置 - _old_repeatA_Branch = new mml_Address(nsd_Repeat_A_Branch, L"Repeat(A) Branch"); - SetEvent(_old_repeatA_Branch); + mml_Address* _event; + + if(offset_repeat_b_s != 0){ + if(offset_repeat_b_b != 0){ + if(offset_repeat_b_s < offset_repeat_a_s){ + MML->Err(L"リピート(A)の区間の途中です。"); + } + _event = new mml_Address(nsd_Repeat_B_End, L"Repeat(B) End"); + _event->set_Address(offset_repeat_b_s - offset_now - 1); + SetEvent(_event); } else { - MML->Err(L"リピート(A)内で : コマンドが重複しています。"); + MML->Err(L"リピート(B)内で \\ コマンドがありませんでした。必ず分岐点 \\ は指定してください。"); } } else { - MML->Err(L"リピート(A)の開始 [ コマンドがありません。"); + MML->Err(L"リピート(B)の開始 |: コマンドがありません。"); } + + Reset_opt(); } //============================================================== -// ] リピート(A) 終了 +// : リピート (A) (C) 開始 //-------------------------------------------------------------- // ●引数 // MMLfile* MML MMLファイルのオブジェクト // ●返値 // 無し //============================================================== -void MusicTrack::SetRepeat_A_End(MMLfile* MML) +void MusicTrack::SetRepeat_Start(MMLfile* MML) { + if(offset_repeat_a_s == 0){ + SetRepeat_A_Start(MML); + } else { + SetRepeat_C_Start(MML); + } +} - mml_Address* _event; +//============================================================== +// [ リピート(A) 開始 +//-------------------------------------------------------------- +// ●引数 +// MMLfile* MML MMLファイルのオブジェクト +// ●返値 +// 無し +//============================================================== +void MusicTrack::SetRepeat_A_Start(MMLfile* MML) +{ unsigned char cData = MML->GetChar(); -// int times = MML->GetInt(); MML->Back(); if((cData < '0') || (cData > '9')){ - //引数が無い場合 - if(count_repeat_a == -1){ - MML->Err(L"リピート回数の記述がありません。"); - } + count_repeat_a = -1; } else { - //引数がある場合 - if(count_repeat_a != -1){ - MML->Err(L"リピート回数が両方に記述されています。"); - } count_repeat_a = MML->GetInt(); - if( (count_repeat_a > 255) || (count_repeat_a < 1) ){ - MML->Err(L"リピート回数は1〜255の範囲で指定して下さい。"); + if( (count_repeat_a > 255) || (count_repeat_a < 2) ){ + MML->Err(L"リピート回数は2〜255の範囲で指定して下さい。"); } } - _old_repeat->set_count((unsigned char)count_repeat_a); - if(offset_repeat_a_s != 0){ - _event = new mml_Address(nsd_Repeat_A_End, L"Repeat(A) End"); - _event->set_Address(offset_repeat_a_s - offset_now - 1); - SetEvent(_event); - //条件分岐があったら。 - if(offset_repeat_a_b != 0){ - _old_repeatA_Branch->set_Address(offset_now - offset_repeat_a_b); - } - offset_repeat_a_s = 0; + MML->Err(L"リピート(A)のネストはできません。"); } else { - MML->Err(L"リピート(A)の開始 [ コマンドがありません。"); + _old_repeat = new mml_repeat(); + + SetEvent(_old_repeat); + offset_repeat_a_s = offset_now; // ] コマンドでは、次のコマンドに戻る。 + offset_repeat_a_b = 0; + + Reset_opt(); } - Reset_opt(); + + //リピートタイプの記憶 + repeat_type.push_back(1); + it_repeat_type = repeat_type.end(); + it_repeat_type--; +} + +//============================================================== +// [: リピート(C) 開始 +//-------------------------------------------------------------- +// ●引数 +// MMLfile* MML MMLファイルのオブジェクト +// ●返値 +// 無し +//============================================================== +void MusicTrack::SetRepeat_C_Start(MMLfile* MML) +{ + list::iterator pt_itMusic = ptcItem.end(); + unsigned char cData = MML->GetChar(); + int repeat_cnt; + + MML->Back(); + + if((cData < '0') || (cData > '9')){ + repeat_cnt = -1; + } else { + repeat_cnt = MML->GetInt(); + if( (repeat_cnt > 255) || (repeat_cnt < 2) ){ + MML->Err(L"リピート回数は2〜255の範囲で指定して下さい。"); + } + } + + //スタックの作成 + pt_itMusic--; + st_ct_repeat_c.push_back(repeat_cnt); + st_it_repeat_c_s.push_back(pt_itMusic); + st_it_repeat_c_b.push_back(pt_itMusic); + st_it_repeat_c_e.push_back(pt_itMusic); + sp_repeat_c++; + + //最後尾のイテレータを取得 + it_ct_repeat_c = st_ct_repeat_c.end(); + it_it_repeat_c_s = st_it_repeat_c_s.end(); + it_it_repeat_c_b = st_it_repeat_c_b.end(); + it_it_repeat_c_e = st_it_repeat_c_e.end(); + + it_ct_repeat_c--; + it_it_repeat_c_s--; + it_it_repeat_c_b--; + it_it_repeat_c_e--; + + //リピートタイプの記憶 + repeat_type.push_back(3); + it_repeat_type = repeat_type.end(); + it_repeat_type--; + } //============================================================== -// |: リピート(B) 開始 +// : リピート (A) (C) 分岐 //-------------------------------------------------------------- // ●引数 // MMLfile* MML MMLファイルのオブジェクト // ●返値 // 無し //============================================================== -void MusicTrack::SetRepeat_B_Start() +void MusicTrack::SetRepeat_Branch(MMLfile* MML) { - SetEvent(new mml_general(nsd_Repeat_B_Start, L"Repeat(B) Start")); - offset_repeat_b_s = offset_now; // :| コマンドでは、次のコマンドに戻る。 - offset_repeat_b_b = 0; + list::iterator pt_itMusic = ptcItem.end(); + + switch(*it_repeat_type){ + case(1): + if(offset_repeat_a_s != 0){ + if(offset_repeat_a_b == 0){ + offset_repeat_a_b = offset_now + 1; //引数の位置 + _old_repeatA_Branch = new mml_Address(nsd_Repeat_A_Branch, L"Repeat(A) Branch"); + SetEvent(_old_repeatA_Branch); + } else { + MML->Err(L"リピート(A)内で : コマンドが重複しています。"); + } + } else { + MML->Err(L"リピート(A)の開始 [ コマンドがありません。"); + } + break; + case(3): + if(sp_repeat_c > 0){ + if((*it_it_repeat_c_b) == (*it_it_repeat_c_s)){ + pt_itMusic--; + (*it_it_repeat_c_b) = pt_itMusic; + } else { + MML->Err(L"リピート(C)内で : コマンドが重複しています。"); + } + } else { + MML->Err(L"リピート(C)の開始 [: コマンドがありません。"); + } + break; + default: + MML->Err(L"リピート開始コマンドがありません。"); + break; + } - Reset_opt(); } //============================================================== -// \ リピート(B) 分岐 +// : リピート (A) (C) 終了 //-------------------------------------------------------------- // ●引数 // MMLfile* MML MMLファイルのオブジェクト // ●返値 // 無し //============================================================== -void MusicTrack::SetRepeat_B_Branch(MMLfile* MML) +void MusicTrack::SetRepeat_End(MMLfile* MML) { - if(offset_repeat_b_s != 0){ - if(offset_repeat_b_b == 0){ - offset_repeat_b_b = offset_now; //コマンドがあった事を示す。 - SetEvent(new mml_general(nsd_Repeat_B_Branch, L"Repeat(B) Branch")); + switch(*it_repeat_type){ + case(1): + SetRepeat_A_End(MML); + break; + case(3): + SetRepeat_C_End(MML); + break; + default: + MML->Err(L"リピート開始コマンドがありません。"); + break; + } +} + +//============================================================== +// ] リピート(A) 終了 +//-------------------------------------------------------------- +// ●引数 +// MMLfile* MML MMLファイルのオブジェクト +// ●返値 +// 無し +//============================================================== +void MusicTrack::SetRepeat_A_End(MMLfile* MML) +{ + + if((offset_repeat_a_s == 0) || ((*it_repeat_type) != 1)){ + MML->Err(L"リピート(A)の開始 [ コマンドがありません。"); + + } else { + + mml_Address* _event; + unsigned char cData = MML->GetChar(); + + MML->Back(); + + if((cData < '0') || (cData > '9')){ + //引数が無い場合 + if(count_repeat_a == -1){ + MML->Err(L"リピート回数の記述がありません。"); + } } else { - MML->Err(L"リピート(B)内で \\ コマンドが重複しています。"); + //引数がある場合 + if(count_repeat_a != -1){ + MML->Err(L"リピート回数が両方に記述されています。"); + } + count_repeat_a = MML->GetInt(); + if( (count_repeat_a > 255) || (count_repeat_a < 2) ){ + MML->Err(L"リピート回数は2〜255の範囲で指定して下さい。"); + } } - } else { - MML->Err(L"リピート(B)の開始 |: コマンドがありません。"); + + _old_repeat->set_count((unsigned char)count_repeat_a); + + _event = new mml_Address(nsd_Repeat_A_End, L"Repeat(A) End"); + _event->set_Address(offset_repeat_a_s - offset_now - 1); + SetEvent(_event); + //条件分岐があったら。 + if(offset_repeat_a_b != 0){ + _old_repeatA_Branch->set_Address(offset_now - offset_repeat_a_b); + } + offset_repeat_a_s = 0; + + Reset_opt(); + + //リピートタイプの復帰 + it_repeat_type--; + repeat_type.pop_back(); } + } //============================================================== -// :| リピート(B) 終了 +// :] リピート(C) 終了 //-------------------------------------------------------------- // ●引数 // MMLfile* MML MMLファイルのオブジェクト // ●返値 // 無し //============================================================== -void MusicTrack::SetRepeat_B_End(MMLfile* MML) +void MusicTrack::SetRepeat_C_End(MMLfile* MML) { - mml_Address* _event; - if(offset_repeat_b_s != 0){ - if(offset_repeat_b_b != 0){ - if(offset_repeat_b_s < offset_repeat_a_s){ - MML->Err(L"リピート(A)の区間の途中です。"); + if((sp_repeat_c == 0) || ((*it_repeat_type) != 3)){ + MML->Err(L"リピート(C)の開始 [: コマンドがありません。"); + } else { + + list::iterator pt_itMusic = ptcItem.end(); + unsigned char cData = MML->GetChar(); + int repeat_cnt = (*it_ct_repeat_c); + + MML->Back(); + + if((cData < '0') || (cData > '9')){ + //引数が無い場合 + if(repeat_cnt == -1){ + MML->Err(L"リピート回数の記述がありません。"); } - _event = new mml_Address(nsd_Repeat_B_End, L"Repeat(B) End"); - _event->set_Address(offset_repeat_b_s - offset_now - 1); - SetEvent(_event); } else { - MML->Err(L"リピート(B)内で \\ コマンドがありませんでした。必ず分岐点 \\ は指定してください。"); + //引数がある場合 + if(repeat_cnt != -1){ + MML->Err(L"リピート回数が両方に記述されています。"); + } + repeat_cnt = MML->GetInt(); + if( (repeat_cnt > 255) || (repeat_cnt < 2) ){ + MML->Err(L"リピート回数は2〜255の範囲で指定して下さい。"); + } else { + (*it_ct_repeat_c) = repeat_cnt; + } } - } else { - MML->Err(L"リピート(B)の開始 |: コマンドがありません。"); + + pt_itMusic--; + (*it_it_repeat_c_e) = pt_itMusic; + + //-------------------------- + //リピートの展開 + { + unsigned int iRepeatCount = (*it_ct_repeat_c) - 1; + unsigned char cOpCode; + string sOpCode; + + while(iRepeatCount>0){ + pt_itMusic = (*it_it_repeat_c_s); + if(pt_itMusic != *it_it_repeat_c_e){ + do{ + pt_itMusic++; + cOpCode = (*pt_itMusic)->getCode(0); + sOpCode.clear(); + (*pt_itMusic)->getCode(&sOpCode); + switch(cOpCode){ + case(nsd_Call): + ptcSub.push_back(CopyAddressEvent(cOpCode, &sOpCode, pt_itMusic)); + break; + case(nsd_Call_SE): + ptcSE.push_back(CopyAddressEvent(cOpCode, &sOpCode, pt_itMusic)); + break; + case(nsd_Envelop_Voice): + case(nsd_Envelop_Volume): + case(nsd_Envelop_Frequency): + case(nsd_Envelop_Note): + CopyEnvEvent(cOpCode, &sOpCode, pt_itMusic); + break; + case(nsc_VRC7): + ptcOPLL.push_back(CopyAddressEvent(cOpCode, &sOpCode, pt_itMusic)); + break; + case(nsc_N163): + ptcWave.push_back(CopyAddressEvent(cOpCode, &sOpCode, pt_itMusic)); + break; + case(nsd_FDS_Career): + ptcFDSC.push_back(CopyAddressEvent(cOpCode, &sOpCode, pt_itMusic)); + break; + case(nsd_FDS_Modlator): + ptcFDSM.push_back(CopyAddressEvent(cOpCode, &sOpCode, pt_itMusic)); + break; + default: + { + mml_general* _event = new mml_general(cOpCode); + _event->setCode(&sOpCode); + SetEvent(_event); + } + break; + } + + if((iRepeatCount == 1) && (pt_itMusic == *it_it_repeat_c_b)){ + pt_itMusic = *it_it_repeat_c_e; + } + } while(pt_itMusic != *it_it_repeat_c_e); + } + iRepeatCount--; + } + + } + + //-------------------------- + //最後尾のイテレータを取得 + it_ct_repeat_c--; + it_it_repeat_c_s--; + it_it_repeat_c_b--; + it_it_repeat_c_e--; + + //スタックの破棄 + st_ct_repeat_c.pop_back(); + st_it_repeat_c_s.pop_back(); + st_it_repeat_c_b.pop_back(); + st_it_repeat_c_e.pop_back(); + sp_repeat_c--; + + //リピートタイプの復帰 + it_repeat_type--; + repeat_type.pop_back(); + } - Reset_opt(); +} + +mml_Address* MusicTrack::CopyAddressEvent(unsigned char cOpCode, string* sOpCode, list::iterator pt_itMusic) +{ + mml_Address* _event = new mml_Address(cOpCode); + mml_Address* ptAdrItem = (mml_Address*)(*pt_itMusic); + _event->setCode(sOpCode); + _event->set_id(ptAdrItem->get_id()); + SetEvent(_event); + return(_event); +} + +void MusicTrack::CopyEnvEvent(unsigned char cOpCode, string* sOpCode, list::iterator pt_itMusic) +{ + mml_Address* _event = new mml_Address(cOpCode); + mml_Address* ptAdrItem = (mml_Address*)(*pt_itMusic); + _event->setCode(sOpCode); + if(ptAdrItem->get_flag() == true){ + _event->set_id(ptAdrItem->get_id()); + ptcEnv.push_back(_event); + } + SetEvent(_event); } //============================================================== diff --git a/src/nsc/MusicTrack.h b/src/nsc/MusicTrack.h index 55db740..b081e87 100644 --- a/src/nsc/MusicTrack.h +++ b/src/nsc/MusicTrack.h @@ -13,16 +13,36 @@ class MusicTrack : int iTickTotal; int iTickLoop; + bool jump_flag; //ジャンプフラグ + bool compile_flag; //現在コンパイル中? unsigned int offset_now; //現在のオフセット bool loop_flag; unsigned int offset_loop; // L コマンドのオフセット + unsigned int offset_repeat_a_s; //前回の [ コマンドのオフセット unsigned int offset_repeat_a_b; //前回の : コマンドのオフセット unsigned int offset_repeat_b_s; //前回の |: コマンドのオフセット unsigned int offset_repeat_b_b; //前回の \ コマンドのオフセット int count_repeat_a; + + vector< int > repeat_type; + vector< int >::iterator it_repeat_type; + + unsigned int sp_repeat_c; //リピート(C)のスタックポインタ +// vector< MusicItem*>::iterator it_repeat_c_s; +// vector< MusicItem*>::iterator it_repeat_c_b; +// vector< MusicItem*>::iterator it_repeat_c_e; + list< unsigned int > st_ct_repeat_c; + list< list< MusicItem*>::iterator> st_it_repeat_c_s; + list< list< MusicItem*>::iterator> st_it_repeat_c_b; + list< list< MusicItem*>::iterator> st_it_repeat_c_e; + list< unsigned int >::iterator it_ct_repeat_c; + list< list< MusicItem*>::iterator>::iterator it_it_repeat_c_s; + list< list< MusicItem*>::iterator>::iterator it_it_repeat_c_b; + list< list< MusicItem*>::iterator>::iterator it_it_repeat_c_e; + unsigned int DefaultLength; bool echo_flag; //疑似エコー フラグ @@ -49,8 +69,6 @@ class MusicTrack : int opt_gatetime_u; // int opt_volume; - bool jump_flag; //ジャンプフラグ - //調号制御用 char KeySignature[8]; //調号(c,d,e,f,g,a,b,r) char nowKey; //現在の調 @@ -84,15 +102,23 @@ class MusicTrack : bool GetCompileFlag(void){return(compile_flag);}; void SetCompileFlag(bool _flag){compile_flag = _flag;}; - size_t SetEnd(void); + size_t SetEnd(MMLfile* MML); void SetLoop(); + void SetRepeat_Start(MMLfile* MML); + void SetRepeat_End(MMLfile* MML); + void SetRepeat_Branch(MMLfile* MML); + void SetRepeat_A_Start(MMLfile* MML); - void SetRepeat_A_Branch(MMLfile* MML); void SetRepeat_A_End(MMLfile* MML); + void SetRepeat_C_Start(MMLfile* MML); + void SetRepeat_C_End(MMLfile* MML); + void SetRepeat_B_Start(); void SetRepeat_B_Branch(MMLfile* MML); void SetRepeat_B_End(MMLfile* MML); + mml_Address* CopyAddressEvent(unsigned char cOpCode, string* sOpCode, list::iterator pt_itMusic); + void CopyEnvEvent(unsigned char cOpCode, string* sOpCode, list::iterator pt_itMusic); void SetSE(MMLfile* MML); void SetSubroutine(MMLfile* MML); diff --git a/src/nsc/Release/nsc.exe b/src/nsc/Release/nsc.exe index a1bd8f7..7287e58 100644 Binary files a/src/nsc/Release/nsc.exe and b/src/nsc/Release/nsc.exe differ diff --git a/src/nsc/TrackSet.cpp b/src/nsc/TrackSet.cpp index 5fd7c50..d1f0c47 100644 --- a/src/nsc/TrackSet.cpp +++ b/src/nsc/TrackSet.cpp @@ -40,6 +40,9 @@ enum Command_ID_mml { mml_Repeat_B_Start, mml_Repeat_B_Branch, mml_Repeat_B_End, + mml_Repeat_C_Start, +// mml_Repeat_C_Branch, + mml_Repeat_C_End, mml_Tempo, mml_Tempo_Relative, @@ -143,6 +146,9 @@ const static Command_Info Command[] = { { "$", mml_Macro }, { "L", mml_Loop }, + { "[:", mml_Repeat_C_Start }, + // { ":", mml_Repeat_C_Branch }, + { ":]", mml_Repeat_C_End }, { "|:", mml_Repeat_B_Start }, { "\\", mml_Repeat_B_Branch }, { ":|", mml_Repeat_B_End }, @@ -403,30 +409,62 @@ const static Command_Info Command[] = { } break; - case(mml_Repeat_A_Start): - nowTrack->SetRepeat_A_Start(MML); + case(mml_Repeat_B_Start): + nowTrack->SetRepeat_B_Start(); + break; + + case(mml_Repeat_B_Branch): + nowTrack->SetRepeat_B_Branch(MML); + break; + + case(mml_Repeat_B_End): + nowTrack->SetRepeat_B_End(MML); break; case(mml_Repeat_A_Branch): - nowTrack->SetRepeat_A_Branch(MML); + nowTrack->SetRepeat_Branch(MML); break; - case(mml_Repeat_A_End): - nowTrack->SetRepeat_A_End(MML); + case(mml_Repeat_A_Start): + if((MML->iRepeatMode == 0) && (fSub == false)){ + nowTrack->SetRepeat_Start(MML); //0 && main + } else if(MML->iRepeatMode == 1){ + nowTrack->SetRepeat_A_Start(MML); //1 + } else { + nowTrack->SetRepeat_C_Start(MML); //2 || (0 && sub) + } break; - case(mml_Repeat_B_Start): - nowTrack->SetRepeat_B_Start(); + case(mml_Repeat_A_End): + if((MML->iRepeatMode == 0) && (fSub == false)){ + nowTrack->SetRepeat_End(MML); //0 && main + } else if(MML->iRepeatMode == 1){ + nowTrack->SetRepeat_A_End(MML); //1 + } else { + nowTrack->SetRepeat_C_End(MML); //2 || (0 && sub) + } break; - case(mml_Repeat_B_Branch): - nowTrack->SetRepeat_B_Branch(MML); + case(mml_Repeat_C_Start): + if((MML->iRepeatMode == 2) || ((MML->iRepeatMode == 0) && (fSub == true))){ + nowTrack->SetRepeat_A_Start(MML); //2 || (0 && sub) + } else { + nowTrack->SetRepeat_C_Start(MML); //1 || (0 && main) + } break; - case(mml_Repeat_B_End): - nowTrack->SetRepeat_B_End(MML); + case(mml_Repeat_C_End): + if((MML->iRepeatMode == 2) || ((MML->iRepeatMode == 0) && (fSub == true))){ + nowTrack->SetRepeat_A_End(MML); + } else { + nowTrack->SetRepeat_C_End(MML); + } break; + // case(mml_Repeat_C_Branch): + // nowTrack->SetRepeat_C_Branch(MML); + // break; + case(mml_Tempo): SetTempo(MML); break; @@ -696,7 +734,7 @@ const static Command_Info Command[] = { if(fSub == true){ //サブルーチンブロックの場合 code.resize(0); - i = (int)ptcTrack[iTrack]->SetEnd(); + i = (int)ptcTrack[iTrack]->SetEnd(MML); } else { //それ以外の場合 @@ -711,7 +749,7 @@ const static Command_Info Command[] = { while(iTrack <= maxTrack){ code[iTrack *2 + 2] = (unsigned char)((i ) & 0xFF); code[iTrack *2 + 3] = (unsigned char)((i>>8) & 0xFF); - i += (int)ptcTrack[iTrack]->SetEnd(); + i += (int)ptcTrack[iTrack]->SetEnd(MML); iTrack++; } } @@ -785,7 +823,7 @@ void TrackSet::getAsm(MusicFile* MUS) //---------------------- //Local変数 int i = 0; - vector< MusicItem*>::iterator itItem; + list< MusicItem*>::iterator itItem; if(fSub == false){ *MUS << " .byte $" << hex << setw(2) << setfill('0') << (int)(code[0] & 0xFF) << ", $" << (int)(code[1] & 0xFF) << endl; @@ -946,6 +984,10 @@ MusicTrack* TrackSet::makeTrack(MMLfile* MML, int _track) ptcItem.push_back(newTrack); //基底クラス"MusicItem"側で開放する。 ptcTrack[_track] = newTrack; + if(MML->iReleaseVolume != 2){ //ドライバー側のデフォルトは2 + newTrack->SetEvent(new mml_general(nsd_Release_Volume + (unsigned char)MML->iReleaseVolume, L"Release Volume")); + } + //ポインタを渡す return(newTrack); } diff --git a/src/nsc/mml_Address.cpp b/src/nsc/mml_Address.cpp index 44c097c..954bdf5 100644 --- a/src/nsc/mml_Address.cpp +++ b/src/nsc/mml_Address.cpp @@ -11,8 +11,10 @@ // 無し //============================================================== mml_Address::mml_Address(unsigned char _code, const wchar_t _strName[]): + f_id(false), MusicEvent(_strName) { + iSize = 3; code.resize(iSize); code[0] = _code; @@ -31,6 +33,7 @@ mml_Address::mml_Address(unsigned char _code, const wchar_t _strName[]): // 無し //============================================================== mml_Address::mml_Address(unsigned char _code, unsigned char _data, const wchar_t _strName[]): + f_id(false), MusicEvent(_strName) { iSize = 4; @@ -106,6 +109,7 @@ unsigned int mml_Address::get_Address(void) //============================================================== void mml_Address::set_id(unsigned int _id) { + f_id = true; m_id = _id; } @@ -121,4 +125,16 @@ unsigned int mml_Address::get_id(void) { return(m_id); } +//============================================================== +// idの取得 +//-------------------------------------------------------------- +// ●引数 +// 無し +// ●返値 +// unsigned int 番号 +//============================================================== +bool mml_Address::get_flag(void) +{ + return(f_id); +} diff --git a/src/nsc/mml_Address.h b/src/nsc/mml_Address.h index 87c1642..2ad1fcb 100644 --- a/src/nsc/mml_Address.h +++ b/src/nsc/mml_Address.h @@ -10,7 +10,8 @@ class mml_Address : public MusicEvent { //メンバー変数 - unsigned int m_id; + unsigned int m_id; + bool f_id; //メンバー関数 public: mml_Address(unsigned char _code, const wchar_t _strName[]=L"Address"); @@ -21,4 +22,5 @@ class mml_Address : // unsigned int get_Address(void); void set_id(unsigned int _id); unsigned int get_id(void); + bool get_flag(void); }; diff --git a/src/nsc/nsc.ncb b/src/nsc/nsc.ncb index b245123..42ec226 100644 Binary files a/src/nsc/nsc.ncb and b/src/nsc/nsc.ncb differ diff --git a/src/nsc/nsc.suo b/src/nsc/nsc.suo index 6ca245e..3c2e418 100644 Binary files a/src/nsc/nsc.suo and b/src/nsc/nsc.suo differ diff --git a/src/nsc/stdafx.h b/src/nsc/stdafx.h index 59f9aac..341400a 100644 --- a/src/nsc/stdafx.h +++ b/src/nsc/stdafx.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include diff --git a/src/rom/crt0.s b/src/rom/crt0.s index 15b9ac8..01bfd9d 100644 --- a/src/rom/crt0.s +++ b/src/rom/crt0.s @@ -106,12 +106,12 @@ _play: .byte 0 .segment "DRVINFO" DRV_Name: .byte $4E, $53, $44, $4C, $20, $20 DRV_Version: .byte 1 - .byte 15 + .byte 17 .segment "STARTUP" DRV_Name2: .byte $4E, $53, $44, $4C, $20, $20 DRV_Version2: .byte 1 - .byte 15 + .byte 17 ; ------------------------------------------------------------------------ ; 実機ROM用 IRQ (DPCM)