[BASICのはじめ方] Part19: SOUNDやPLAY文で音を鳴らす

BASIC

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互換のSOUNDPLAYコマンドを利用できます。このライブラリは別途ダウンロード・設定が必要な場合があります。


' 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は、昔のゲーム音楽などでも使われていた技術です。ぜひ色々な音やメロディを試してみてください!

次は、いよいよこれまでの知識を活かして、ミニプロジェクトに挑戦してみましょう!


参考情報

コメント

タイトルとURLをコピーしました