このツールの上位版である、「MMLコンパイラ(通常版)Ver.1.1」を2024年3月26日に公開しています。 |
今回は、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キャラクタを指定座標に表示させたい」です。