本稿では、音源にOKIのMSM5232を使用したシリーズを取り上げ、ハードウェア、プログラム、サウンドデータに関して説明を加える。
サウンドプログラムROMの内容、および、基板から録音した音声より分析した結果をもとにしている。
(2013.11.13 バギーチャレンジの試作機と思われる回路図よりTA7630の使用が明らかになり、推測で書いていた内容を訂正した。)
タイトル | 発売年 | ROMナンバー | 音源 | サウンドCPU |
---|---|---|---|---|
ビクトリアスナイン | 1984 | A16 | MSM5232 x1, YM2149 x1, DAC x1 | Z80 |
ザ・運動会 | 1984 | A17 | MSM5232 x1, YM2149 x1, DAC x1 | Z80 |
バギーチャレンジ | 1984 | A22 | MSM5232 x1, YM2149 x2 | Z80 |
ルンバランバ | 1984 | A23 | MSM5232 x1, YM2149 x1, DAC x1 | Z80 |
アウターゾーン | 1984 | A25 | MSM5232 x1, YM2149 x1, DAC x1 | Z80 |
セアフリー | 1984 | A27 | MSM5232 x1, YM2149 x2 | Z80 |
フォーティーラブ | 1984 | A30 | MSM5232 x1, YM2149 x1, DAC x1 | Z80 |
メタルソルジャーアイザックII | 1985 | A34 | MSM5232 x1, YM2149 x2 | Z80 |
ワイバーンF-0 | 1985 | A39 | MSM5232 x1, YM2149 x2, DAC x1 | Z80 |
フェアリーランドストーリー | 1985 | A45 | MSM5232 x1, YM2149 x1, DAC x1 | Z80 |
N.Y.キャプター | 1985 | A50 | MSM5232 x1, YM2149 x2, DAC x1 | Z80 |
影の伝説(旧ver) | 1984 | A51 | MSM5232 x1, YM2149 x2 | Z80 |
女三四郎 | 1985 | A52 | MSM5232 x1, YM2149 x1, DAC x1 | Z80 |
ビッグイベントゴルフ | 1986 | A67 | MSM5232 x1, YM2149 x1, DAC x1 | Z80 |
バイオレントシューティング | 1986 | A97 | MSM5232 x1, YM2149 x2, DAC x1 | Z80 |
サウンドプログラムにDACへのアクセスが実装されているものは、音声データの有無にかかわらず、音源をDAC有りとした。
なお、表に示したタイトル以外に5232物があるかどうか不明である。
サウンドIC | 出力 |
---|---|
MSM5232 | 8音 |
YM2149 (1個または2個) | 矩形波 3音または6音 |
回路で構成されたDAC (1個または0個) | 1音またはなし |
音程が半音単位で指定されるため、デチューンやビブラート、ピッチベンドの表現ができない。
単体では音量の変更ができない。
エンベロープのレートとオクターブ重ねの設定が4chずつ共通となる仕様である。
タイトーの5232シリーズに限らず、MSM5232を使用したタイトルでは、
オクターブ上の音を重ねる機能により、PSGとは明らかに違った、
きらびやかな華々しい音を出している。
また、アコーデオンをイメージさせるような、0からMAXに急速に立ち上がるエンベロープも特徴的である。
address | bit | content |
---|---|---|
00 | ff | ch1 Pitch |
01 | ff | ch2 Pitch |
02 | ff | ch3 Pitch |
03 | ff | ch4 Pitch |
04 | ff | ch5 Pitch |
05 | ff | ch6 Pitch |
06 | ff | ch7 Pitch |
07 | ff | ch8 Pitch |
08 | 07 | ch1-4 Attack |
09 | 07 | ch5-8 Attack |
0a | 0f | ch1-4 Decay |
0b | 0f | ch5-8 Decay |
0c | f0 0f | ch1-4 Mode ch1-4 Harmonics Control |
0d | f0 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オクターブ上の出力を設定する。
基音出力、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両方に入力されるため、バランスは作用しない。
Port | bit | Content |
---|---|---|
00 | f0 0f | Volume Balance |
01 | f0 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両方を使用している。
data | content |
---|---|
00 | track end |
01-7f | step count |
80-87 %1 | ch |
88 %1 | ch<1-4> Attack/Decay |
89 %1 | ch<5-8> Attack/Decay |
8a %1 %2 %3 %4 | ch<1-4> keycord |
8b %1 %2 %3 %4 | ch<5-8> keycord |
8c %1 | ch<1-4> Mode/Harmonics |
8d %1 | ch<5-8> Mode/Harmonics |
8e %1 | ch |
8f %1 %2 %3 %4 %5 %6 %7 %8 | ch<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トラックのデータフォーマット(バギーチャレンジ)
data | content |
---|---|
80 | track end |
81-ff | %0 b6-0 : step count |
0* %1 | SSG register write (8bit) %0 b3-0 : reg %1:data |
1* %1 %2 | SSG register write (8bit) & LFO(add) %0 b3-0 : reg %1 : data %2 b7-4 : LFO interval %2 b3-0 : LFO depth |
2* %1 %2 | SSG register write (8bit) & LFO(sub) %0 b3-0 : reg %1 : data %2 b7-4 : LFO interval %2 b3-0 : LFO depth |
3* %1 %2 | SSG register write (16bit) %0 b3-0 : reg %1 : data(LO) %2 : data(HI) |
4* %1 %2 %3 %4 | SSG 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はレジスタごとに状態を保持する。次表のレジスタに対して動作する。
register | content |
---|---|
0/1 2/3 4/5 | pitch |
6 | noise |
8 9 a | volume |
e | TA7630 Volume/Balance |
f | TA7630 Treble/Bass |
(3)のLFOは、データとして初期値からの差分値が並べられている。差分値は、$80を中央値とした$00~$ffの値である。 データはステップごとの差分値が並び、繰り返しはなく、終端が来ればそこで変化を停止する。
data | content |
---|---|
00 | track end |
01-3f | step count |
4* %1 | pitch(ch1) %0 b3-0 : pitch H %1 : pitch L |
5* %1 | pitch(ch2) %0 b3-0 : pitch H %1 : pitch L |
6* %1 | pitch(ch3) %0 b3-0 : pitch H %1 : pitch L |
7* %1 | envelope 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 %1 | noise |
f2 %1 %2 | LFO(noise) %1 b7 : count type %1 b6-0 : wave table index %2 : interval |
f3 %1 | envelope 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 %1 | mixer |
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 %1 | LFO 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は中央値$80の、8bitD/Aである。
ROMに格納されたサンプルデータは4bitが1単位となった構成である。
直前のサンプル値との差分が4bitに圧縮されて格納されている。
1フレームおきに線形補間し、1byteで4フレーム分出力する。
上位4bitのデータからテーブルを参照して、直前の値からの差分値を求める。 1フレーム目では直前の値(初期値は$80)に差分値の1/2を加えた値を出力し、 2フレーム目でその値に差分値の1/2を加えた値を出力する。 さらに下位4bitのデータも同様に処理し、3、4フレームを出力する。
差分テーブル0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
-$30 | -$20 | -$18 | -$10 | -$08 | -$04 | -$02 | -$01 |
8 | 9 | a | b | c | d | e | f |
$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のグループと ワイバーン、フェアリーランド、女三四郎、ビッグイベントゴルフのグループとに 分けられる。ワイバーンのときに大規模な改変が行われたようである。
次のページに続く