WOBは標準でFM音源によるサウンド出力が可能です。実はPWMを用いたソフトウェアによるエミュレーションなのですが。
参考にさせていただいた(というより核の部分をコピーさせていただいた)のはPCM1723さんのこちらのソースコードです。WOBではこれを元にライブラリ化しました。また、WOBモニタやDeM命令から操作しやすいように、疑似的にハードウェアに見えるようにI/Oポートとして定義してあります。以下にFMサウンドに関係するI/Oマップを抽出します。
メモリ | I/O命令 | アクセス | 対応するI/Oポート、 | ||
---|---|---|---|---|---|
アドレス | アドレス | タイプ | メモリ、メソッド | カテゴリ | 説明 |
3144-3147 | 36 | R/W | player.Voice | FM音源 | プリセット音色選択(0-6) |
3148-3151 | 37 | R/W | player.FB | フィードバック量(0-7) | |
3152-3155 | 38 | R/W | player.MULT | 周波数乗算コード(0-15) | |
3156-3159 | 39 | R/W | player.TL | 総合レベル(0-63) | |
3160-3163 | 40 | R/W | player.DR0 | 減衰レート0(0-15) | |
3164-3167 | 41 | R/W | player.DR1 | 減衰レート1(0-15) | |
3168-3171 | 42 | R/W | player.SHIFT | オクターブシフト(-10~+10) | |
3172-3175 | 43 | R/W | player.NoteBuf | 演奏音階バッファアドレス(1000-9999) | |
3176-3179 | 44 | R/W | player.BeatBuf | 演奏拍数バッファアドレス(1000-9999) | |
3180-3183 | 45 | R/W | player.Length | 演奏データ長(1-99、書き込みで演奏開始) |
もっとも簡単な操作方法は、
- 音階データと拍数データをデータメモリ上のどこか(1000番地以降)に用意する
- 「プリセット音色選択」に音色の番号を書き込む
- 音階データの格納されている先頭メモリアドレスを「演奏音階バッファアドレス」に書き込む
- 拍数データの格納されている先頭メモリアドレスを「演奏拍数バッファアドレス」に書き込む
- 音階データの長さを「演奏データ長」に書き込んで演奏開始
となります。プログラムを書かず、WOBモニタだけでも試すことができます。
音階データ
演奏音階バッファに格納する音階データの種類は下記のとおりです。
階名 | データ | 階名 | データ | 階名 | データ | 階名 | データ | 階名 | データ | 階名 | データ | 階名 | データ | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ド | C0 | 0 | C1 | 12 | C2 | 24 | C3 | 36 | C4 | 48 | C5 | 60 | C6 | 72 |
ド# | Db0 | 1 | Db1 | 13 | Db2 | 25 | Db3 | 37 | Db4 | 49 | Db5 | 61 | Db6 | 73 |
レ | D0 | 2 | D1 | 14 | D2 | 26 | D3 | 38 | D4 | 50 | D5 | 62 | D6 | 74 |
レ# | Eb0 | 3 | Eb1 | 15 | Eb2 | 27 | Eb3 | 39 | Eb4 | 51 | Eb5 | 63 | Eb6 | 75 |
ミ | E0 | 4 | E1 | 16 | E2 | 28 | E3 | 40 | E4 | 52 | E5 | 64 | E6 | 76 |
ファ | F0 | 5 | F1 | 17 | F2 | 29 | F3 | 41 | F4 | 53 | F5 | 65 | F6 | 77 |
ファ# | Gb0 | 6 | Gb1 | 18 | Gb2 | 30 | Gb3 | 42 | Gb4 | 54 | Gb5 | 66 | Gb6 | 78 |
ソ | G0 | 7 | G1 | 19 | G2 | 31 | G3 | 43 | G4 | 55 | G5 | 67 | G6 | 79 |
ソ# | Ab0 | 8 | Ab1 | 20 | Ab2 | 32 | Ab3 | 44 | Ab4 | 56 | Ab5 | 68 | Ab6 | 80 |
ラ | A0 55Hz |
9 | A1 110Hz |
21 | A2 220Hz |
33 | A3 440Hz |
45 | A4 880Hz |
57 | A5 1760Hz |
69 | A6 3520Hz |
81 |
ラ# | Bb0 | 10 | Bb1 | 22 | Bb2 | 34 | Bb3 | 46 | Bb4 | 58 | Bb5 | 70 | Bf6 | 82 |
シ | B0 | 11 | B1 | 23 | B2 | 35 | B3 | 47 | B4 | 59 | B5 | 71 | B6 | 83 |
なお休符は99です。
拍数データ
拍数 | データ | 拍数 | データ |
---|---|---|---|
全音符・全休符 | 96 | 16分音符・16分休符 | 6 |
2分音符・2分休符 | 48 | 32分音符・32分休符 | 3 |
4分音符・4分休符 | 24 | 48分音符・48分休符 | 2 |
8分音符・8分休符 | 12 | 96分音符・96分休符 | 1 |
演奏拍数バッファに格納する拍数データの種類は右のとおりです。
3連符はその前後のデータから類推してください。
音色パラメータ
「フィードバック量」~「オクターブシフト」などの音色パラメータは、音色プリセットを行うことで適切なものがセットされます。プリセットの音色は以下の通りです。
プリセット番号 | 音色 | FB | MULT | TL | DR0 | DR1 | SHIFT |
---|---|---|---|---|---|---|---|
0 | Acoustic Piano | 5 | 1 | 32 | 1 | 2 | 0 |
1 | Electric Piano | 7 | 5 | 44 | 5 | 2 | 0 |
2 | Tubular Bells | 5 | 9 | 32 | 2 | 2 | 0 |
3 | Marimba | 0 | 8 | 34 | 8 | 7 | 0 |
4 | Jazz Guitar | 7 | 3 | 32 | 1 | 2 | 0 |
5 | Finger Bass | 4 | 1 | 16 | 1 | 2 | -2*1 |
6 | Slap Bass | 4 | 1 | 8 | 3 | 2 | -2*1 |
音色パラメータをいろいろいじってどのような音色に変わるのか試してみましょう*2。ちなみに、WOBモニタで採用しているビープ(警告音)は上記プリセット番号3の”Marimba”です。
負の数 | WOBでの表現 | 負の数 | WOBでの表現 |
---|---|---|---|
-1 | 99999999 | -6 | 99999994 |
-2 | 99999998 | -7 | 99999993 |
-3 | 99999997 | -8 | 99999992 |
-4 | 99999996 | -9 | 99999991 |
-5 | 99999995 | -10 | 99999990 |
*1WOBではわざと負の数の表現をサポートしていません。別のページで説明していますが、ここでは負の数を右表のとおりと覚えておいてください。
*2 実は筆者はFM音源のいじり方(どのパラメータをいじるとどのように変わるのか)をよくわかっていないので、何かいい音色ができたらぜひ教えてください。