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 @@
-
-
-
-#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に変換します。
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-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のトラックでは使われない領域を使用します。
-
-
-
-構造体メンバーと、変数名の関係
-メンバー名 変数名 ch1 ch2 ch3 ch4 ch5
-_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_cent
- cent単位のディチューン(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_set1
- APU ch1の音色(レジスタ書込みの為の論理演算用)
-__apu_voice_set2
- APU ch2の音色(レジスタ書込みの為の論理演算用)
-__apu_voice_set4
- APU ch4の音色(レジスタ書込みの為の論理演算用)
-__apu_voice_set1
- SE ch1の音色(レジスタ書込みの為の論理演算用)
-__apu_voice_set2
- SE ch1の音色(レジスタ書込みの為の論理演算用)
-__apu_frequency1
- APU ch1の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
-__apu_frequency2
- APU ch2の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
-__apu_frequency3
- APU ch3の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
-__se_frequency
- SE ch1の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
-__sweep_ch1
- APU ch1のsweepレジスタの現在値
-__sweep_ch2
- APU 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のトラックでは使われない領域を使用します。
-
-
-
-構造体メンバーと、変数名の関係
-メンバー名 変数名 ch1 ch2 ch3 ch4 ch5
-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)