BASICプログラミングでは、コンピューターに音を鳴らさせることもできます。古き良きPCスピーカーから簡単なビープ音やメロディを奏でることができました。ここでは、そのための主要な命令であるSOUND
文とPLAY
文について学びましょう。
SOUND文: 特定の周波数の音を鳴らす
SOUND
文は、指定した周波数(音の高さ)と持続時間(音の長さ)で音を鳴らすシンプルな命令です。PCの内蔵スピーカーから直接音を出力します。
基本的な構文:
SOUND frequency, duration
frequency
: 音の高さをヘルツ (Hz) で指定します。値が大きいほど高い音になります。指定できる範囲はBASICの方言によって異なりますが、QBasicなどでは37Hzから32767Hzの範囲です。duration
: 音の長さを「クロックティック」という単位で指定します。1秒あたり約18.2ティックです。つまり、SOUND 880, 18.2
は、約1秒間、880Hz(ラ(A)の音)を鳴らします。
サンプルコード (ドレミ):
' ド(C4) レ(D4) ミ(E4) を鳴らす
SOUND 262, 9.1 ' ド (約0.5秒)
SOUND 294, 9.1 ' レ (約0.5秒)
SOUND 330, 9.1 ' ミ (約0.5秒)
⚠️ 注意点:
SOUND
文は、一度に一つの音しか鳴らせません。次のSOUND
文は、前の音が鳴り終わるまで待機します。- 実行する環境(OSやエミュレータ、BASICの種類)によっては、音の聞こえ方や
duration
の精度が異なる場合があります。 - FreeBASICなどの現代的なBASICでは、
SOUND
文は利用可能ですが、OSのサウンド機能を利用するため、古いBASICとは動作が異なる場合があります。場合によっては、別途サウンドライブラリが必要になることもあります。
PLAY文: MMLでメロディを奏でる 🎵
PLAY
文は、より複雑なメロディや音楽を演奏するための命令です。Music Macro Language (MML) と呼ばれる文字列を使って、音階、長さ、テンポなどを細かく指定できます。
基本的な構文:
PLAY "command_string"
"command_string"
: MMLコマンドを含む文字列を指定します。
主なMMLコマンド:
コマンド | 説明 | 例 |
---|---|---|
C, D, E, F, G, A, B |
音階(ドレミファソラシ)を指定します。 | PLAY "CDEFGAB" |
# または + |
直前の音を半音上げます(シャープ)。 | PLAY "C# D+" |
- |
直前の音を半音下げます(フラット)。 | PLAY "G- A-" |
Ln |
音の長さを指定します。nは1(全音符)から64(64分音符)までの数値。L4で四分音符。 | PLAY "L4 C L8 D L16 E" (長さのデフォルトはL4) |
On |
オクターブを指定します。nは0から6(または1から8など、方言による)。数値が大きいほど高いオクターブ。 | PLAY "O4 C O5 C" (デフォルトはO4が多い) |
Tn |
テンポ(速さ)を指定します。nは1分間あたりの四分音符の数(BPM)。32から255の範囲が一般的。 | PLAY "T120 C D E" (デフォルトはT120が多い) |
P または R |
休符を指定します。長さはLコマンドに従います。 | PLAY "C P E R G" |
. (ドット) |
直前の音符や休符の長さを1.5倍にします。複数付けることも可能。 | PLAY "C4." (付点四分音符) |
MB / MF |
MB (Music Background) はバックグラウンド再生、MF (Music Foreground) はフォアグラウンド再生を指定します。バックグラウンド再生中はプログラムの他の処理を進められます。 | PLAY "MB C D E" |
MS / ML / MN |
演奏スタイルを指定します。MS (Staccato), ML (Legato), MN (Normal)。 | PLAY "MS C D E ML F G A" |
ℹ️ MMLコマンドはBASICの方言によって若干の違いがある場合があります。詳細は各BASICのリファレンスを確認してください。
サンプルコード (きらきら星の一部):
' きらきら星の冒頭部分
PLAY "T120 O4 L4 C C G G A A G"
PLAY "F F E E D D C"
⚠️ 注意点:
- MMLは覚えることが多いですが、使いこなせると表現豊かな音楽演奏が可能です。
PLAY
文も、基本的には一度に一つの音(単音)しか鳴らせません。ただし、一部のBASIC(例: FreeBASICの拡張ライブラリ、N88-BASICなど)では、複数のチャンネルを使って和音を演奏できる場合があります。- FreeBASICでは、`sfx` ライブラリなどを利用することで、QBASIC互換の `PLAY` コマンドに加え、MIDIファイルの再生なども可能になります。
現代の環境での実行
古いBASICプログラムを実行する場合、DOSBoxのようなエミュレータ上でQBasicなどを動かすのが一般的です。これにより、当時のPCスピーカーの音を再現しやすくなります。
FreeBASIC のような現代的なBASICコンパイラを使う場合、SOUND
文やPLAY
文は利用できますが、OSのサウンド機能(Windows APIなど)を通じて音が出力されることが多いです。そのため、PCスピーカー特有のレトロな音色とは異なる場合があります。FreeBASICでは、より高度なサウンド機能を提供するライブラリ (例: `sfx.bi`、Windows API直接利用) も存在します。
FreeBASICで`sfx`ライブラリを使うと、QBASIC互換のSOUND
やPLAY
コマンドを利用できます。このライブラリは別途ダウンロード・設定が必要な場合があります。
' FreeBASIC で sfx ライブラリを使う場合の例
#include "sfx.bi" ' sfxライブラリをインクルード
#inclib "fbsfx" ' ライブラリをリンク
SoundSet(44100, 1, 16) ' サウンド初期設定 (例)
SOUND 440, 18.2 ' SOUND命令 (ライブラリ経由)
SoundmidiSet() ' MIDIモード設定 (PLAY命令用)
PLAY "T120 O4 CDEFGAB" ' PLAY命令 (ライブラリ経由)
Sleep ' 音が終わるまで待機 (例)
まとめ 🎉
今回はBASICで音を鳴らすためのSOUND
文とPLAY
文について学びました。
SOUND
文: 周波数と持続時間を指定して単音を鳴らす。シンプルだが表現力は限定的。PLAY
文: MMLを使ってメロディを演奏する。複雑だが表現力が高い。
これらの命令を使うことで、プログラムに効果音を付けたり、簡単なBGMを流したりすることができます。特にPLAY
文のMMLは、昔のゲーム音楽などでも使われていた技術です。ぜひ色々な音やメロディを試してみてください!
次は、いよいよこれまでの知識を活かして、ミニプロジェクトに挑戦してみましょう!
参考情報
- QBasic/Sound (Wikibooks):
SOUND
文とPLAY
文の基本的な解説があります。
https://en.wikibooks.org/wiki/QBasic/Sound - Microsoft BASIC MML (VGMPF Wiki):
PLAY
文で使われるMMLの詳細なコマンドリストがあります。
https://wiki.vgmpf.com/wiki/Microsoft_BASIC_MML - FreeBASIC Wiki Manual – sfx: FreeBASICでサウンド機能を提供する`sfx`ライブラリの解説です。
https://www.freebasic.net/wiki/ExtLibSfx
コメント