SCMDv2 Z80対応について
SCMD v2はturboR専用でしたが、v2.3.0でZ80版を制作しました。Z80版はバージョン番号末尾にzの文字を付けて分かるようにしています。
単にZ80で起動するようにしたわけではなくドライバ処理をZ80を念頭に、全処理書き直したものになります。
とはいえ今までのturboR用に作った曲が全て処理落ちなく演奏可能、とはいきませんが…。
特徴などは
- ●v2.2.0をベースにしている分、v1よりバグが取れてAUDIOを鳴らせる(リズムモードは非対応。yコマンドで鳴らせないことはないですが…)
- ●SCCPCMの転送が波形を止めない方法に変更したため、少し綺麗になっている
- ●SCCPCMの波形転送及び通常SCCの波形転送を高速化、その他無駄な処理を省いたりしてv2.2.0より少しは高速化している(同じZ80で実行したとして)
- ●ダイレクトモードで負荷値の表示変更
- ●MMLの@w定義で読み込むwavファイルの形式が16bitも対応した他、サンプリング周波数変換もできるようになった
- ●MMLの@y定義でキャリアのTLも設定するように変更した
- ●SCCの@intコマンドの廃止
- ●ダイレクトモードでファイルチェックの順番変更
- ●v1と同様にパナソニック2+機では起動時のファイル読み込み中にスペースキーを押し続けると1.5倍速モード(表示あり)
こんなところになります。
ダイレクトモードの負荷値
v2.2.0までは過負荷になったときに処理が軽かったので文字色を暗く表示していましたがそれを廃止し、右上に負荷メータを表示するようにしました。

負荷値6(100%)以上は文字色が紫になり、最大幅に固定されます。

また、ESCキーで終了したときに最大負荷値(10進数)と平均負荷値(16進数)が表示されます。

演奏中の経過クロックを16bit、積算負荷値を24bitで管理しそれを超えるような場合は値が不正になります。
ループ曲はその間ずっとカウントされ続け、ループしない曲は演奏終了後もESCキーで停止されるまでカウントされる(平均負荷値が下がる)点に注意です。
(16bit=おおよそ18分12秒までカウント可)
コンパイラの表示の意味

コンパイル後に表示される数値は各チャンネルのクロックですが、**コマンドなど全チャンネルのクロックを揃えるコマンド出現地点で0に戻してカウントされています。
[]の中の数値は、0にすることなく頭から継続してカウントした総クロック数になります。

ループする曲は、全チャンネルで同じクロックになっていないと、ループするたびにチャンネル間の演奏がズレていってしまいます。
そこでv2.2.0まではドライバ側が、全チャンネル揃うのを待ってループする処理にしていました。
Z80対応で高速化するにあたり、それはコンパイラ側で同じ数値にすることで負荷を減らすようにしています。
クロック合わせ済みで表示される数値は、他のチャンネルに比べてクロック数が足りなかったので、クロック合わせの位置の直前の音長にこの数値を加えたことを表します。
クロック合わせの位置でも、変更なしならば表示はされず、変更したクロック合わせの位置が複数ある場合は","で続けて表示します(どの位置かは分からず、その数値のみが確認できます)。
正当然制作途中などで、意図的にチャンネル間の音長の差がある場合を除き、正常であれば1クロック(か0クロック)を足すことになるので2クロック以上が表示される場合、MMLにミスがある可能性があります。
クロック合わせ処理の詳細
クロック合わせの場所は、テンポ変更、**コマンド、%コマンド、曲の終了などの位置になります。
その場所の直前の音長がクロックを変更されます。
なので、チャンネルの最初に**がある場合(直前に音長が無い)は処理は無視されます(全チャンネル同時スタートなので合わせる必要なし)。
全チャンネル、先頭から同じ位置のクロック合わせの場所を対象にクロックを調整するため、チャンネル先頭から何番目の場所かが重要です。
p2=v15aaa**gg
このMMLは正しく動作しますが
p2=v15aaa**gg
こんなMMLや
p2=v15a%aagg
このようなMMLは、上記の処理に則ってコンパイルされますが動作が滅茶苦茶に見えて、理解がし難くなります。
全チャンネル、同じクロックになって欲しい位置に(必然的に同じ数になります)配置することが重要です。上記のようなあからさまに変な書き方でなくとも
p2=v15c
このようにループするチャンネルとループしないチャンネルがうっかり混在することはあるかもしれません。
また実際にコンパイルするとcdefgがループし、cが1回だけ鳴るので意図した通りに動くように見えます。
しかし、実際は、最初のクロック合わせポイントがp1は**、p2は曲の終了となっています。
クロックはp2の方が30クロック、p1が0クロックなので足らない30クロックをp1に足そうとしますが、p1は先頭に**があるので加算する音長がないので無視され、結果正しく動作しているように見えるだけとなります。
p2=v15cdef
このようにするとp1に加算できる音長があるので、p2がcdefを演奏する間、p1のaが鳴り続け、p2の終了で、p1のcdefgが演奏されることになります。
同じようにうっかり書いてしまいそうなのが、テンポ設定を無駄に複数回書いてしまうパターン。t123 cde t123 cdeなどで、これがマクロで /aaa cde /bbb(/aaaが"ceg t123"、/bbbが"t123 ccc"など)のようになると間違いを見つけ出しにくくなるので注意です。
p2=v15aaa**a
他に、間違った記述ではありませんが、曲を作成中にはチャンネル間の音長が異なることはあります。
その場合短い方のチャンネルの最後の音長が伸ばされるので、ずっとaの音が鳴り続けチェックしにくい状態になることがあります。
その時はダミーのrを挿入して休符の音長を伸ばすようにすることで、余分な音は消音しチェックがしやすくなります。
p2=v15aaa**ar
@intコマンドの廃止
使い所がほとんど無いことと、Z80化の処理に合わないため機能を廃止しました。
MMLに書いてもエラーは出ませんが、音は正常に鳴りません。
その他
ちょっとしたことですが、SDTファイル名をダイレクトモードで指定ミスした場合、エラーが出るまでかなり時間が掛かりました。
それをまず最初にファイル名チェックだけ行い、その時点でファイルが見つからなければエラーを出すようにしました。
ADPCMファイルはSDTファイルの中身を確認しないと必要かどうかが判別できないのでそれには対応していませんが、使い勝手は良くなったかと思います。
デメリットとしてファイル検索を最初に行う分、少しダイレクトモードの起動が遅くなります。
その他、MMLでは定義エリアが16KBに拡張され、音色エディタではそのモード中はテンポ補正機能は働かないようにしました(これはCPUリソースをテンポ補正に割り振ると、キー入力の反応が悪くなりエディタの操作がままならなくなるためです)。
turboR版について
現バージョンはv2.2.0のままですが、今度はv2.3.0zを元にしてv2.3.0をそのうちに作成するつもりでいます。