音楽

コンピューターの活躍の場は、目で見て楽しい視覚的なものだけではありません。耳で聞いて楽しむ聴覚的な分野においても、コンピューターはとても重要なポジションを得ています。人間が楽器を使って音楽を奏でるように、コンピューターも音楽を奏でることができます。ゲームに音楽はつきものですし、何かコンピューターを操作したときに「ピッ」と音が鳴るだけでも「コンピューターが応答した」と認識できます。

Jasmine Tea では、音に関して 3 つの機能を提供します。

  • 特定の周波数と波形の音を鳴らす。
  • MML(Music Macro Language)で音楽を演奏する。
  • BGM を鳴らす。

音とは、周波数と波形でどんな音に鳴るかが決まります。Jasmine Tea では、beep 命令を使うことで、周波数と、いくつかの波形の中から1つを選択して、音を鳴らすことができます。また、beep 命令では、音の長さも指定することができます。下記のプログラムは、方形波で「ドレミファミレド」の音階を 200ms ごとに鳴らす例です。

call sound 523
call sound 587
call sound 659
call sound 692
call sound 659
call sound 587
call sound 523

procedure sound rate
  beep 1,rate,200
  pause 200
end procedure

beep 命令でサポートされているパラメーターの範囲は、以下となります。

  • 周波数: 1 〜 22050
  • 長さ: 1 〜 10000
  • 波形: 正弦波、方形波、のこぎり波、三角波

sound-1

beep 音を使って音楽を演奏するプログラムを作ることもできますが、とても面倒ですし、楽譜で使われる音階や音の長さ、テンポなどとは、残念ながらかけ離れてしまっています。

もっと簡単に音楽を演奏できるように、Jasmine Tea では play 命令を提供しています。play 命令は、MML(Music Macro Language)を使って、演奏したい音楽をプログラミングします。下記は、play 命令と MML を使って方形波で「ドレミファミレド」を鳴らすプログラム例です。

play "t120l4o4q4v4@1"
play "cdef"
play "edc"
print "End"

1行目では、テンポ120、音符の初期値を四分音符、オクターブを 4、音長の中で実際に音を鳴らす割合を 1/2、音量を 4、波形を方形波、と指示しています。2行目と3行目にて、実際に音階を指定して音を鳴らしています。「ドレミファソラシ」が「cdefgab」に対応しています。

play 命令に「,」(カンマ記号)を使って 2 つ以上の MML をパラメーターに指定することで、和音を演奏することができます。下記のプログラムは、ジングルベルという曲の冒頭部分です。

play "t180o4q7l4@1v5","o4q7l4@1v4"
play "g>edc<g2.gg>edc<a2.aa>fed","c1c1c1f1f1"
play "<b2.>effede2.","g1g1c1"

Jasmine Tea では、MML を使って、以下の指定を行うことができます。

  • テンポ(bpm): 32 〜 255
  • 音階: cdefgab = ドレミファソラシ
  • オクターブ: 1 〜 9
  • 音長: 1 〜 64
  • 音量: 0 〜 10
  • 連符: {...} で囲むことで自動的に音調を計算
  • ゲートタイム: 8 段階で調整可能

play 命令では、MML で指定された演奏が終わるまで、次の行は実行されません。上記のプログラム例では、「ドレミファミレド」と演奏が終わった後に「End」と実行画面に表示されます。そのため、ゲームなどのプログラムで BGM(Background Music)として音楽が流れた状態で遊べるようにするためには、play 命令は適していません。

Jasmine Tea では、BGM として音楽を演奏するための機能を提供しています。bgmadd 命令で演奏したい MML を登録して、bgmplay 命令で登録された MML の演奏を開始します。

bgmadd "t120l4o4q4v4@1"
bgmadd "cdef"
bgmadd "edc"
bgmplay 1
do
  pset (random(0,639),random(0,399)),7
loop

bgmplay 命令でパラメーターに 1 を指定することで、登録された MML を繰り返し演奏することができます。上記のプログラムでは、「ドレミファミレド」と演奏しながら、グラフィック画面のランダムな座標に白い点を pset 命令で繰り返し表示し続けます。このように、bgmadd 命令と bgmplay 命令を使うことで、プログラムの実行から独立させて音楽の演奏を行うことができます。