mml2vgm icon indicating copy to clipboard operation
mml2vgm copied to clipboard

仮想トラック機能を実装してほしい

Open sdhizumi opened this issue 4 years ago • 30 comments

例えば

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のマニュアルのリンク 他にも実装例があると聞いた事があったのですが、すみません失念しております…。

検討していただければ幸いです。

sdhizumi avatar Jun 09 '20 10:06 sdhizumi

うーん。。。できないとは言いませんが相当大変な改造になりますね。 音量や音色、ディチューン値など全てのパラメータがとっかえひっかえなんですよね? しかもすべての音源で。。。 チャンネルはどのぐらいの数、共有できるのでしょうか。 例えば'F1 と'F1_で1チャンネル当たり2つ限定でしょうか

kuma4649 avatar Jun 09 '20 12:06 kuma4649

qコマンドの隙間とかも割り込みますでしょうか

kuma4649 avatar Jun 09 '20 12:06 kuma4649

[、]コマンド内の相対移動系コマンド(オクターブやボリュームなど)の挙動が、 mucomなどのような動きになってしまいます。(mucom式が悪いとか言いたいのではなく、 通常の場合と動きが変わってしまうことが問題ですと言いたい) ー>実装の方法によっては回避できそうなのでここは問題外とします

kuma4649 avatar Jun 09 '20 13:06 kuma4649

YM2612Xのオーバーレイ機能は周波数固定、音量固定その他もろもろ無視だったので楽に実装できましたけど。。。

kuma4649 avatar Jun 09 '20 13:06 kuma4649

トレース機能はどうしようとか、パートカウンターのパラメータ表示はどうしようとか。。。

kuma4649 avatar Jun 09 '20 13:06 kuma4649

とりあえず修正はじめました。 通常のパート指定に続けてアンダースコアを指定すると そのパートの割り込み用のmmlデータになるようにします この表記だと 通常と割り込みを混ぜて表記する事はできませんが 割り込みという性格上問題無いと思います。

またアンダースコアの個数で割り込みの数を指定できるようにします

kuma4649 avatar Jun 09 '20 22:06 kuma4649

通常をページ0と呼ぶ事にし、割り込みはアンダースコアが増える毎にページ1、2と呼ぶ事にします。

kuma4649 avatar Jun 09 '20 22:06 kuma4649

ページ数が小さいmmlで休符を指定すると次のページの割り込みがかかる様にします。 休符が終わると割り込みは解除されます

kuma4649 avatar Jun 09 '20 22:06 kuma4649

割り込みがかかる時、割り込みを行うページの一つ上のページの情報を一時待避します 割り込みを解除する時退避した情報を復帰させ必要であればチップにその情報を送信します

退避する情報については今のところ考えていませんが 音程 音量 音色 パンニング  などになると思われます

kuma4649 avatar Jun 09 '20 22:06 kuma4649

今のところ テキストを読み込むとこまでは 修正できました

後はパースやページ毎の空演奏、割り込みの判定、切り替え、復帰など…まだまだです。

kuma4649 avatar Jun 09 '20 22:06 kuma4649

割り込み判定はキーオン時のみ行います よって割り込める様になったからと言って 発音途中から割り込んで音が出るという事はありません。

kuma4649 avatar Jun 09 '20 23:06 kuma4649

大体こんな感じの仕様で行こうと思いますが大丈夫でしょうか

kuma4649 avatar Jun 09 '20 23:06 kuma4649

早速たくさんの検討と調整ありがとうございます。 読んだ所この仕様で良さそうだと考えていますが、 念のためこれを読みましたよ、というチェックとして順に書きます。

・割り込み用チャンネル数 →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トラックでパートを行き来する打ち込みの利便を向上できると更に良くなるのでは、といった所です。 大変なのは承知していましたが、お付き合い頂いて感謝しています。

sdhizumi avatar Jun 10 '20 00:06 sdhizumi

→ページ1の音符の発音中にページ0のキーオンが来た場合 その通りです。ページ0で発音されます。

分けて表記できるのが易しくわかりやすいのは重々承知しております♪ OPNAのリズムチャンネルを分けているのもそのためですから。

kuma4649 avatar Jun 10 '20 09:06 kuma4649

メモ  現在の進捗   パースの修正完了   ページごとにパラメーターをもつように修正。

 作業予定   共有するべきパラメーター(現値の保管向けなど)の洗い出し、移動を行う予定。   共有パラメーターは参照はどのページも行えるが、更新は処理権を持っているページのみ。   上記が完了したらページ毎の空演奏処理実装。

kuma4649 avatar Jun 10 '20 20:06 kuma4649

メモ  現在の進捗   共有パラメーター向けのページを追加することで洗い出し、移動の作業をスキップw   各ページにパースしたmmlデータを格納するところまで完了。   テストgwiファイル作成。エディタのキーワードハイライター修正。

 作業予定   ページ毎の空演奏処理実装の開始。   先ずは動作確認のために優先順位を無視してどのページも演奏してしまうようにする。   

kuma4649 avatar Jun 11 '20 20:06 kuma4649

メモ  現在の進捗   各チップの処理単位をページに落とす。(10000箇所越えのエラーにはビビったw)   なんとか、優先順位無視の演奏ができるようになった。  作業予定   もう少し実装状況を確認する。   演奏権の処理を作成する。

kuma4649 avatar Jun 13 '20 10:06 kuma4649

メモ  現在の進捗   ページ切り替えとともにレイヤー機能も実装することにした   ページ切り替えは大体動作するようになった。  作業予定   レイヤーはまだ。   ページ切り替え時のチップごとの設定送信処理がまだ。(これが一番厄介)

kuma4649 avatar Jun 16 '20 12:06 kuma4649

メモ  現在の進捗   ページ:AYに対応。   レイヤーは放置。  作業予定   YM2203に対応予定。   (FMが動作するようになれば大概のChipはいけるロジックになったと考えて大丈夫かな)

kuma4649 avatar Jun 17 '20 21:06 kuma4649

対応状況: 対応 AY8910 YM2203 YM2612/X YM2608 YM2610B YM2413

kuma4649 avatar Jun 28 '20 04:06 kuma4649

MIDIGMは対応不要。

kuma4649 avatar Jun 28 '20 04:06 kuma4649

PSG チップのノイズ モードと周波数は、切り替える属性の 1 つでなければなりません。良い例は、ベースとスネアとしてSN76489のノイズチャンネルを同時に使用しようとする場合です。これはAY3-8910でも絶対に必要になり、その場合、誰もがキック、エンベロープAYベース、スネアを持つAY曲の1つを同じチャンネルで作りたいと思った場合に備えて、ハードウェアエンベロープをソフトウェアのものと同様に切り替える必要があります。

ultrasound1372 avatar Jul 04 '20 16:07 ultrasound1372

DCSGですね?修正します。。。

kuma4649 avatar Jul 05 '20 02:07 kuma4649

私がノイズモードについて話していたときの最初のものは、はい、それはDCSGです。

ultrasound1372 avatar Jul 05 '20 03:07 ultrasound1372

AYのほうは既に対応していたはずですので。

kuma4649 avatar Jul 05 '20 12:07 kuma4649

DCSGの周波数も復帰するようにしました。 但し、以下が条件です。 ・Ch4であること ・ノイズモードがCh3連動モードであること ・wfコマンドによる周波数直接指定していること

kuma4649 avatar Jul 05 '20 20:07 kuma4649

私は実際にこの目的のためにそれを使用することはできません、それはいくつかの状況、例えばパーカッションで有用ですが、時にはリンクモードではベースに変わり、私はノートを指定できる必要があります。

ultrasound1372 avatar Jul 05 '20 21:07 ultrasound1372

ここに私が作成する助けを求めていたデータの種類があります。最初は、私は低音とスネアを交互にした場合、それが正常に動作する方法を手組み合わせトラックで表示されます。それから私は試してみて、同じことを達成するためにページ関数をインスティテュートし、それが壊れます。

     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

ultrasound1372 avatar Jul 05 '20 22:07 ultrasound1372

修正しましたー

kuma4649 avatar Jul 07 '20 13:07 kuma4649

はい、これは動作します。感謝!

ultrasound1372 avatar Jul 07 '20 22:07 ultrasound1372