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のノイズ関連のレジスタがそのまま残されていると推測する。