kuma4649 / mml2vgm

GNU General Public License v3.0
105 stars 10 forks source link

AY/SSGです。 ハードウェアのエンベロープを現在のノートに同期させる作業を簡略化 #111

Open ultrasound1372 opened 3 years ago

ultrasound1372 commented 3 years ago

ZX SpectrumやAtari STの音楽では、オーディオレートで動作するハードウェアエンベロープを使って、再生中の音を変調し、ベースとなる新しい波形を生成するというトリックがよく使われています。 現在はmml2vgmで実現できていますが、新しい音を再生するたびに、エンベロープ・ジェネレーターの適切な周期を計算して、手動で設定しなければなりません。 ここでnは、エンベロープの周期を導き出すために、現在演奏している音の周波数に加えるべきオクターブの符号付き数です。 もしかしたら、EHSOFでキャンセルできるかもしれません。 このコマンドが有効な間は、ノートが演奏されるたびに、このオクターブオフセットがそのノートのオクターブに加えられ、その後、FNUMテーブルを参照して、ハードウェアエンベロープのための新しい周波数が得られます。 そして、音色のキーオンの直前に自動的に設定されます。 これにより、様々な形状の特徴的なAYベースを作ることができるようになります。

kuma4649 commented 3 years ago

その技術を利用した簡単な例などを見ることは可能でしょうか。

ultrasound1372 commented 3 years ago

以下はその一例です。(ファイルへのリンクは削除しました)

kuma4649 commented 3 years ago

https://twitter.com/kumakumakumaT_T/status/1390957426749296642?s=20

こういうことでしょうか...?

ultrasound1372 commented 3 years ago

なぜかその映像には音が入っておらず、目の不自由な私にはアニメーションがあったかどうかもわかりません。 それを説明していただけますか?

ultrasound1372 commented 3 years ago

気にしないでください、それは私のブラウザの問題でした。 はい、そういうことです。

kuma4649 commented 3 years ago

「大きな改修になりそう」そして「常用するような機能でもない」ので、 できれば対応を遠慮したいのですが...orz

kuma4649 commented 3 years ago

コマンドだけでも考えてみるか...

HSON : Hardware envelope Sync mode ON HSOF : Hardware envelope Sync mode OFf(default) HSOn : Hardware envelope Sync mode Octave ( n : 1 ~ 5 )(default : 3) H> : Hardware envelope Sync mode Octave (+1) H< : Hardware envelope Sync mode Octave (-1) HSDn : Hardware envelope Sync mode Detune ( n : 0 ~ 255 )(default : 0) HSTN : Hardware envelope Sync mode Tone override oN(default) HSTF : Hardware envelope Sync mode Tone override oFf EHTn : (既存コマンド)エンベロープタイプ選択(default : 8)

こんな感じでしょうか。

kuma4649 commented 3 years ago

TAG430 にて対応しました。

ultrasound1372 commented 3 years ago

HTON/HTOFコマンドが何をしているのか説明していただけますか? コマンド表や今回の記事でのあなたの簡単な説明は、私にはあまりわかりませんでした。

ultrasound1372 commented 3 years ago

なるほど、わかったような気がします。 一方では、エンベロープを使って実際に音を鳴らし、一般的にはわずかに音がずれてパルス状の効果が得られますが、もう一方では、何も出力されないチャンネルにエンベロープを流すだけです。 私はそれが機能することを実際には知りませんでした。 実装していただきありがとうございます。 あとは、AY3-8910の2倍のレートで動作するYMチップのSSG部分に対応するテーブルを作成し、そのコマンドをそれらにも動作させ、ページングにリンクさせることです。 プライマリ・チャンネルにドラム、ページにハードウェア・エンベロープ・ベースを配置したとき、ハードウェア・エンベロープはトリガーされないようで、ただの矩形波になってしまいました。

kuma4649 commented 3 years ago

ymチップ? 2203? ページング?

ultrasound1372 commented 3 years ago

YM2203、2608、2610のSSG部分です。 それらは統合されたYM2149Fで、片方のピンを抜いて半分にしないと2倍のクロックスピードで動くという点を除けば、AYのように動作します。 ページングに関しては、mml2vgmのページ機能を参考にしていて、チャンネルのページごとにデータを分割することができます。 現在、ハードウェアエンベロープの状態は保存されていないようです。

kuma4649 commented 3 years ago

どんなmmlでしょうか?

ultrasound1372 commented 3 years ago
'@ ARP 0, 3, #1, | ,15
'@ E 0, 0, 0, 1, 0, 1, 0, 1,AY10
'@ E 1, 0, 0, 1, 0, 1, 0, 2,AY10
'@ ARP 1, 3, #1, 50,80,110,|,130
'@ CAR 0,P,0, #1, 2, 3, 1, 1, 3, |, 2
'@ CAR 1,w,0,#1,1,3,5
'@ VAR 0,0, #2,0,-1,0,-3,-4,-5,|,-2
'@ VAR 1,0,#1,-1,|,-2
'@ VAR 2,0,#2,|,-1
'%sd VP0 VPON CA0,0 CA1,1 CAON0 CAON1 AP0 APON a16 CAOF0 CAOF1 APOF VPOF P1
'%hc P2 w0 @1 EON c32r32 EOF P1
'%k VP2 VPON AP1 APON c16 APOF VPOF

'A1 v15 l8 o3 [%kr.%sdr.%kr16%hc%hc%sdr.]2
'A1_ v15 HSON HSO3 o2 HSTF l8 [rgrgr16g16rrg]2
ultrasound1372 commented 3 years ago

このテストでは、ハードウェアのエンベロープが2ページ目でアクティブになるはずなのに、アクティブにならないようにしました。 まるで、それらの命令を完全に無視しているかのようです。

kuma4649 commented 3 years ago

なるほど。 ページ機能では、保持されるパラメータに制限があり、 今回のパラメータは保持されません。

もしこのパラメータをページ機能に対応させるとなると、 自分のページがアクティブになった時にこのパラメータを送信する処理と、 他のページがアクティブになった時にこのパラメータを送信する前の状態に戻す処理が必要になります。 この改修は割と困難でバグもたくさん産みます。

ultrasound1372 commented 3 years ago

ああ。 虫がたくさん出るとは思いませんでした。

kuma4649 commented 3 years ago

TAG431にて少し対応を入れてみました

kuma4649 commented 3 years ago

あと、示されたサンプルではエンベロープの種類が宣言されていないので、TAG431でもなりません。

'A1_ v15 EHT10 HSON HSO3 o4 HSTF l8 [rgrgr16g16rrg]2

こんな感じで「EHT10」を追加してください。

ultrasound1372 commented 3 years ago

ああ、おっと。

ultrasound1372 commented 3 years ago

うん、使える。 ありがとうございます。 あとは、SSGのチャンネルに実装するだけです。

kuma4649 commented 3 years ago

OPN系でも使えるようになりました。いかがでしょうか?

kuma4649 commented 2 years ago

その後、本件はいかがでしょうか