mml2vgm
mml2vgm copied to clipboard
仮想トラック機能を実装してほしい
例えば
Bass
'F1 l16 @2 [o2dd>dd]4
Kick
'F2 l8 @1 o4 [cr]4
となっているパートは
Kick and Bass
'F1 l16 [@1 o4 c8 @2 o3dd]4
とすれば、1chでKickを鳴らす隙間にBassを発音させることができますが、これを
Kick
'F1 l8 @1 o4 [cr]4
Bass
'F1_ l16 @2 [o2dd>dd]4
('F1_ の表記は仮定)
のように表記することで、一つ前の
Kick and Bass
'F1 l16 [@1 o4 c8 @2 o3dd]4
と同等の発音ができる、優先度の付いた仮想的なトラックが使用できる機能があると大変嬉しいです。 GB音源向けのMMLコンパイラであるGBMCに実装例があるようですが。参考としてリンクを置いておきます。 GBMCのマニュアルのリンク 他にも実装例があると聞いた事があったのですが、すみません失念しております…。
検討していただければ幸いです。
うーん。。。できないとは言いませんが相当大変な改造になりますね。 音量や音色、ディチューン値など全てのパラメータがとっかえひっかえなんですよね? しかもすべての音源で。。。 チャンネルはどのぐらいの数、共有できるのでしょうか。 例えば'F1 と'F1_で1チャンネル当たり2つ限定でしょうか
qコマンドの隙間とかも割り込みますでしょうか
[、]コマンド内の相対移動系コマンド(オクターブやボリュームなど)の挙動が、 mucomなどのような動きになってしまいます。(mucom式が悪いとか言いたいのではなく、 通常の場合と動きが変わってしまうことが問題ですと言いたい) ー>実装の方法によっては回避できそうなのでここは問題外とします
YM2612Xのオーバーレイ機能は周波数固定、音量固定その他もろもろ無視だったので楽に実装できましたけど。。。
トレース機能はどうしようとか、パートカウンターのパラメータ表示はどうしようとか。。。
とりあえず修正はじめました。 通常のパート指定に続けてアンダースコアを指定すると そのパートの割り込み用のmmlデータになるようにします この表記だと 通常と割り込みを混ぜて表記する事はできませんが 割り込みという性格上問題無いと思います。
またアンダースコアの個数で割り込みの数を指定できるようにします
通常をページ0と呼ぶ事にし、割り込みはアンダースコアが増える毎にページ1、2と呼ぶ事にします。
ページ数が小さいmmlで休符を指定すると次のページの割り込みがかかる様にします。 休符が終わると割り込みは解除されます
割り込みがかかる時、割り込みを行うページの一つ上のページの情報を一時待避します 割り込みを解除する時退避した情報を復帰させ必要であればチップにその情報を送信します
退避する情報については今のところ考えていませんが 音程 音量 音色 パンニング などになると思われます
今のところ テキストを読み込むとこまでは 修正できました
後はパースやページ毎の空演奏、割り込みの判定、切り替え、復帰など…まだまだです。
割り込み判定はキーオン時のみ行います よって割り込める様になったからと言って 発音途中から割り込んで音が出るという事はありません。
大体こんな感じの仕様で行こうと思いますが大丈夫でしょうか
早速たくさんの検討と調整ありがとうございます。 読んだ所この仕様で良さそうだと考えていますが、 念のためこれを読みましたよ、というチェックとして順に書きます。
・割り込み用チャンネル数 →2でも良いかと考えていましたが、さらに置ける構造を提案して頂きありがとうございます。
・qコマンドとの兼ね合い →GBMCで試した所qコマンドの隙間には割り込まなかったため、明確に休符のみで良いと思います。
・mucomのような相対コマンド挙動 →すみません、こちらは現状未確認です…
・アンダースコアでのレイヤー定義と挙動、ページ →いいと思いました。ありがとうございます。ページ0ありきだとは思うので、そういった挙動で良いと思います。 →とりあえずアンダースコアで提案しましたが、付ける記号としては実際無難かなとは考えています。
・割り込み判定について →休符時のみ割り込み待機、キーオン時のみ割り込みで良いと思います。 →ページ1の音符の発音中にページ0のキーオンが来た場合は、ページ1の発音がその時点でキャンセルされてページ0に復帰するという認識で間違っていないでしょうか? ex.
’F1 c4 r4 c4 r4
'F1_ r4 d2 r4
は
'F1 c4 d4 c4 r4
とほぼ同等になる?
発想の根元としてはMMLの柔軟さと、トラッカー的な1トラックでパートを行き来する打ち込みの利便を向上できると更に良くなるのでは、といった所です。 大変なのは承知していましたが、お付き合い頂いて感謝しています。
→ページ1の音符の発音中にページ0のキーオンが来た場合 その通りです。ページ0で発音されます。
分けて表記できるのが易しくわかりやすいのは重々承知しております♪ OPNAのリズムチャンネルを分けているのもそのためですから。
メモ 現在の進捗 パースの修正完了 ページごとにパラメーターをもつように修正。
作業予定 共有するべきパラメーター(現値の保管向けなど)の洗い出し、移動を行う予定。 共有パラメーターは参照はどのページも行えるが、更新は処理権を持っているページのみ。 上記が完了したらページ毎の空演奏処理実装。
メモ 現在の進捗 共有パラメーター向けのページを追加することで洗い出し、移動の作業をスキップw 各ページにパースしたmmlデータを格納するところまで完了。 テストgwiファイル作成。エディタのキーワードハイライター修正。
作業予定 ページ毎の空演奏処理実装の開始。 先ずは動作確認のために優先順位を無視してどのページも演奏してしまうようにする。
メモ 現在の進捗 各チップの処理単位をページに落とす。(10000箇所越えのエラーにはビビったw) なんとか、優先順位無視の演奏ができるようになった。 作業予定 もう少し実装状況を確認する。 演奏権の処理を作成する。
メモ 現在の進捗 ページ切り替えとともにレイヤー機能も実装することにした ページ切り替えは大体動作するようになった。 作業予定 レイヤーはまだ。 ページ切り替え時のチップごとの設定送信処理がまだ。(これが一番厄介)
メモ 現在の進捗 ページ:AYに対応。 レイヤーは放置。 作業予定 YM2203に対応予定。 (FMが動作するようになれば大概のChipはいけるロジックになったと考えて大丈夫かな)
対応状況: 対応 AY8910 YM2203 YM2612/X YM2608 YM2610B YM2413
MIDIGMは対応不要。
PSG チップのノイズ モードと周波数は、切り替える属性の 1 つでなければなりません。良い例は、ベースとスネアとしてSN76489のノイズチャンネルを同時に使用しようとする場合です。これはAY3-8910でも絶対に必要になり、その場合、誰もがキック、エンベロープAYベース、スネアを持つAY曲の1つを同じチャンネルで作りたいと思った場合に備えて、ハードウェアエンベロープをソフトウェアのものと同様に切り替える必要があります。
DCSGですね?修正します。。。
私がノイズモードについて話していたときの最初のものは、はい、それはDCSGです。
AYのほうは既に対応していたはずですので。
DCSGの周波数も復帰するようにしました。 但し、以下が条件です。 ・Ch4であること ・ノイズモードがCh3連動モードであること ・wfコマンドによる周波数直接指定していること
私は実際にこの目的のためにそれを使用することはできません、それはいくつかの状況、例えばパーカッションで有用ですが、時にはリンクモードではベースに変わり、私はノートを指定できる必要があります。
ここに私が作成する助けを求めていたデータの種類があります。最初は、私は低音とスネアを交互にした場合、それが正常に動作する方法を手組み合わせトラックで表示されます。それから私は試してみて、同じことを達成するためにページ関数をインスティテュートし、それが壊れます。
No,SV,AR,DR,SL,SR,RR,ST,ChipName
'@ E 00,00,00,01,00,00,15,01,DCSG
'@ E 01,00,00,02,00,00,15,01,DCSG
'S3 l8 o5 v0 [rcrcr16c16d+16f16rc]4
'S2 v12 o3 l4 @0 EON [<c_<c>> c_<g>]8
'S4 v14 @1 [w3rcw4EONcw3EOFcr16c16c16c16w4EONcw3EOFc]2
'S4 w3 v14 l8 [rcrcr16c16c16c16rc]2
'S4_ @1 EON v13 l8 [r1]2 w4 [rrcrrrcr]2
修正しましたー
はい、これは動作します。感謝!