タイトー5232シリーズ

概要

本稿では、音源にOKIのMSM5232を使用したシリーズを取り上げ、ハードウェア、プログラム、サウンドデータに関して説明を加える。
サウンドプログラムROMの内容、および、基板から録音した音声より分析した結果をもとにしている。
(2013.11.13 バギーチャレンジの試作機と思われる回路図よりTA7630の使用が明らかになり、推測で書いていた内容を訂正した。)

タイトル発売年ROMナンバー音源サウンドCPU
ビクトリアスナイン1984A16MSM5232 x1, YM2149 x1, DAC x1Z80
ザ・運動会1984A17MSM5232 x1, YM2149 x1, DAC x1Z80
バギーチャレンジ1984A22MSM5232 x1, YM2149 x2Z80
ルンバランバ1984A23MSM5232 x1, YM2149 x1, DAC x1Z80
アウターゾーン1984A25MSM5232 x1, YM2149 x1, DAC x1Z80
セアフリー1984A27MSM5232 x1, YM2149 x2Z80
フォーティーラブ1984A30MSM5232 x1, YM2149 x1, DAC x1Z80
メタルソルジャーアイザックII1985A34MSM5232 x1, YM2149 x2Z80
ワイバーンF-01985A39MSM5232 x1, YM2149 x2, DAC x1Z80
フェアリーランドストーリー1985A45MSM5232 x1, YM2149 x1, DAC x1Z80
N.Y.キャプター1985A50MSM5232 x1, YM2149 x2, DAC x1Z80
影の伝説(旧ver)1984A51MSM5232 x1, YM2149 x2Z80
女三四郎1985A52MSM5232 x1, YM2149 x1, DAC x1Z80
ビッグイベントゴルフ1986A67MSM5232 x1, YM2149 x1, DAC x1Z80
バイオレントシューティング1986A97MSM5232 x1, YM2149 x2, DAC x1Z80

サウンドプログラムにDACへのアクセスが実装されているものは、音声データの有無にかかわらず、音源をDAC有りとした。

なお、表に示したタイトル以外に5232物があるかどうか不明である。

ハードウェア

音源構成

サウンドIC出力
MSM52328音
YM2149 (1個または2個)矩形波 3音または6音
回路で構成されたDAC (1個または0個)1音またはなし

MSM5232概略説明

MSM5232の機能

音程が半音単位で指定されるため、デチューンやビブラート、ピッチベンドの表現ができない。 単体では音量の変更ができない。
エンベロープのレートとオクターブ重ねの設定が4chずつ共通となる仕様である。

タイトーの5232シリーズに限らず、MSM5232を使用したタイトルでは、 オクターブ上の音を重ねる機能により、PSGとは明らかに違った、 きらびやかな華々しい音を出している。
また、アコーデオンをイメージさせるような、0からMAXに急速に立ち上がるエンベロープも特徴的である。

MSM5232レジスタ

MSM5232レジスタ
addressbitcontent
00ffch1 Pitch
01ffch2 Pitch
02ffch3 Pitch
03ffch4 Pitch
04ffch5 Pitch
05ffch6 Pitch
06ffch7 Pitch
07ffch8 Pitch
0807ch1-4 Attack
0907ch5-8 Attack
0a0fch1-4 Decay
0b0fch5-8 Decay
0cf0
0f
ch1-4 Mode
ch1-4 Harmonics Control
0df0
0f
ch5-8 Mode
ch5-8 Harmonics Control

レジスタ$0~$7は、半音単位の音階を指定する。
値が$dfのときはノイズを出力する。 ノイズについては調べなかったが、聞いた感じでは音程をランダムに変化させている出し方のようである。

レジスタ$c、$d上位4bitは、エンベロープのモードを指定する。値2のときエンベロープ有効、値3のときエンベロープ無効(音量一定)、 値0のとき出力なし、となる。ほとんどMode2が使われているが、Mode3はバギーチャレンジの一部の音楽で使用されている。

レジスタ$c、$d下位4bitは、オクターブ重ねの動作を指定する。 値1(bit0)は基音の出力、値2(bit1)は1オクターブ上の出力、値4(bit2)は2オクターブ上の出力、値8(bit3)は3オクターブ上の出力を設定する。

MSM5232のオクターブ重ねの出力

基音出力、1オクターブ上の出力、2オクターブ上の出力、3オクターブ上の出力をそれぞれ単独で記録した波形を次の図に示す。

それぞれの半周期分の波形を拡大し、振幅を比較したものが次の図である。

基音の振幅に対して、1オクターブ上の音、2オクターブ上の音、3オクターブ上の音の振幅は、 それぞれ、60%、50%、45%程度となっている。

1オクターブ上の出力は、基音の半周期(値が正の部分)の先頭0%~50%の部分を符号転換しながら繰り返しているようである。 2オクターブ上の出力は、基音の半周期の先頭0%~25%の部分を符号転換して繰り返しているようである。 3オクターブ上の出力は、判別がつきにくいが、おそらく基音の半周期の先頭0%~12.5%の部分を符号転換して繰り返している。
また、よく見ると、基音は他よりも位相が少し遅れた部分が出力されていることがわかる。

次に、基音やオクターブ上の音が合成された出力を見ていく。
出力波形を観察した結果、1~3オクターブ上の出力は基音の出力に対して逆位相で出力されていると判断することができる。
レジスタ$cの下位4bitに$1~$3を与えた場合の出力(↓)



$4~$7を与えた場合の出力(↓)




$8~$bを与えた場合の出力(↓)




$c~$fを与えた場合の出力(↓)




レジスタ$cの下位4bitに$1~$7を順に与えたときの出力を録音したもの
レジスタ$cの下位4bitに$8~$fを順に与えたときの出力を録音したもの

トーンコントロール

5232、SSGの出力には、音源ICごとにトーンコントロールICのTA7630が接続されている。 4bit×4個のポートがTA7630のボリューム、バランス、バス、トレブルを設定する。 SSGの場合はSSGの出力ポートA/BをTA7630の制御に使用している。

TA7630の入力はアナログであるが、回路図によるとネットワーク抵抗1530を使用して、ポートの4bitディジタル値をアナログ値に変換している。

TA7630は2ch分の音声を扱うことができる。 ボリューム、バス、トレブルについては各設定が2ch両方に作用する。 バランスによってチャンネル間の音量の大小を制御する。 バスコントロール、トレブルコントロールによって、低域、高域のイコライズを行う。 TA7630のデータシートによると低域/高域の境界は1kHzである。

TA7630のボリューム、バランス、イコライズの特性は次のようになっている。

5232に関しては、ch1-4/ch5-8の出力がTA7630のch1/2にそれぞれ入力されており、バランスによって4チャンネル単位の音量を変更できる。
SSGでは、各チャンネルの出力を合成した音声がTA7630のch1/2両方に入力されるため、バランスは作用しない。

TA7630制御ポート
PortbitContent
00f0
0f
Volume
Balance
01f0
0f
Treble
Bass

5232の出力をトーンコントロールによって変化させた結果の波形と音声をここに示す。

下図は左から順にVolumeの値に$2、$8、$eを与えたときの波形である。

下図は左から順にBalanceの値に$2、$8、$eを与えたときの波形である。

下図は左から順にTrebleの値に$2、$8、$eを与えたときの波形である。

下図は左から順にBassの値に$2、$8、$eを与えたときの波形である。

Volumeの変化を録音したもの
Balanceの変化を録音したもの
Trebleの変化を録音したもの
Bassの変化を録音したもの
いずれも、ポートの値を$2、$4、$6、$8、$a、$c、$eに設定したときの出力である。

その他

ワイバーンF-0、N.Y.キャプターには、SSGのパンを設定するポートが追加されている。 4bit×2個の構成で左右それぞれの出力レベルを制御する。

ソフトウェア

概略

1本のトラックで1個の音源ICを扱う形となっている。
フェアリーランドストーリーを例にすると、トラックは全4本あり、DAC用が1本、SSG用が1本、5232用が2本ある。 ワイバーンF-0では、SSG用4本、5232用2本、DAC用1本、の計7本である。

主に、5232をBGMに、SSGとDACを効果音に用いている。ルンバランバでは一部のBGMに5232とSSG両方を使用している。

5232用トラック

5232用トラックデータのフォーマットを次表に示す。
datacontent
00track end
01-7fstep count
80-87 %1ch keycord
88 %1ch<1-4> Attack/Decay
89 %1ch<5-8> Attack/Decay
8a %1 %2 %3 %4ch<1-4> keycord
8b %1 %2 %3 %4ch<5-8> keycord
8c %1ch<1-4> Mode/Harmonics
8d %1ch<5-8> Mode/Harmonics
8e %1ch keyon
8f %1 %2 %3 %4 %5 %6 %7 %8ch<1-8> keycord
9*
90-97 %1 %2
98-9f
pitch LFO
%0.bit3 : 0=on/1=off
%0.bit0-2 : ch
%1 : interval
%2 : table index
a*(none)
b*[port0 H] TA7630 Volume
c*[port0 L] TA7630 Balance
d*[port1 H] TA7630 Treble
e*[port1 L] TA7630 Bass

$8eは、bit0~7のbitが1になっているchそれぞれについて、現在設定された音程と同じ音程でキーオンする。

$9*のピッチLFOはテーブル参照型である。半音単位なので実質ポルタメントに少し使われている程度であり、重要ではないとして説明は割愛する。

トラックデータは、先にステップカウントが与えられ、次にその他のコマンドが与えられる並びが繰り返される。 ステップがカウントされる前にその他のコマンドが反映される。

表を見てわかるように、ジャンプやリピートなどの制御のコマンドはない。繰り返しなどはトラックデータ外で指定される。

SSG用トラック(OLD)

旧式SSGトラックのデータフォーマット(バギーチャレンジ)

datacontent
80track end
81-ff%0 b6-0 : step count
0* %1SSG register write (8bit)
%0 b3-0 : reg
%1:data
1* %1 %2SSG register write (8bit) & LFO(add)
%0 b3-0 : reg
%1 : data
%2 b7-4 : LFO interval
%2 b3-0 : LFO depth
2* %1 %2SSG register write (8bit) & LFO(sub)
%0 b3-0 : reg
%1 : data
%2 b7-4 : LFO interval
%2 b3-0 : LFO depth
3* %1 %2SSG register write (16bit)
%0 b3-0 : reg
%1 : data(LO)
%2 : data(HI)
4* %1 %2 %3 %4SSG register write (8bit) & LFO(table)
%0 b3-0 : reg
%1 : data
%2 b7-4 : LFO interval
%2 b3-0 : LFO multiple
%3 %4 : LFO data address
5* ** **same as 1*
6* ** **same as 2*
7* ** **same as 3*

トラックデータは、先にステップカウントが与えられ、次にその他のコマンドが与えられる並びが繰り返される。 ステップがカウントされる前にその他のコマンドが反映される。

コマンドは基本的に、レジスタ番号+レジスタ値の列になっている。ハード寄りというか、原始的に思われるかもしれないが、タイトーのPSGのタイトルは一貫してこのスタイルである。

LFOは2系統あるが、このうちの1系統をトラックデータから設定する。トラックデータから設定するLFOをLFO1と呼ぶことにする。

LFO1はレジスタごとに状態を保持する。次表のレジスタに対して動作する。

registercontent
0/1
2/3
4/5
pitch
6noise
8
9
a
volume
eTA7630 Volume/Balance
fTA7630 Treble/Bass
LFO1は3タイプあり、(1)固定値の加算の繰り返し、(2)固定値の減算の繰り返し、 (3)テーブルのデータに固定値を乗算したものを加減算するものがある。 どれも周期的ではないのでLFOの定義から外れていると思うが、便宜上LFOとしている。 (1)と(2)は主にピッチのポルタメントに使用されている。

(3)のLFOは、データとして初期値からの差分値が並べられている。差分値は、$80を中央値とした$00~$ffの値である。 データはステップごとの差分値が並び、繰り返しはなく、終端が来ればそこで変化を停止する。

SSG用トラック(NEW)

新式SSGトラックのデータフォーマット(フェアリーランドストーリー)
datacontent
00track end
01-3fstep count
4* %1pitch(ch1)
%0 b3-0 : pitch H
%1 : pitch L
5* %1pitch(ch2)
%0 b3-0 : pitch H
%1 : pitch L
6* %1pitch(ch3)
%0 b3-0 : pitch H
%1 : pitch L
7* %1envelope period
%0 b3-0 : lo byte
%1 : hi byte
8*volume(ch1)
%0 b3-0 : vol
9*volume(ch2)
%0 b3-0 : vol
a*volume(ch3)
%0 b3-0 : vol
b*%0 b3-0 : [portA H] TA7630 Volume input
c*%0 b3-0 : [portA L] TA7630 Balance input
d*%0 b3-0 : [portB H] TA7630 Treble linput
e*%0 b3-0 : [portB L] TA7630 Bass input
f0(none)
f1 %1noise
f2 %1 %2LFO(noise)
%1 b7 : count type
%1 b6-0 : wave table index
%2 : interval
f3 %1envelope shape
%1 : shape
f4 %1 %2
(f5,f6)
LFO(pitch1/pitch2/pitch3)
%1 b7 : count type
%1 b6-0 : wave table index
%2 : interval
f7 %1mixer
f8 %1 %2
(f9,fa,fb,fc,fd,fe)
LFO(vol1/vol2/vol3/portAH/portAL/portBH/portBL)
%1 b7 : count type
%1 b6-0 : wave table index
%2 : interval
ff %1LFO stop

新式のフォーマットもSSGのレジスタに書き込む値をそのままデータにしている点は同じであるが、 音程指定のコマンドが3byteから2byteに、音量指定のコマンドが2byteから1byteに短縮されている。

LFOは、ピッチとそれ以外とで参照する波形テーブルが異なる。ピッチには2byte値用のテーブルを、その他には1byte値用のテーブルを使用する。 2byte値用のテーブルには8bitのデータが並び、1byte値用のテーブルには4bitのデータが並ぶ。

LFOの%1 bit7が0の場合は%2回に1回の頻度で値が増減される。周期が整数値である。
bit7が1の場合は256÷%2回に1回の頻度で値が増減される。動作の詳細としてはカウンタに%2の値が足されオーバーフローになった際に値の増減を行う。こちらは非整数値の周期の表現が可能である。

DACの制御

DACによる効果音は、他の音楽や効果音と排他的に処理される。 DACに出力する間は、割り込みを停止してDACの出力に専念する。

DACは中央値$80の、8bitD/Aである。
ROMに格納されたサンプルデータは4bitが1単位となった構成である。
直前のサンプル値との差分が4bitに圧縮されて格納されている。 1フレームおきに線形補間し、1byteで4フレーム分出力する。

上位4bitのデータからテーブルを参照して、直前の値からの差分値を求める。 1フレーム目では直前の値(初期値は$80)に差分値の1/2を加えた値を出力し、 2フレーム目でその値に差分値の1/2を加えた値を出力する。 さらに下位4bitのデータも同様に処理し、3、4フレームを出力する。

差分テーブル
01234567
-$30-$20-$18-$10-$08-$04-$02-$01
89abcdef
$01$02$04$08$10$18$20$30

ビッグイベントゴルフのあるDACのデータの先頭付近をデコードした結果を次に示す。 データ$8aに対して、$80、$81、$83、$85という値が出力される。

data  |8A         |5B         |84         |68         |
4bit  | 8     A   | 5     B   | 8     4   | 6     8   |
diff  | 1     4   |-4     8   | 1    -8   |-2     1   |
sample|80 81 83 85|83 81 85 89|89 8A 86 82|81 80 80 81|

タイトル間の相違

各タイトルでサウンドプログラムがどの程度類似しているかについても触れておく。
どれもよく似たコードになっており、他のコードを流用していると考えられる。 DACの処理の有無を除くとそれ以外はよく似ている。 5232の処理に関してはポートやワークのアドレスの違いを除くと、ほぼ同一である。

ただし、SSGの処理は似ているもの同士はよく似ているが、全く別物もある。 ビクトリアスナイン、バギーチャレンジ、ルンバランバ、アイザックIIのグループと ワイバーン、フェアリーランド、女三四郎、ビッグイベントゴルフのグループとに 分けられる。ワイバーンのときに大規模な改変が行われたようである。

次のページに続く