YM2164(OPP)に続いて、YM2414(OPZ)のレジスタの解析を行った。 レジスタ情報を調べるために、OPZを搭載しているシンセサイザーTX81ZのシステムROMを解析した。
OPP搭載シンセサイザーの解析では、FM音源チップ自体の機能拡張がほとんどないことがわかったが、 OPZではオシレータの波形選択や固定周波数モードなど音源チップを拡張しなければ実現できない機能もある。 だが、OPM,OPPの未使用レジスタはあまり多くない。 OPNからOPNAへ拡張を行ったときのように、レジスタのポートを1組追加することも考えられるが、 TX81Zの保守用マニュアルの回路図を見ると、OPZのアドレスピンはOPMから変わっておらず、 レジスタのポートは増えていないことがわかる。 (2013.04.22)
音色データにはVCEDフォーマットとACEDフォーマットがある。VCEDは、DX100などOPP搭載機種から使われているフォーマットである。ACEDはOPZ搭載機種で拡張された音色データである。
プログラムを解析した結果より、ボイスパラメータがどのようにOPZのレジスタに書き込まれているかを示す。 OPMにない機能のうち、音源チップで実現されたものを赤字で示し、ソフトウェアで実現されたものを青字で示した。
VCED (OPP標準パラメータ)
offset | パラメータ名 (値の有効範囲) |
パラメータの作用 | |
Op4 | |
0 | EG ATTACK RATE (0-31) |
VCEDの値 → OPZ $80[___* ****] | |
1 | EG 1st DECAY RATE (0-31) |
VCEDの値 → OPZ $a0[___* ****] | |
2 | EG 2nd DECAY RATE (0-31) |
VCEDの値 → OPZ $c0[___* ****] | |
3 | EG RELEASE RATE (1-31) |
VCEDの値 → OPZ $e0[____ ****] | |
4 | EG 1st DECAY LEVEL (0-15) |
VCEDの値 → OPZ $e0[**** ____] | |
5 | KEYBOARD LEVEL SCALING (0-99) キーが高いほどOUTPUT LEVELを弱める度合いを設定する |
OUTPUT LEVELの制御に使われる | |
6 | KEYBOARD RATE SCALING (0-3) |
VCEDの値 → OPZ $80[**__ ____] | |
7 | EG BIAS SENSITIVITY (0-7) OUTPUT LEVELを下げ、ブレスコントローラによってレベルを上げる余地を作る |
OUTPUT LEVELの制御に使われる | |
8 | AME (0-1) |
VCEDの値 → OPZ $a0[*___ ____] | |
9 | KEY VELOCITY SENSITIVITY (0-7) ベロシティによってOUTPUT LEVELの強弱をつける |
OUTPUT LEVELの値の制御に使われる | |
10 | OPERATOR OUTPUT LEVEL (0-99) |
加工された値 → OPZ $60[_*** ****] | |
11 | OSCILLATOR FREQUENCY COARSE (0-63) RATIOモードではオシレータの周波数の倍率を設定する FIXモードではオシレータの固定周波数を設定する |
(RATIO)VCEDの値がMULTIPLEとDETUNE2に変換される。 MUL → OPZ $40[0___ ****] ; DT2 → OPZ $c0[**__ ____] (FIX)VCEDの6bitの値のうち上位4bitのみ有効 → OPZ $40[____ ****] |
|
12 | DETUNE (0-6) |
加工された値 → OPZ $40[0*** ____] | |
Op2 | |
13 | |
Op3 | |
26 | |
Op1 | |
39 | |
52 | ALGORITHM SELECT (0-7) |
VCEDの値 → OPZ $20[____ _***] | |
53 | FEEDBACK LEVEL (0-7) |
VCEDの値 → OPZ $20[__** *___] | |
54 | LFO SPEED (0-99) |
加工された値 → OPZ $18[**** ****] or $16[**** ****] | |
55 | LFO DELAY (0-99) PMD/AMDの深さが増大する速さを設定する |
AMD,PMDの値に影響する | |
56 | LFO PITCH MODULATION DEPTH (0-99) |
加工された値 → OPZ $19[1*** ****] or $17[1*** ****] | |
57 | LFO AMPLITUDE MODULATION DEPTH (0-99) |
加工された値 → OPZ $19[0*** ****] or $17[0*** ****] | |
58 | LFO SYNCHRONIZE (0-1) キーオン時にLFOの位相をリセットする |
キーオン時: VCEDの値 → OPZ $1b[___* ____] or $1b[__*_ ____] | |
59 | LFO WAVE (0-3) |
VCEDの値 → OPZ $1b[____ __**] or $1b[____ **__] | |
60 | PITCH MODULATION SENSITIVITY (0-7) |
VCEDの値 → OPZ $38[0*** ____] or $38[1*** ____] | |
61 | AMPLITUDE MODULATION SENSITIVITY (0-3) |
VCEDの値 → OPZ $38[____ _0**] or $38[____ _1**] | |
62 | TRANSPOSE (0-48) |
略 | |
function | |
63 | MONO (0-1) |
MONO/POLYのモードでポルタメントの動作を変える | |
64 | PITCH BEND RANGE (0-12) |
略 | |
65 | PORTAMENTO MODE (0-1) |
略 | |
66 | PORTAMENTO TIME (0-99) |
略 | |
67 | FOOT CONTROL VOLUME RANGE (0-99) フットコントローラによる音量制御の範囲を設定する |
OUTPUT LEVELの値の制御に使われる | |
68 | SUSTAIN (0-1) フットスイッチをサステインのon/offに使用するかどうか |
他機種で使用されたパラメータ | |
69 | PORTAMENTO (0-1) フットスイッチをポルタメントのon/offに使用するかどうか |
他機種で使用されたパラメータ | |
70 | CHORUS (0-1) |
他機種で使用されたパラメータ | |
71 | MODULATION WHEEL PITCH RANGE (0-99) モジュレーションホイールによるピッチモジュレーションの範囲を設定する |
PMDの値の制御に使われる | |
72 | MODULATION WHEEL AMPLITUDE RANGE (0-99) モジュレーションホイールによるアンプリチュードモジュレーションの範囲を設定する |
AMDの値の制御に使われる | |
73 | BREATH CONTROL PITCH RANGE (0-99) ブレスコントローラによるピッチモジュレーションの範囲を設定する |
PMDの値の制御に使われる | |
74 | BREATH CONTROL AMPLITUDE RANGE (0-99) ブレスコントローラによるアンプリチュードモジュレーションの範囲を設定する |
AMDの値の制御に使われる | |
75 | BREATH CONTORL PITCH BIAS RANGE (0-99) ブレスコントローラによるピッチベンドの範囲と向きを設定する |
ピッチベンドの制御に使われる | |
76 | BREATH CONTORL EG BIAS RANGE (0-99) ブレスコントローラによる出力レベル制御の範囲を設定する |
OUTPUT LEVELの制御に使われる | |
77-86 | VOICE NAME |
DX21 only | |
87 | PITCH EG RATE1 (0-99) |
他機種で使用されたパラメータ | |
88 | PITCH EG RATE2 (0-99) |
89 | PITCH EG RATE3 (0-99) |
90 | PITCH EG LEVEL1 (0-99) |
91 | PITCH EG LEVEL2 (0-99) |
92 | PITCH EG LEVEL3 (0-99) |
ACED (OPZ拡張パラメータ)
Op4 | |
0 | OSCILLATOR FREQUENCY MODE (0-1) オシレータの周波数モードを設定する(0:RATIO/1:FIX) |
ACEDの値 → OPZ $80[__*_ ____] | |
1 | OSCILLATOR FREQUENCY RANGE (0-7) FIXモードの周波数の範囲を設定する |
ACEDの値 → OPZ $40[0*** ____] FIXモードではDT1の代わりにこの機能となる |
|
2 | OSCILLATOR FREQUENCY FINE (0-15) RATIOモードの細かい倍率/FIXモードの細かい周波数を設定する |
ACEDの値 → OPZ $40[1___ ****] | |
3 | OSCILLATOR WAVE FORM (0-7) オシレータの波形を設定する |
ACEDの値 → OPZ $40[1*** ____] | |
4 | EG SHIFT (0-3) EGの最小レベルを上げ、アタックの開始レベルを上げる |
ACEDの値 → OPZ $c0[**1_ ____] | |
Op2 | |
5 | |
Op3 | |
10 | |
Op1 | |
15 | |
20 | REVERBERATION RATE (0-7) エンベロープジェネレータで擬似的なリバーブをかける (リリースの途中から減衰を遅くする) |
ACEDの値 → OPZ $c0[__1_ _***] | |
21 | FOOT CONTROL PITCH RANGE (0-99) フットコントローラによるピッチモジュレーションの範囲を設定する |
PMDの値の制御に使われる | |
22 | FOOT CONTROL AMPLITUDE RANGE (0-99) フットコントローラによるアンプリチュードモジュレーションの範囲を設定する |
AMDの値の制御に使われる |
範囲が0〜99のパラメータはほとんどが内部で256段階の値に単純に変換されて処理されている。ただし、OUTPUT LEVELは非線形のテーブルを用いて128段階の値に変換される。詳細の実装も興味深かったので、いずれ紹介したい。
OPMと役割が異なる部分を水色で表し、セレクタビットを黄色で表している。
R | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b1 | content |
---|---|---|---|---|---|---|---|---|---|
00-07 | VOL | Channel Volume | |||||||
08 | op | ch | KON | ||||||
09 | ? | ||||||||
0A | ? | ||||||||
0F | NE | NFRQ | NE/NFRQ | ||||||
14 | Timer Control? | ||||||||
15 | ? | ||||||||
16 | LFRQ | LFRQ 2 | |||||||
17 | AMD/PMD | AMD/PMD 2 | |||||||
18 | LFRQ | LFRQ | |||||||
19 | AMD/PMD | AMD/PMD | |||||||
1B | CT | SY2 | SY | LW2 | LW | LFO SYNC2/SYNC1/LFO WAVE2/LFO WAVE1 | |||
1C | ? | ||||||||
1E | ? | ||||||||
20-27 | R | FBL | ALG | R/?/FBL/ALG | |||||
28-2F | KC | KC | |||||||
30-37 | KF | M | KF/MONO | ||||||
38-3F | 0 | PMS | 0 | AMS | PMS/AMS | ||||
1 | PMS2 | 1 | AMS2 | PMS2/AMS2 | |||||
40-5F | 0 | DT1 | MUL | DT1/MUL | |||||
0 | FXR | FXF | FIXRANGE/FIXFRQ | ||||||
1 | OW | FINE | OSCW/FINE | ||||||
60-7F | TL | TL | |||||||
80-9F | KRS | FIX | AR | KRS/FIX/AR | |||||
A0-BF | A | D1R | AME/D1R | ||||||
C0-DF | DT2 | 0 | D2R | DT2/D2R | |||||
EGS | 1 | REV | EGSHIFT/REV | ||||||
E0-FF | D1L | RR | D1L/RR |
OPZでは、OPMで未使用だったビットをセレクタビットに割り当て、使用済みだったレジスタを二重、三重の役割に拡張している。
レジスタ$01はOPMではテストの役割を持っていたが、レジスタ$00〜$07を各chの別の機能に使用するため、廃止されている。
解析の途中で、LFOが2系統あることに気づいたのであるが、マニュアルにもそのことは書かれていた。 パフォーマンスデータのLFO SELECTパラメータで、各chのLFOを、{off/LFO1/LFO2/Vibrato}から設定する。 Vibratoはソフトウェアによるピッチモジュレーションであった。
また、パフォーマンスデータのOUTPUT ASSIGNパラメータで、PANを{off/L/R/LR}の中から設定するが、機能的には変わらないにも関わらずPANのレジスタはOPMから変更されている。それが何とも不可解である。
L+R出力の場合はレジスタ$30のbit0に1を書き込む。RまたはL+R出力の場合はレジスタ$28のbit7に1を書き込む。レジスタ$30のbit1に0が書き込まれる場合と1が書き込まれる場合とがあった。
システム初期化時に、レジスタ$09,$0f,$1c,1eに値$00書き込み、レジスタ$0aに値$04、レジスタ$14に値$70、レジスタ$15には値$01を書き込んでいた。
また、FMのタイマー割り込み時には、レジスタ$14に値$30または$40を書き込んでいた。
レジスタ$09,$0a,$15,$1c,$1eはOPMの未使用レジスタである。データを書き込んでいるので、何かの機能があると思われるが、プログラムからは使用法がわからなかった。$1cと$1eはレジスタの場所からLFO関係と推測する。
レジスタ$14は、OPMではCSMとタイマーの制御のレジスタであるが、未使用だったbit6に値が書き込まれているで、使用法が変わっていると思われる。
レジスタ$0fはOPMのノイズ関連のレジスタがそのまま残されていると推測する。