FM音源 OPZのレジスタ解析

はじめに

YM2164(OPP)に続いて、YM2414(OPZ)のレジスタの解析を行った。 レジスタ情報を調べるために、OPZを搭載しているシンセサイザーTX81ZのシステムROMを解析した。

OPP搭載シンセサイザーの解析では、FM音源チップ自体の機能拡張がほとんどないことがわかったが、 OPZではオシレータの波形選択や固定周波数モードなど音源チップを拡張しなければ実現できない機能もある。 だが、OPM,OPPの未使用レジスタはあまり多くない。 OPNからOPNAへ拡張を行ったときのように、レジスタのポートを1組追加することも考えられるが、 TX81Zの保守用マニュアルの回路図を見ると、OPZのアドレスピンはOPMから変わっておらず、 レジスタのポートは増えていないことがわかる。 (2013.04.22)

TX81Zのボイスパラメータ

音色データにはVCEDフォーマットとACEDフォーマットがある。VCEDは、DX100などOPP搭載機種から使われているフォーマットである。ACEDはOPZ搭載機種で拡張された音色データである。

プログラムを解析した結果より、ボイスパラメータがどのようにOPZのレジスタに書き込まれているかを示す。 OPMにない機能のうち、音源チップで実現されたものを赤字で示し、ソフトウェアで実現されたものを青字で示した。

VCED (OPP標準パラメータ)

offsetパラメータ名 (値の有効範囲)
パラメータの作用
Op4
0EG ATTACK RATE (0-31)
VCEDの値 → OPZ $80[___* ****]
1EG 1st DECAY RATE (0-31)
VCEDの値 → OPZ $a0[___* ****]
2EG 2nd DECAY RATE (0-31)
VCEDの値 → OPZ $c0[___* ****]
3EG RELEASE RATE (1-31)
VCEDの値 → OPZ $e0[____ ****]
4EG 1st DECAY LEVEL (0-15)
VCEDの値 → OPZ $e0[**** ____]
5KEYBOARD LEVEL SCALING (0-99)
キーが高いほどOUTPUT LEVELを弱める度合いを設定する
OUTPUT LEVELの制御に使われる
6KEYBOARD RATE SCALING (0-3)
VCEDの値 → OPZ $80[**__ ____]
7EG BIAS SENSITIVITY (0-7)
OUTPUT LEVELを下げ、ブレスコントローラによってレベルを上げる余地を作る
OUTPUT LEVELの制御に使われる
8AME (0-1)
VCEDの値 → OPZ $a0[*___ ____]
9KEY VELOCITY SENSITIVITY (0-7)
ベロシティによってOUTPUT LEVELの強弱をつける
OUTPUT LEVELの値の制御に使われる
10OPERATOR OUTPUT LEVEL (0-99)
加工された値 → OPZ $60[_*** ****]
11OSCILLATOR FREQUENCY COARSE (0-63)
RATIOモードではオシレータの周波数の倍率を設定する
FIXモードではオシレータの固定周波数を設定する
(RATIO)VCEDの値がMULTIPLEとDETUNE2に変換される。
MUL → OPZ $40[0___ ****] ; DT2 → OPZ $c0[**__ ____]
(FIX)VCEDの6bitの値のうち上位4bitのみ有効 → OPZ $40[____ ****]
12DETUNE (0-6)
加工された値 → OPZ $40[0*** ____]
Op2
13
Op3
26
Op1
39
52ALGORITHM SELECT (0-7)
VCEDの値 → OPZ $20[____ _***]
53FEEDBACK LEVEL (0-7)
VCEDの値 → OPZ $20[__** *___]
54LFO SPEED (0-99)
加工された値 → OPZ $18[**** ****] or $16[**** ****]
55LFO DELAY (0-99)
PMD/AMDの深さが増大する速さを設定する
AMD,PMDの値に影響する
56LFO PITCH MODULATION DEPTH (0-99)
加工された値 → OPZ $19[1*** ****] or $17[1*** ****]
57LFO AMPLITUDE MODULATION DEPTH (0-99)
加工された値 → OPZ $19[0*** ****] or $17[0*** ****]
58LFO SYNCHRONIZE (0-1)
キーオン時にLFOの位相をリセットする
キーオン時: VCEDの値 → OPZ $1b[___* ____] or $1b[__*_ ____]
59LFO WAVE (0-3)
VCEDの値 → OPZ $1b[____ __**] or $1b[____ **__]
60PITCH MODULATION SENSITIVITY (0-7)
VCEDの値 → OPZ $38[0*** ____] or $38[1*** ____]
61AMPLITUDE MODULATION SENSITIVITY (0-3)
VCEDの値 → OPZ $38[____ _0**] or $38[____ _1**]
62TRANSPOSE (0-48)
function
63MONO (0-1)
MONO/POLYのモードでポルタメントの動作を変える
64PITCH BEND RANGE (0-12)
65PORTAMENTO MODE (0-1)
66PORTAMENTO TIME (0-99)
67FOOT CONTROL VOLUME RANGE (0-99)
フットコントローラによる音量制御の範囲を設定する
OUTPUT LEVELの値の制御に使われる
68SUSTAIN (0-1)
フットスイッチをサステインのon/offに使用するかどうか
他機種で使用されたパラメータ
69PORTAMENTO (0-1)
フットスイッチをポルタメントのon/offに使用するかどうか
他機種で使用されたパラメータ
70CHORUS (0-1)
他機種で使用されたパラメータ
71MODULATION WHEEL PITCH RANGE (0-99)
モジュレーションホイールによるピッチモジュレーションの範囲を設定する
PMDの値の制御に使われる
72MODULATION WHEEL AMPLITUDE RANGE (0-99)
モジュレーションホイールによるアンプリチュードモジュレーションの範囲を設定する
AMDの値の制御に使われる
73BREATH CONTROL PITCH RANGE (0-99)
ブレスコントローラによるピッチモジュレーションの範囲を設定する
PMDの値の制御に使われる
74BREATH CONTROL AMPLITUDE RANGE (0-99)
ブレスコントローラによるアンプリチュードモジュレーションの範囲を設定する
AMDの値の制御に使われる
75BREATH CONTORL PITCH BIAS RANGE (0-99)
ブレスコントローラによるピッチベンドの範囲と向きを設定する
ピッチベンドの制御に使われる
76BREATH CONTORL EG BIAS RANGE (0-99)
ブレスコントローラによる出力レベル制御の範囲を設定する
OUTPUT LEVELの制御に使われる
77-86VOICE NAME
DX21 only
87PITCH EG RATE1 (0-99)
他機種で使用されたパラメータ
88PITCH EG RATE2 (0-99)
89PITCH EG RATE3 (0-99)
90PITCH EG LEVEL1 (0-99)
91PITCH EG LEVEL2 (0-99)
92PITCH EG LEVEL3 (0-99)

ACED (OPZ拡張パラメータ)

Op4
0OSCILLATOR FREQUENCY MODE (0-1)
オシレータの周波数モードを設定する(0:RATIO/1:FIX)
ACEDの値 → OPZ $80[__*_ ____]
1OSCILLATOR FREQUENCY RANGE (0-7)
FIXモードの周波数の範囲を設定する
ACEDの値 → OPZ $40[0*** ____]
FIXモードではDT1の代わりにこの機能となる
2OSCILLATOR FREQUENCY FINE (0-15)
RATIOモードの細かい倍率/FIXモードの細かい周波数を設定する
ACEDの値 → OPZ $40[1___ ****]
3OSCILLATOR WAVE FORM (0-7)
オシレータの波形を設定する
ACEDの値 → OPZ $40[1*** ____]
4EG SHIFT (0-3)
EGの最小レベルを上げ、アタックの開始レベルを上げる
ACEDの値 → OPZ $c0[**1_ ____]
Op2
5
Op3
10
Op1
15
20REVERBERATION RATE (0-7)
エンベロープジェネレータで擬似的なリバーブをかける
(リリースの途中から減衰を遅くする)
ACEDの値 → OPZ $c0[__1_ _***]
21FOOT CONTROL PITCH RANGE (0-99)
フットコントローラによるピッチモジュレーションの範囲を設定する
PMDの値の制御に使われる
22FOOT CONTROL AMPLITUDE RANGE (0-99)
フットコントローラによるアンプリチュードモジュレーションの範囲を設定する
AMDの値の制御に使われる

範囲が0〜99のパラメータはほとんどが内部で256段階の値に単純に変換されて処理されている。ただし、OUTPUT LEVELは非線形のテーブルを用いて128段階の値に変換される。詳細の実装も興味深かったので、いずれ紹介したい。

OPZのレジスタマップ

OPMと役割が異なる部分を水色で表し、セレクタビットを黄色で表している。

Rb7b6 b5b4 b3b2 b1b1 content
00-07VOLChannel Volume
08opchKON
09?
0A?
0FNENFRQNE/NFRQ
14Timer Control?
15?
16LFRQLFRQ 2
17AMD/PMDAMD/PMD 2
18LFRQLFRQ
19AMD/PMDAMD/PMD
1BCT SY2 SY LW2 LW LFO SYNC2/SYNC1/LFO WAVE2/LFO WAVE1
1C?
1E?
20-27RFBL ALGR/?/FBL/ALG
28-2FKCKC
30-37KF MKF/MONO
38-3F0 PMS 0AMS PMS/AMS
1 PMS2 1AMS2 PMS2/AMS2
40-5F0 DT1 MULDT1/MUL
0FXRFXFFIXRANGE/FIXFRQ
1OW FINEOSCW/FINE
60-7FTLTL
80-9FKRSFIX ARKRS/FIX/AR
A0-BFAD1RAME/D1R
C0-DFDT2 0 D2RDT2/D2R
EGS 1 REV EGSHIFT/REV
E0-FFD1L RRD1L/RR

OPZで変更されたレジスタ

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