2024年6月24日月曜日

YAMAHA PSS-460の解析(YM3812 OPL2音色パラメータ)

 注意:このサイトの内容を鵜呑みにし、事故や損失を招いた場合でも当方は一切の責任は負いかねます。自己責任でお願いします。


PSS-460はYAMAHAのポータートーンシリーズの1つです。
FM音源(YM3812,OPL2)が使われています。

21種のプリセット音色のほかにFMパラメータの一部を変更できる「デジタルシンセサイザー」機能があり、68750通りの音色が作れます。(PSS-460の取扱説明書に記載)

この記事では、PSS-460の21種のプリセット音色のパラメータと「デジタルシンセサイザー」機能によるパラメータの変化の観察の過程と結果を書いています。




PSS-460の取扱説明書によるとPSS-460には、68750 = 5x5x5x5x5x(21+1)通り、すなわち5段階調整のツマミが5個あり、さらにプリセット21種から一部のパラメータを差分変更できる機能があります。プリセットに頼らないで5段階調整のツマミ5個で音色をつくるモードもあるので、(21+1)となります。

余談ですが、PSS-460の取扱説明書を見ると、FM音源について解説していたりしています。
分かりそうで分からない面白い表現があったり、見どころが多いのでおすすめです。


PSS-460にはYM3812 (OPL-2)が使われています。
音色パラメータがどうなっているか調べるのには、YM3812を制御するMCUのROMを調べたり、YM3812に書き込まれたデータをのぞき見すればよいということです。

PSS-460のMCUは、HD63B01Y0A66Pが使われています。
このMCUは、プログラムメモリが16KB MaskROMタイプのもので、MCU内部に入っているため通常の方法ではROMの内容を読み取れません。
FM音源が入ったPSS・PSRシリーズの場合、MaskROMタイプのMCUが入っていることが多く、解析難易度が少し上がります。

ただ日立のHD63x01系のMCUの場合、MaskROMの内容を読み出せる可能性があります。
HD63B01Y0にはバスを出せるモード切り替え端子があり、アドレス空間として16KB MaskROM + 48KB 外バスモードにすることができます。
この状態でHD63B01Y0が実行しているアドレス(PC)をどうにか48KB外バスのアドレスへ移動できればプログラムの乗っ取りができ、ROMの内容を吸い出すことができそうです。

一見希望がありそうですが、MaskROMのプログラムがどうなっているか不明なうえ、本当にこの手法が使えるか不明なので今回は別の手法を使います。


今回はYM3812にアクセスするデータをのぞき見してパラメータがどう変化しているか観察します。

PSS460上にあるOPL2のアドレス(カッコ内は2進での厳密な場所)
$1**0 (0001 **** **** ***0) : OPL2アドレスセット
$1**1 (0001 **** **** ***1) : OPL2データセット
 


・YM3812に書き込まれるデータを観察するにはどうするか

ここからはちょっとした小話なので、ページ下の「・PSS-460のYM3812音色パラメータ」まで読み飛ばしてもかまいません。

PSS460のYM3812の端子のロジックを常時監視することで、YM3812に書き込まれたデータを取得できます。
一般的にはロジックアナライザなど使えば簡単に観察できます。しかし、当方はそんないいものは持っていないため、別の方法でYM3812に書き込まれたデータを取得します。

取得する候補として非同期デュアルポートSRAMを使う方法や、非同期FIFOメモリを使う方法があります。
どちらもあまり聞きなれない物ですが、ちょっと高級な機器に使われていたりします。
最近だとFPGAでこういったツールを作るのが楽だと思いますが、今回は上記のメモリを使った場合について考えます。


・非同期デュアルポートSRAM
非同期デュアルポートSRAMは、1つのRAMに対し2つの異なるバスからアクセスできる特殊なSRAMです。
例えば、クロック周波数3.57MHzのZ80のメモリバス空間の一部と、クロック周波数4MHzの6800のバス空間の一部に共通したSRAMを使いたい場合にデュアルポートSRAMを使えばよいということです。
複雑な追加回路なしにデュアルポートSRAM1個でRAMを共有できます。書き込み時に衝突しないように気を付ければ、読み書きタイミングをあまり気にしなくてもよい魔法のようなRAMでしょう。
機器の開発やデバッグなどでかなり便利にはなりそうです。

非同期デュアルポートSRAMの欠点は入手しずらいことと価格が高いことです。
使いどころが限られているので、秋月電子などの巷の電子部品やさんではまず見かけません。
特に近年では非同期デュアルポートSRAMが使われる機会がめっきり減ってきています。
高価な産業用機器や測定機などに使われている場合があるので、中古のジャンクから部品取りして入手するのが良いでしょう。



・非同期FIFOメモリ
非同期FIFOメモリは、その名の通り先入れ先出しメモリと呼ばれるものです。
通常のRAMとの一番の違いは、FIFOメモリはアドレス指定ができないことです。("ランダム"アクセスができないのでRAMと呼べない?)

FIFOメモリを何かに例えるなら、自販機の硬貨を保管する部分(コインメック)の釣銭の出し入れを思い浮かべるといいかもしれません。
コインメックの中が空の場合に硬貨を投入すると、コインメックの底から上に向かって釣銭が積み上がります。
自販機に釣銭が溜まっている場合、返却する硬貨はコインメックの一番底にあるものから出ていきます。
FIFOメモリのデータに対する扱いもこれらと同じです。

もし、コインメックの中が空の場合には「釣銭切れ」の表示が出て釣銭を出しません。
また、コインメックが満杯の場合には、投入した硬貨は釣銭ボックスに入らずに下の金庫へ行きます。金庫に行った硬貨は以降釣銭として出すことはありません。
FIFOメモリの場合、データが空になると「EMPTY FLAG」が立ちます。この時のFIFOメモリの読み出しは禁止されていることがあります。
また、データが満杯になると、「FULL FLAG」が立ち、次以降のデータを書き込もうとすると、FIFOメモリに入れられずに書き込もうとしたデータが破棄されます。

FIFOメモリの使いどころとして、データを連続書き込みしたいが書き込み先のデバイスが極端に遅い場合などが挙げられます。
極端に遅い書き込み先デバイスのちょうどいい例として、FM音源LSIのYM2151があります。
YM2151の場合、データ書き込み後68クロックサイクル待機してからでないと次のデータを書き込めません。1つのレジスタにデータを書き込みする場合などではかまわないのですが、連続してデータを書き込みたい場合、待ち時間がそれなりに発生します。
特に、パソコンなどのシステムの場合、待ち時間処理(ウェイト)に工夫が必要だったりします。YM2151を使った某PCでは、この問題によりオーバークロックしたときに音が鳴らないなどのトラブルがあるそうです。
こんなときに高速なFIFOメモリを通してYM2151にアクセスするといちいちウェイトを気にする必要がなくなるということです。(実際にしようとすると、回路がちょっと複雑になる?)
実際、携帯電話向けのFM音源LSIにはFIFOメモリが入っており、アクセスのウェイトをあまり気にしなくてもよいようになっています。

非同期FIFOメモリの欠点は入手しずらいことと価格が高いことです。
このメモリもまた、使いどころが限られているので、秋月電子などの巷の電子部品やさんではまず見かけません。
高価な産業用機器や測定機などに使われている場合があるので、中古のジャンクから部品取りして入手するのが良いでしょう。



~結局YM3812に書き込まれるデータを観察する場合、どちらのメモリが向いているのか~

非同期デュアルポートSRAM・非同期FIFOメモリどちらも入手しずらく高価です。
ですので、YM3812に書き込まれるデータをのぞき見する回路を実際に作る前提で検討します。(FPGAでいいじゃんとか言わないでね)

・非同期デュアルポートSRAMの場合
非同期デュアルポートSRAMの場合のメリットは、遅いマイコンでもレジスタに書き込まれたデータを十分観察できるということです。
また、YM3812程度のRAMアドレス空間の場合、デュアルポートSRAM単品のアドレス空間で十分賄えます。ですので、YM3812のレジスタのぞき見回路を作る場合、デュアルポートSRAMとちょっとしたロジック回路で済み、楽で良いです。

非同期デュアルポートSRAMの場合のデメリットは、同じアドレスに同じデータが連続して書き込まれた場合に、書き込み回数が検知できないことや、次から次へと高速にデュアルポートSRAMへデータが書き込まれた場合にデータの取りこぼしが起こります。
さらに、どのアドレスにどのデータが書き込まれたかの順番を知ることはできません。
YM3812の場合、レジスタアドレスとそのアドレスのデータの役割は1対1なので上記の問題は起こりにくいです。
しかし、TX81Zなどに使われるYM2414の場合、レジスタアドレスとそのアドレスのデータの役割は1対1ではなく、データの特定のビットによりYM2414内の書き込み先を決めている部分が多いです。よってYM2414の書き込みデータをのぞき見する場合、マイコン側でのデュアルポートSRAMのスキャンを高速化しないとデータの取りこぼしが起こることとなります。


・非同期FIFOメモリの場合
非同期FIFOメモリの場合のメリットは、ターゲットデバイスに書き込まれたデータと書き込み先のアドレスの順番が的確に知れることです。
同じアドレスに同じデータが連続して書き込まれた場合に、書き込み回数が検知できたり、短期間に次から次へと高速にFIFOメモリへデータが書き込まれた場合でも取りこぼさなかったりできます。

非同期FIFOメモリの場合のデメリットは、FIFOメモリ自体にデータが恒久的に保存されないこととオーバーフローした場合にデータが破棄されることです。
さらに、必要なFIFOメモリのビット幅はデータ+アドレスのビット数となるため、コストがかかります。
FIFOメモリから読み取ったアドレス値とデータ値は逐次別のメモリへ書き込まなければ、いけません。これ自体は大したことは無いのですが、FIFOメモリの容量には上限があり、オーバーフローした場合にデータが破棄されるので、データの取りこぼしを防ぐにはFIFOメモリの高速な読み出しが必須となります。
特に長時間に次から次へと高速にFIFOメモリへデータが書き込まれた場合、読み出しが間に合わず、大量にデータの取りこぼしが発生することとなります。
よって、ターゲットデバイスの書き込みより高速な読み出しができるマイコンが必要になります。
YM3812はアクセススピードが比較的遅いので、しょぼいマイコンでもレジスタに書き込まれたデータの観察には対応できると思います。



結局、今回は遅いマイコンでもレジスタに書き込まれたデータを十分観察できる非同期デュアルポートSRAMを使いました。

・非同期デュアルポートSRAMを使った場合の回路例

非同期デュアルポートSRAMとしてIDT7005を使っています。
YM3812もそうですが、ほとんどのFM音源LSIはアドレスバスとデータバスの端子が共通になっています。「A0」端子の状態で現在バスにセットされている値がアドレス値なのかデータ値なのか判別しています。
対して今回使用したデュアルポートSRAMのアドレスバスとデータバスは別になっているので、ターゲットデバイスのアドレスバスとデータバスを分離しなければいけません。
上記回路では74HC573でアドレスを一時保存することで、バスを分離しています。


マイコンのプログラムは今回割愛しますが、非同期デュアルポートSRAMからデータを逐次読み取ってUARTでパソコンへ送信する処理をしています。



・PSS-460のYM3812音色パラメータ

さて、本題のPSS-460のYM3812の音色パラメータの解析です。
今回は上記のレジスタのぞき見回路を使ってYM3812のパラメータを取得しました。

取得したパラメータは、
・プリセット21種
・リズム5種
・ベース
・「デジタルシンセサイザー」のパラメータの変化
です。
プリセット21種からの「デジタルシンセサイザー」による音色パラメータの変化については省略します。


音色パラメータの構造は次の通りです。

・レジスタビットごと
1行目
"AM-OP1(1bit)", "VIB-OP1(1bit)", "EG-TYP-OP1(1bit)", "KSR-OP1(1bit)", "MULTI-OP1(4bit)", "KSL-OP1(2bit)", "TL-OP1(6bit)", "AR-OP1(4bit)", "DR-OP1(4bit)", "SL-KON-OP1(4bit)", "RR-KON-OP1(4bit)", "WS-OP1(2bit)", 
2行目
"AM-OP2(1bit)", "VIB-OP2(1bit)", "EG-TYP-OP2(1bit)", "KSR-OP2(1bit)", "MULTI-OP2(4bit)", "KSL-OP2(2bit)", "TL-OP2(6bit)", "AR-OP2(4bit)", "DR-OP2(4bit)", "SL-KON-OP2(4bit)", "RR-KON-OP2(4bit)", "WS-OP2(2bit)", 
3行目
"DEP_AM", "DEP_VIB", "FB(3bit)", "C(1bit)", 
4行目
"SL-KOFF-SON-OP1(4bit)", "RR-KOFF-SON-OP1(4bit)", "SL-KOFF-SOFF-OP1(4bit)", "RR-KOFF-SOFF-OP1(4bit)", 
5行目
"SL-KOFF-SON-OP2(4bit)", "RR-KOFF-SON-OP2(4bit)", "SL-KOFF-SOFF-OP2(4bit)", "RR-KOFF-SOFF-OP2(4bit)", 


ただし、"AM-OP1(1bit)","AM-OP2(1bit)","VIB-OP1(1bit)"および"VIB-OP2(1bit)"は「VIBRATO」スイッチで変化する値です。
以下の表では「VIBRATO」スイッチがONの状態のときを示しています。
「VIBRATO」スイッチがOFFの状態では、"AM-OP1(1bit)","AM-OP2(1bit)","VIB-OP1(1bit)"が0となります。

また、"SL(4bit)", "RR(4bit)"はキーオン時、キーオフ時およびサスティンの有無で異なるため、それぞれ
"SL-KON(4bit)", "RR-KON(4bit)", "SL-KOFF-SON(4bit)", "RR-KOFF-SON(4bit)", "SL-KOFF-SOFF(4bit)", "RR-KOFF-SOFF(4bit)"としています。
音色パラメータの表の"TL-OP2(6bit)"の値は初期値を示しています。




・レジスタアドレスごと(16進)
実際に値を書き込んだアドレス
1行目
"$20", "$40", "$60", "$80-KON", "$E0", 
2行目
"$23", "$43", "$63", "$83-KON", "$E3", 
3行目
"$BD", "$C0"
4行目
"$80-KOF-SON", "$80-KOF-SOF", 
5行目
"$83-KOF-SON", "$83-KOF-SOF"

※$C0のbit7~bit4は本来未使用のはずですが、PSS460の場合、値を書き込んでいます。
音色パラメータの表「レジスタアドレスごと」では未使用ビットも含めた生の値を示しています。

・プリセット21種

TL値はキーの値によって変化します。(キースケール)
セットした音色によって、キースケールの変化の度合いは変わります。
キースケールの変化のしかたの種類をK_TYPEとしています。

TL値にK_TYPEを加算した時に負になる場合、TLには0x00がセットされます。
音色名 パラメータ(16進)
COSMIC
・レジスタビットごと
0, 1, 0, 0, 1, 0, 13, F, 4, 1, 1, 0, 
0, 1, 0, 0, 1, 0, 5, B, 3, 1, 1, 1, 
0, 1, 6, 0, 
0, 1, 0, 1, 
0, 3, 0, 7

・レジスタアドレスごと
0x41, 0x13, 0xF4, 0x11, 0x00, 
0x41, 0x05, 0xB3, 0x11, 0x01, 
0x40, 0x4C, 
0x01, 0x01, 
0x03, 0x07

CLARINET
・レジスタビットごと
0, 1, 0, 1, 2, 0, 1D+K_TYPE1, F, 0, 0, 0, 0, 
0, 1, 0, 0, 1, 0, 6+K_TYPE2, 7, 6, 1, 0, 0, 
0, 1, 4, 0, 
0, 0, 0, 1, 
0, 5, 0, 8

・レジスタアドレスごと
0x52, 0x1D+K_TYPE1, 0xF0, 0x00, 0x00, 
0x41, 0x06+K_TYPE2, 0x76, 0x10, 0x00, 
0x40, 0x08, 
0x00, 0x01, 
0x05, 0x08

MUSIC BOX
・レジスタビットごと
0, 1, 0, 0, 7, 0, 1B+K_TYPE3, F, B, 5, 1, 0, 
0, 1, 0, 0, 4, 0, 5+K_TYPE4, B, 6, 3, 5, 0, 
0, 1, 3, 0, 
0, 2, 0, 2, 
0, 4, 0, 5

・レジスタアドレスごと
0x47, 0x1B+K_TYPE3, 0xFB, 0x51, 0x00, 
0x44, 0x05+K_TYPE4, 0xB6, 0x35, 0x00, 
0x40, 0x06, 
0x02, 0x02, 
0x04, 0x05

POPSYNTH
・レジスタビットごと
0, 1, 0, 0, 3, 0, 1B+K_TYPE5, 5, 4, 0, 0, 1, 
0, 1, 0, 0, 1, 0, A, 6, 0, 0, 0, 0, 
0, 1, 4, 0, 
0, 1, 0, 1, 
0, 4, 0, 6

・レジスタアドレスごと
0x43, 0x1B+K_TYPE5, 0x54, 0x00, 0x01, 
0x41, 0x0A, 0x60, 0x00, 0x00, 
0x40, 0x18, 
0x01, 0x01, 
0x04, 0x06

VIOLIN
・レジスタビットごと
0, 1, 0, 0, 1, 0, 23+K_TYPE4, F, 0, 0, 0, 0, 
0, 1, 0, 0, 1, 0, 3+K_TYPE2, 7, 1, 0, 0, 1, 
0, 1, 7, 0, 
0, 0, 0, 1, 
0, 5, 0, 7

・レジスタアドレスごと
0x41, 0x23+K_TYPE4, 0xF0, 0x00, 0x00, 
0x41, 0x03+K_TYPE2, 0x71, 0x00, 0x01, 
0x40, 0x4E, 
0x00, 0x01, 
0x05, 0x07

PIANO
・レジスタビットごと
1, 0, 0, 1, 3, 0, 28+K_TYPE6, F, 2, 1, 1, 0, 
0, 0, 0, 0, 1, 0, 4+K_TYPE7, C, 4, 2, 3, 0, 
1, 0, 0, 0, 
0, 1, 0, 1, 
0, 3, 0, 7

・レジスタアドレスごと
0x93, 0x28+K_TYPE6, 0xF2, 0x11, 0x00, 
0x01, 0x04+K_TYPE7, 0xC4, 0x23, 0x00, 
0x80, 0x00, 
0x01, 0x01, 
0x03, 0x07

BLUESSYNTH
・レジスタビットごと
0, 1, 0, 0, 1, 0, 10+K_TYPE8, F, 6, 3, 0, 1, 
0, 1, 0, 0, 2, 0, 2+K_TYPE3, A, F, 1, 1, 1, 
0, 1, 7, 0, 
0, 1, 0, 1, 
0, 5, 0, 7

・レジスタアドレスごと
0x41, 0x10+K_TYPE8, 0xF6, 0x30, 0x01, 
0x42, 0x02+K_TYPE3, 0xAF, 0x11, 0x01, 
0x40, 0x5E, 
0x01, 0x01, 
0x05, 0x07

FLUTE
・レジスタビットごと
1, 0, 0, 1, 1, 0, 12, F, 7, 7, 0, 0, 
1, 0, 0, 0, 1, 0, 1+K_TYPE4, 6, 1, 0, 0, 0, 
0, 0, 7, 0, 
0, 0, 0, 1, 
0, 5, 0, 7

・レジスタアドレスごと
0x91, 0x12, 0xF7, 0x70, 0x00, 
0x81, 0x01+K_TYPE4, 0x61, 0x00, 0x00, 
0x00, 0x0E, 
0x00, 0x01, 
0x05, 0x07

ELECTRIC PIANO
・レジスタビットごと
1, 0, 0, 1, 8, 0, 2A, F, A, 5, 2, 0, 
1, 0, 0, 0, 1, 0, 6+K_TYPE10, C, 4, 1, 2, 0, 
1, 0, 0, 0, 
0, 1, 0, 1, 
0, 4, 0, 7

・レジスタアドレスごと
0x98, 0x2A + K_TYPE9, 0xFA, 0x52, 0x00, 
0x81, 0x06+K_TYPE10, 0xC4, 0x12, 0x00, 
0x80, 0x00, 
0x01, 0x01, 
0x04, 0x07

FUNKSYNTH
・レジスタビットごと
1, 1, 0, 0, 3, 0, 1F+K_TYPE11, F, 3, 1, 0, 0, 
0, 1, 0, 0, 4, 0, 4+K_TYPE12, F, 3, 5, 1, 1, 
0, 1, 3, 0, 
0, 2, 0, 2, 
0, 4, 0, 7

・レジスタアドレスごと
0xC3, 0x1F+K_TYPE11, 0xF3, 0x10, 0x00, 
0x44, 0x04+K_TYPE12, 0xF3, 0x51, 0x01, 
0x40, 0x46, 
0x02, 0x02, 
0x04, 0x07

TRUMPET
・レジスタビットごと
0, 1, 0, 0, 1, 0, 1E, 8, 2, 1, 1, 0, 
0, 1, 0, 0, 1, 0, 6+K_TYPE2, A, 1, 0, 0, 0, 
0, 1, 7, 0, 
0, 1, 0, 1, 
0, 5, 0, 8

・レジスタアドレスごと
0x41, 0x1E, 0x82, 0x11, 0x00, 
0x41, 0x06+K_TYPE2, 0xA1, 0x00, 0x00, 
0x40, 0x0E, 
0x01, 0x01, 
0x05, 0x08

HARPSI CHORD
・レジスタビットごと
0, 0, 0, 1, 1, 0, 4+K_TYPE3, F, A, 1, 0, 0, 
0, 0, 0, 1, 6, 0, 2+K_TYPE7, E, 7, 2, 2, 1, 
0, 0, 0, 0, 
0, 0, 0, 0, 
0, 2, 0, 4

・レジスタアドレスごと
0x11, 0x04+K_TYPE3, 0xFA, 0x10, 0x00, 
0x16, 0x02+K_TYPE7, 0xE7, 0x22, 0x01, 
0x00, 0x40, 
0x00, 0x00, 
0x02, 0x04

SLAPSYNTH
・レジスタビットごと
0, 1, 0, 0, 1, 0, 8+K_TYPE13, 9, 8, 2, 1, 0, 
0, 1, 0, 0, 1, 0, A+K_TYPE3, F, 3, 1, 1, 0, 
0, 1, 5, 0, 
0, 0, 0, 1, 
0, 4, 0, 7

・レジスタアドレスごと
0x41, 0x08+K_TYPE13, 0x98, 0x21, 0x00, 
0x41, 0x0A+K_TYPE3, 0xF3, 0x11, 0x00, 
0x40, 0x0A, 
0x00, 0x01, 
0x04, 0x07

HORN
・レジスタビットごと
0, 1, 0, 0, 1, 0, 1D+K_TYPE5, 6, 3, 8, 1, 0, 
0, 1, 0, 0, 1, 0, 6+K_TYPE2, 8, 0, 0, 0, 0, 
0, 1, 6, 0, 
0, 0, 0, 1, 
0, 5, 0, 7

・レジスタアドレスごと
0x41, 0x1D+K_TYPE5, 0x63, 0x81, 0x00, 
0x41, 0x06+K_TYPE2, 0x80, 0x00, 0x00, 
0x40, 0x0C, 
0x00, 0x01, 
0x05, 0x07

KOTO
・レジスタビットごと
0, 1, 0, 1, 3, 0, D+K_TYPE14, F, F, 3, 3, 1, 
0, 1, 0, 1, 1, 0, 1+K_TYPE4, F, 8, 2, 3, 0, 
0, 0, 0, 0, 
0, 1, 0, 2, 
0, 2, 0, 4

・レジスタアドレスごと
0x53, 0x0D+K_TYPE14, 0xFF, 0x33, 0x01, 
0x51, 0x01+K_TYPE4, 0xF8, 0x23, 0x00, 
0x00, 0x10, 
0x01, 0x02, 
0x02, 0x04

JAZZ ORGAN
・レジスタビットごと
1, 1, 0, 0, 3, 0, A+TYPE15, F, A, 3, 0, 0, 
1, 1, 0, 0, 1, 0, A+K_TYPE3, F, 0, 8, 0, 0, 
0, 1, 4, 1, 
0, 4, 0, A, 
0, 4, 0, A

・レジスタアドレスごと
0xC3, 0x0A+TYPE15, 0xFA, 0x30, 0x00, 
0xC1, 0x0A+K_TYPE3, 0xF0, 0x80, 0x00, 
0x40, 0x09, 
0x04, 0x0A, 
0x04, 0x0A

SAXOPHONE
・レジスタビットごと
0, 1, 0, 0, 2, 0, 14, D, 7, 2, 0, 1, 
0, 1, 0, 0, 0, 0, 7, 7, 0, 0, 0, 1, 
0, 1, 7, 0, 
0, 2, 0, 2, 
0, 5, 0, 7

・レジスタアドレスごと
0x42, 0x14, 0xD7, 0x20, 0x01, 
0x40, 0x07, 0x70, 0x00, 0x01, 
0x40, 0x5E, 
0x02, 0x02, 
0x05, 0x07

JAZZ GUITAR
・レジスタビットごと
0, 1, 0, 1, 2, 0, 1E+K_TYPE16, F, 8, 3, 2, 1, 
0, 1, 0, 0, 1, 0, 2, F, 7, 1, 3, 0, 
0, 0, 5, 0, 
0, 3, 0, 4, 
0, 4, 0, 7

・レジスタアドレスごと
0x52, 0x1E+K_TYPE16, 0xF8, 0x32, 0x01, 
0x41, 0x02, 0xF7, 0x13, 0x00, 
0x00, 0x1A, 
0x03, 0x04, 
0x04, 0x07

PIPE ORGAN
・レジスタビットごと
0, 1, 0, 0, 5, 0, 24+K_TYPE3, C, 0, 0, 0, 1, 
0, 1, 0, 0, 1, 0, 9+K_TYPE3, 8, 3, 0, 0, 0, 
0, 0, 3, 0, 
0, 1, 0, 1, 
0, 4, 0, 6

・レジスタアドレスごと
0x45, 0x24+K_TYPE3, 0xC0, 0x00, 0x01, 
0x41, 0x09+K_TYPE3, 0x83, 0x00, 0x00, 
0x00, 0x16, 
0x01, 0x01, 
0x04, 0x06

OBOE
・レジスタビットごと
0, 1, 0, 0, 1, 0, 1F+K_TYPE5, F, 0, 0, 0, 0, 
0, 1, 0, 0, 4, 0, A, 9, 1, 0, 0, 0, 
0, 1, 5, 0, 
0, 1, 0, 1, 
0, 5, 0, 8

・レジスタアドレスごと
0x41, 0x1F+K_TYPE5, 0xF0, 0x00, 0x00, 
0x44, 0x0A, 0x91, 0x00, 0x00, 
0x40, 0x0A, 
0x01, 0x01, 
0x05, 0x08

VIBES
・レジスタビットごと
1, 1, 0, 1, 7, 0, 21+K_TYPE17, F, D, 2, 3, 1, 
1, 0, 0, 0, 1, 0, 2, E, 7, 3, 4, 0, 
1, 0, 2, 0, 
0, 3, 0, 2, 
0, 3, 0, 6

・レジスタアドレスごと
0xD7, 0x21+K_TYPE17, 0xFD, 0x23, 0x01, 
0x81, 0x02, 0xE7, 0x34, 0x00, 
0x80, 0x14, 
0x03, 0x02, 
0x03, 0x06




・キースケールの種類と対応するTL値の変化
A4(440Hz)の時のTL値を基準とし、K_TYPE=0としています。

キースケールの種類 TL値の変化(10進)
K_TYPE1
K_TYPE1 = -7 : C2~D#2
K_TYPE1 = -6 : E2~A2
K_TYPE1 = -5 : A#2~D#3
K_TYPE1 = -4 : E3~A3
K_TYPE1 = -3 : A#3~C#4
K_TYPE1 = -2 : D4~D#4
K_TYPE1 = -1 : E4~G4
K_TYPE1 = 0 : G#4~A4
K_TYPE1 = 1 : A#4~B4
K_TYPE1 = 2 : C5~D#5
K_TYPE1 = 3 : E5~F5
K_TYPE1 = 4 : F#5~G5
K_TYPE1 = 5 : G#5~B5
K_TYPE1 = 6 : C6

K_TYPE2
K_TYPE2 = -6 : C2~B2
K_TYPE2 = -5 : C3~C#3
K_TYPE2 = -4 : D3~D#3
K_TYPE2 = -3 : E3~G3
K_TYPE2 = -2 : G#3~A3
K_TYPE2 = -1 : A#3~B3
K_TYPE2 = 0 : C4~C6

K_TYPE3
K_TYPE3 = -4 : C2~D#2
K_TYPE3 = -3 : E2~A2
K_TYPE3 = -2 : A#2~D#3
K_TYPE3 = -1 : E3~A3
K_TYPE3 = 0 : A#3~C6

K_TYPE4
K_TYPE4 = 1 : C2~G4
K_TYPE4 = 0 : G#4~F5
K_TYPE4 = -1 : F#5~C6

K_TYPE5
K_TYPE5 = -5 : C2~D#2
K_TYPE5 = -4 : E2~A2
K_TYPE5 = -3 : A#2~D#3
K_TYPE5 = -2 : E3~A3
K_TYPE5 = -1 : A#3~G4
K_TYPE5 = 0 : G#4~F5
K_TYPE5 = 1 : F#5~C6

K_TYPE6
K_TYPE6 = -18 : C2~C#2
K_TYPE6 = -17 : D2~D#2
K_TYPE6 = -16 : E2~F2
K_TYPE6 = -15 : F#2~G2
K_TYPE6 = -14 : G#2~A2
K_TYPE6 = -13 : A#2~B2
K_TYPE6 = -12 : C3~C#3
K_TYPE6 = -10 : D3~D#3
K_TYPE6 = -9 : E3~F3
K_TYPE6 = -7 : F#3~G3
K_TYPE6 = -6 : G#3~A3
K_TYPE6 = -5 : A#3~B3
K_TYPE6 = -3 : C4~C#4
K_TYPE6 = -2 : D4~D#4
K_TYPE6 = -1 : E4~G4
K_TYPE6 = 0 : G#4~A4
K_TYPE6 = 1 : A#4~B4
K_TYPE6 = 2 : C5~D#5
K_TYPE6 = 3 : E5~F5
K_TYPE6 = 4 : F#5~G5
K_TYPE6 = 5 : G#5~B5
K_TYPE6 = 6 : C6

K_TYPE7
K_TYPE7 = -4 : C2~C#3
K_TYPE7 = -3 : D3~D#3
K_TYPE7 = -2 : E3~G3
K_TYPE7 = -1 : G#3~A3
K_TYPE7 = 0 : A#3~B3
K_TYPE7 = 1 : C4~D#4
K_TYPE7 = 0 : E4~A4
K_TYPE7 = -1 : A#4~D#5
K_TYPE7 = -2 : E5~A5
K_TYPE7 = -3 : A#5~C6

K_TYPE8
K_TYPE8 = -1 : C2~F4
K_TYPE8 = 0 : F#4~B4
K_TYPE8 = 1 : C5~C#5
K_TYPE8 = 2 : D5~E5
K_TYPE8 = 3 : F5~G5
K_TYPE8 = 5 : G#5~A5
K_TYPE8 = 6 : A#5~B5
K_TYPE8 = 8 : C6

K_TYPE9
K_TYPE9 = -11 : C2~D#2
K_TYPE9 = -10 : D2~E2
K_TYPE9 = -9 : F2~F#2
K_TYPE9 = -8 : G#2~B2
K_TYPE9 = -7 : C3~C#3
K_TYPE9 = -6 : D3~D#3
K_TYPE9 = -5 : E3~G3
K_TYPE9 = -4 : G#3~A3
K_TYPE9 = -3 : A#3~B3
K_TYPE9 = -2 : C4~D#4
K_TYPE9 = -1 : E4~F4
K_TYPE9 = 0 : F#4~A4
K_TYPE9 = 1 : A#4~B5
K_TYPE9 = 2 : C5~C#5
K_TYPE9 = 3 : D5~D#5
K_TYPE9 = 4 : E5~F5
K_TYPE9 = 5 : F#5~G5
K_TYPE9 = 6 : G#5~A5
K_TYPE9 = 8 : A#5~B5
K_TYPE9 = 9 : C6

K_TYPE10
K_TYPE10 = -6 : C2~F3
K_TYPE10 = -5 : F#3~G3
K_TYPE10 = -4 : G#3~A3
K_TYPE10 = -3 : A#4~B3
K_TYPE10 = -1 : C4~G4
K_TYPE10 = 0 : G#4~F5
K_TYPE10 = 1 : F#5~C6

K_TYPE11
K_TYPE11 = -10 : C2~C#
K_TYPE11 = -9 : D2~F2
K_TYPE11 = -8 : F#2~G2
K_TYPE11 = -7 : G#2~B2
K_TYPE11 = -6 : C3~C#3
K_TYPE11 = -5 : D3~D#3
K_TYPE11 = -4 : E3~G3
K_TYPE11 = -3 : G#3~A3
K_TYPE11 = -2 : A#3~B3
K_TYPE11 = -1 : C4~F4
K_TYPE11 = 0 : F#4~B4
K_TYPE11 = 1 : C5~F5
K_TYPE11 = 2 : F#5~A5
K_TYPE11 = 3 : A#5~B5
K_TYPE11 = 4 : C6

K_TYPE12
K_TYPE12 = -3 : C2~D#2
K_TYPE12 = -2 : E2~A2
K_TYPE12 = -1 : A#2~D#3
K_TYPE12 = 0 : E3~A3
K_TYPE12 = 1 : A#3~G4
K_TYPE12 = 0 : G#4~F5
K_TYPE12 = -1 : F#5~C6

K_TYPE13
K_TYPE13 = -2 : C2~D#4
K_TYPE13 = -1 : E4~F4
K_TYPE13 = 0 : F#4~A4
K_TYPE13 = 1 : A#4~B5
K_TYPE13 = 2 : C5~C#5
K_TYPE13 = 3 : D5~D#5
K_TYPE13 = 4 : E5~F5
K_TYPE13 = 5 : F#5~G5
K_TYPE13 = 6 : G#5~A5
K_TYPE13 = 8 : A#5~B5
K_TYPE13 = 9 : C6

K_TYPE14
K_TYPE14 = -13 : C2~F2
K_TYPE14 = -12 : F#2~G2
K_TYPE14 = -11 : G#2~B2
K_TYPE14 = -10 : C3~C#3
K_TYPE14 = -9 : D3~D#3
K_TYPE14 = -8 : E3~G3
K_TYPE14 = -7 : G#3~A3
K_TYPE14 = -6 : A#3~B3
K_TYPE14 = -5 : C4~C#4
K_TYPE14 = -4 : D4~D#4
K_TYPE14 = -2 : E4~F4
K_TYPE14 = -1 : F#4~G4
K_TYPE14 = 0 : G#4~A4
K_TYPE14 = 2 : A#4~B4
K_TYPE14 = 3 : C5~C#5
K_TYPE14 = 4 : D5~D#5
K_TYPE14 = 6 : E5~F#5
K_TYPE14 = 7 : F#5~G#5
K_TYPE14 = 8 : G#5~A5
K_TYPE14 = 10 : A#5~B5
K_TYPE14 = 18 : C6

K_TYPE15
K_TYPE15 = 4 : C2~D#2
K_TYPE15 = 3 : E2~A2
K_TYPE15 = 2 : A#2~D#3
K_TYPE15 = 1 : E3~A3
K_TYPE15 = 0 : A#3~C6

K_TYPE16
K_TYPE16 = -10 : C2~C#2
K_TYPE16 = -9 : D2~E2
K_TYPE16 = -8 : F#2~G3
K_TYPE16 = -7 : G#2~B2
K_TYPE16 = -6 : C3~C#3
K_TYPE16 = -5 : D3~D#3
K_TYPE16 = -4 : E3~G3
K_TYPE16 = -3 : G#3~A3
K_TYPE16 = -2 : A#3~B3
K_TYPE16 = -1 : C4~E4
K_TYPE16 = 0 : E4~A4
K_TYPE16 = 1 : A#4~D#5
K_TYPE16 = 2 : E5~A5
K_TYPE16 = 3 : A#5~C6

K_TYPE17
K_TYPE17 = -12 : C2~C#2
K_TYPE17 = -11 : D2~E2
K_TYPE17 = -10 : F#2~G2
K_TYPE17 = -9 : G#2~B2
K_TYPE17 = -8 : C3~C#3
K_TYPE17 = -7 : D3~D#3
K_TYPE17 = -6 : E3~G3
K_TYPE17 = -5 : G#3~A3
K_TYPE17 = -4 : A#3~B3
K_TYPE17 = -3 : C4~C#4
K_TYPE17 = -2 : D4~D#4
K_TYPE17 = -1 : E4~G4
K_TYPE17 = 0 : G#4~A4
K_TYPE17 = 1 : A#4~B4
K_TYPE17 = 2 : C5~D#5
K_TYPE17 = 3 : E5~F5
K_TYPE17 = 4 : F#5~G5
K_TYPE17 = 5 : G#5~B5
K_TYPE17 = 6 : C6



・ベース、コード

コードは押さえたキーの1オクターブ上の音が鳴ります。

音色名パラメータ(16進)
ベース
・レジスタビットごと
0, 0, 0, 0, 1, 0, 1F+K_TYPE11, C, 3, 1, 1, 0, 
0, 0, 0, 0, 1, 0, B+K_TYPE11, C, 3, 3, 2, 0, 
0, 0, 0, 0, 
0, 1, 0, 1, 
0, 8, 0, 8

・レジスタアドレスごと
0x01, 0x1F+K_TYPE11, 0xC3, 0x11, 0x00, 
0x01, 0x0B+K_TYPE11, 0xC3, 0x32, 0x00, 
0x00, 0x00, 
0x01, 0x01, 
0x08, 0x08


音色名パラメータ(16進)
コード
・レジスタビットごと
0, 0, 0, 1, 3, 0, 28+K_TYPE6, F, 2, 2, 0, 0, 
0, 0, 0, 1, 1, 0, D+K_TYPE2, C, 4, 2, 0, 0, 
0, 0, 0, 0, 
0, 1, 0, 1, 
0, 6, 0, 6

・レジスタアドレスごと
0x13, 0x28+K_TYPE6, 0xF2, 0x20, 0x00, 
0x11, 0x0D+K_TYPE2, 0xC4, 0x20, 0x00, 
0x00, 0x00, 
0x01, 0x01, 
0x06, 0x06



・リズム5種


・バスドラムのパラメータ構造
レジスタビットごと
"AM-OP1(1bit)", "VIB-OP1(1bit)", "EG-TYP-OP1(1bit)", "KSR-OP1(2bit)", "MULTI-OP1(4bit)", "KSL-OP1(2bit)", "TL-OP1(6bit)", "AR-OP1(4bit)", "DR-OP1(4bit)", "SL-KON-OP1(4bit)", "RR-KON-OP1(4bit)", "WS-OP1(2bit)", 
"AM-OP2(1bit)", "VIB-OP2(1bit)", "EG-TYP-OP2(1bit)", "KSR-OP2(2bit)", "MULTI-OP2(4bit)", "KSL-OP2(2bit)", "TL-OP2(6bit)", "AR-OP2(4bit)", "DR-OP2(4bit)", "SL-KON-OP2(4bit)", "RR-KON-OP2(4bit)", "WS-OP2(2bit)", 
"FNUM(10bit)", "BLOCK(3bit)", "FB(3bit)", "C(1bit)"
レジスタアドレスごと
$30, $50, $70, $90-KON, $F0, 
$33, $53, $73, $93, $F3, 
$A6, $B6, $C6


スネアドラム、
ハイハットクローズ、
ハイハットオープン、
ボンゴのパラメータ構造
レジスタビットごと
[チャンネル8]
"AM-OP1(1bit)", "VIB-OP1(1bit)", "EG-TYP-OP1(1bit)", "KSR-OP1(2bit)", "MULTI-OP1(4bit)", "KSL-OP1(2bit)", "TL-OP1(6bit)", "AR-OP1(4bit)", "DR-OP1(4bit)", "SL-KON-OP1(4bit)", "RR-KON-OP1(4bit)", "WS-OP1(2bit)", 
"AM-OP2(1bit)", "VIB-OP2(1bit)", "EG-TYP-OP2(1bit)", "KSR-OP2(2bit)", "MULTI-OP2(4bit)", "KSL-OP2(2bit)", "TL-OP2(6bit)", "AR-OP2(4bit)", "DR-OP2(4bit)", "SL-KON-OP2(4bit)", "RR-KON-OP2(4bit)", "WS-OP2(2bit)", 
"FNUM(10bit)", "BLOCK(3bit)", "FB(3bit)", "C(1bit)", 
[チャンネル9]
"AM-OP1(1bit)", "VIB-OP1(1bit)", "EG-TYP-OP1(1bit)", "KSR-OP1(2bit)", "MULTI-OP1(4bit)", "KSL-OP1(2bit)", "TL-OP1(6bit)", "AR-OP1(4bit)", "DR-OP1(4bit)", "SL-KON-OP1(4bit)", "RR-KON-OP1(4bit)", "WS-OP1(2bit)", 
"AM-OP2(1bit)", "VIB-OP2(1bit)", "EG-TYP-OP2(1bit)", "KSR-OP2(2bit)", "MULTI-OP2(4bit)", "KSL-OP2(2bit)", "TL-OP2(6bit)", "AR-OP2(4bit)", "DR-OP2(4bit)", "SL-KON-OP2(4bit)", "RR-KON-OP2(4bit)", "WS-OP2(2bit)", 
"FNUM(10bit)", "BLOCK(3bit)", "FB(3bit)", "C(1bit)"
レジスタアドレスごと
$31, $51, $71, $91, $F1, 
$34, $54, $74, $94, $F4, 
$A7, $B7, $C7, 
$32, $52, $72, $92, $F2, 
$35, $55, $75, $95, $F5, 
$A8, $B8, $C8

音色名 パラメータ(16進)
バスドラム(FM)
チャンネル7
・レジスタビットごと
0, 0, 0, 0, 1, 0, 16, D, F, 6, A, 1, 
0, 0, 0, 0, 1, 0, 0, F, 7, 6, B, 0, 
230, 2, 7, 0
・レジスタアドレスごと
0x01, 0x16, 0xDF, 0x6A, 0x01, 
0x01, 0x00, 0xF7, 0x6B, 0x00, 
0x30, 0x0A, 0x0E

スネアドラム
ハイハットクローズ
ハイハットオープン
ボンゴ
チャンネル8
チャンネル9
・レジスタビットごと
0, 0, 0, 0, 1, 0, 10, C, 8, A, 6, 0, 
0, 0, 0, 0, 1, 0, A, D, 8, 4, 8, 0, 
2A0, 2, 0, 1
0, 0, 0, 0, 1, 0, 4, F, 8, 5, 9, 0, 
0, 0, 0, 0, 1, 0, 10, A, A, 5, 5, 0, 
380, 0, 0, 1
・レジスタアドレスごと
0x01, 0x10, 0xC8, 0xA6, 0x00, 
0x01, 0x0A, 0xD8, 0x48, 0x00, 
0xA0, 0x0A, 0x01, 
0x05, 0x04, 0xF8, 0x59, 0x00, 
0x01, 0x10, 0xAA, 0x55, 0x00, 
0x80, 0x03, 0x01




・PSS-460の「デジタルシンセサイザー」レバーのパラメータの変化

レバーの状態によらず固定の値となるパラメータは以下の通りです。
C($C0~$C8のbit0) = 0 : オペレータのシリアル接続
KSL($40~$45のbit7,6)OP2 = 0
KSL($20~$35のbit4)OP1とOP2 = 0
DEP_VIB($BDのbit6) = 1
VIB($20~$35のbit6)OP1とOP2 : 「VIBRATO」スイッチの状態で変化、スイッチがONのときVIBの値が1となる


・レバー「WAVE」で変化するパラメータ
レバーの位置  FB 
$C0~$C8
のbit3~1
 WS 
$E0~$F5
のbit1,0
 左同 
 オペレータ→ - M (OP1) C (OP2)
5 0x7 0x0 0x1
4 0x7 0x0 0x0
3 0x6 0x1 0x0
2 0x6 0x0 0x0
1 0x3 0x0 0x0
$C0~$C8のbit7~4は未割り当てであるが、なぜかレバーが3のとき0x1が、レバーが5のとき0x4がセットされる。OPL3の場合、出力するチャンネル指定レジスタとして使われており、OPL3を意識した機能なのでしょうか?


・レバー「SPACTRUM」で変化するパラメータ
レバーの位置  MULTI 
$20~$35
のbit3~0
左同
 オペレータ→ M (OP1) C (OP2)
5 0x5 0x3
4 0x7 0x1
3 0x3 0x1
2 0x1 0x1
1 0x0 0x1


・レバー「MODULATION」で変化するパラメータ
レバーの位置  KSL
$40~$45
のbit7,6
 TL
$40~$45のbit5~0
 オペレータ→ M (OP1) M (OP1)
5 0x1 0x17 + DW + K_TYPE11
4 0x1 0x1B + DW + K_TYPE11
3 0x1 0x1F + DW + K_TYPE11
2 0x1 0x23 + DW + K_TYPE11
1 0x2 0x2B + DW + K_TYPE11
上記の表のDWは「DECAY」レバーで変化する値です。
DW = -0x14「DECAY」= 5のとき
DW = -0x0C 「DECAY」= 4のとき
DW = -0x03 「DECAY」= 3のとき
DW = -0x06 :「DECAY」= 2のとき
DW = 0x00 :「DECAY」= 1のとき

PSS-460ハードウェアキースケールを採用しているため、音階によってTLの値が変化します。上記の表はA4(440Hz)をキースケール量K_TYPE11=0としたときのものです。
オクターブとキースケール量K_TYPE11の値は以下の通りです。
K_TYPE11 = -1 : C2~F4
K_TYPE11 = 0 : F#4~B4
K_TYPE11 = 1 : C5~F5
K_TYPE11 = 2 : F#5~A5
K_TYPE11 = 3 : A#5~B5
K_TYPE11 = 4 : C6

基本的には「MODULATION」レバーを1つ上げるごとにTL値が4減ります。(レバーが1→2の時のみTL値が8減る)
また、「MODULATION」レバーを上げるとTL値が減る傾向があります。(レバーが3の時は例外)


・レバー「ATTACK」で変化するパラメータ
レバーの位置 AR 
$60~$75
のbit7~4
 左同
 オペレータ→M (OP1)C (OP2)
50xF0xF
40x70xB
30xC0x8
20xC0x5
10x30x8


・レバー「DECAY」で変化するパラメータ
 レバーの位置   DR
$60~$75
のbit3~0
 左同  SL
$80~$95
のbit7~4

キーオン中
 左同  RR 
$80~$95
のbit3~0

キーオン中
 左同  SL
$80~$95
のbit7~4

キーオフ中
 左同  RR 
$80~$95
のbit3~0

キーオフ中
 左同
 オペレータ→ M
(OP1)
C
 (OP2)
M
(OP1)
C
 (OP2)
M
(OP1)
C
 (OP2)
M
 (OP1)
C
 (OP2)
M
(OP1)
C
 (OP2)
5 0x9 0x6 0x5 0x6 0x4 0x3 0x0 0x0 0x5
※0x3
0x7
※0x5
4 0x9 0x5 0x3 0x3 0x2 0x3 0x0 0x0 0x3
※0x3
0x7
※0x5
3 0x3 0x3 0x1 0x3 0x1 0x2 0x0 0x0 0x3
※0x3
0x7
※0x5
2 0x4 0x5 0x2 0x1 0x0 0x0 0x0 0x0 0x3
※0x3
0x7
※0x5
1 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x3
※0x2
0x7
※0x5

※の値はサスティンボタン「SUSTAIN」がONのときの値

実際には「DECAY」レバーによってOP1のTL値が変化します。
詳細は「・レバー「MODULATION」で変化するパラメータ」を参照してください。


・レバー「VOLUME」で変化するパラメータ
レバーの位置  TL
$40~$45のbit5~0
 オペレータ→ M (OP2)
5 0x01 + K_TYPE5
4 0x05 + K_TYPE5
3 0x09 + K_TYPE5
2 0x0D + K_TYPE5
1 0x11 + K_TYPE5
PSS-460ハードウェアキースケールを採用しているため、音階によってTLの値が変化します。上記の表はA4(440Hz)をキースケール量K_TYPE5=0としたときのものです。上記式で値が負になる場合、0がセットされます。
オクターブとキースケール量K_TYPE5の値は以下の通りです。
K_TYPE5 = -5 : C2~D#2
K_TYPE5 = -4 : E2~A2
K_TYPE5 = -3 : A#2~D#3
K_TYPE5 = -2 : E3~A3
K_TYPE5 = -1 : A#3~G4
K_TYPE5 = 0 : G#4~F5
K_TYPE5 = 1 : F#5~C6

基本的には「VOLUME」レバーを1つ上げるごとにTL値が4減ります。














0 件のコメント:

コメントを投稿