今回は、Laboratoryテーマ??14「簡単にBGMを鳴らしたい」です。
やっぱりゲームを作る以上、盛り上げる為BGMは必須ですよね。
無音空間でゲームをプレイするのはなかなかキツイ。
と言う訳で、現時点で公開している自作ゲームで使われているレベルの、簡易的なBGM演奏ルーチンを公開します。
なお、BGMデータは下記レイアウトに合わせて作る必要があるので、音階を周波数データに変換して作らなくてはなりません。
しかし、流石にそれは大変なので、後日「簡易MMLコンパイラ」を公開します。
元々ツールとして制作しておらず、自分が使う用で万人向けに作られていませんでしたが、ツールとして公開するため色々改良しました。
【BGMデータレイアウト】
1音(3バイト)
2音(3バイト)
...
最後
音程下位8ビット
音程上位8ビット
長さ
音程下位8ビット
音程上位8ビット
長さ
...
FF
【音階・周波数対応表】
オクターブ
1
2
3
4
5
6
7
8
音階
C
D5D
6AF
357
1AC
D6
6B
35
1B
C#
C9C
64E
327
194
CA
65
32
19
D
BE7
5F4
2FA
17D
BE
5F
30
18
D#
B3C
59E
2CF
168
B4
5A
2D
16
E
A9B
54E
2A7
153
AA
55
2A
15
F
A02
501
281
140
A0
50
28
14
F#
973
4BA
25D
12E
97
4C
26
13
G
8EB
476
23B
11D
8F
47
24
12
G#
86B
436
21B
10D
87
43
22
11
A
7F2
3F9
1FD
FE
7F
40
20
10
A#
780
3C0
1E0
F0
78
3C
1E
F
B
714
38A
1C5
E3
71
39
1C
E
【長さ】
音符
長さ
全音符
128
2分音符
64
4分音符
32
8分音符
16
16分音符
8
32分音符
4
64分音符
2
本格的なBGM演奏ルーチンになると、BGMデータ中にテンポやボリューム、エンベロープ、タイ、スタッカート、連符等のデータが追加されるため、BGMデータの作成が大変です。(因みに、タイ以降はMSX-BASICのPLAY文にはないコマンドですので、そもそも演奏できません。)
何より、データが膨大になります。
私はあまり自作ゲームのBGMに拘らない人でした。
「T(テンポ)やV(ボリューム)、S・M(エンベロープ)はゲーム開始前に設定しておけば良い。」=「演奏中に変更する必要はない。」という考えでした。
まぁ、今でもそう考えています。
と言うか、私はそんな大層な曲を作曲できません。
ゲーム開発後半でも簡易版で十分でしたが、一緒にゲーム制作していた仲間からASCIIの「MuSICA」を使うよう依頼され使い始めた経緯があります。
しかし、プログラムもBGMデータも膨大で、メモリ制約のあるなか苦労した記憶があります。
簡易BGM演奏ルーチンです。
サンプル曲として「かえるの合唱」が鳴ります。
変数を利用しているので、サブルーチンとしてアドレス変更する際は、そこの変更を忘れないように気を付けてください。
「BGMSMPL.BAS」【 ダウンロード 】
サンプルは、私が通常やっている通りルーチンを2つ並べて2重和音でBGMを鳴らし(B、Cチャンネル)、残りの1チャンネル(Aチャンネル)は効果音用です。
250行の変数U1にBチャンネルのBGMデータ先頭アドレス上位8ビット、D1にBチャンネルのBGMデータ先頭アドレス下位8ビット、U2にCチャンネルのBGMデータ先頭アドレス上位8ビット、D2にCチャンネルのBGMデータ先頭アドレス下位8ビットを代入して下さい。
因みに、処理が早すぎるので430行〜450行で時間稼ぎの無駄ループをしています。
「Bチャンネル」
460行〜520行(&HC028〜&HC057)
変数アドレス
内容
BF02
演奏中アドレスカウンタ
BF03
BF04
音長カウンタ
BF05
BGMデータ先頭アドレス
BF06
「Cチャンネル」
530行〜590行(&HC058〜&HC087)
変数アドレス
内容
BF07
演奏中アドレスカウンタ
BF08
BF09
音長カウンタ
BF0A
BGMデータ先頭アドレス
BF0B
3つ並べて3重和音もできますが、効果音を鳴らす際、効果音のチャンネルが鳴っている間フラグを立てて、フラグが立っている時はデータは読んでアドレスは先に進めるが、PSGは触らないと言った工夫が必要です。
では、次回はLaboratoryテーマ??15「任意サイズのFONTキャラクタを指定座標に表示させたい」です。