シミュレーションの作り方 11


その11 音を発生させるには


 

       <注>Win7ではうまく音が出ないことが有ります。

 サウンドカード(ボード)をパソコンに増設している人は多くないので、Windowsが標準で備えているメッセージ音を使って付属のスピーカーを鳴らしてみることにします。 それは電子機器が発する「ピッ」または「ピー」というおなじみの電子音で、任意に鳴らすには「Beep」という命令を使用します。
 今回この説明をするのは、(84)「斜めドップラー効果」(2014.3.6Up 音波-5)でこの「Beep」を使用したからです。
Sheet1のVBエディタを開いてご覧ください。(標準モジュールではPrivateではなくPublic宣言にする)赤文字部分が救急車の「ピーポー」を再現するためにタイマーの中に新たに組み込んだ部分です。ただし、Beep関数を使うと音の長さが優先しTimerの⊿tとは無関係の動きになることがあります。

Private Declare Function Beep Lib "kernel32" 
(ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
 'Beepもプロパティ宣言 これが大切!
Private 停止 As Boolean 'ストップの判定(論理判定)記号の宣言 これが大切!
----------------------------------------------------------------------------------------------------
Private Sub SpinButton2_Change()  この部分は手動でタイマーを動かす時にも音が出るようにした部分
Beep Range("M32"), Range("G31")
Beep Range("M32") * 783.99 / 987.76, Range("G31") - 100

End Sub
-----------------------------------------------------------------------------------------------------
Private Sub CommandButton3_Click() 'Startボタン

'「 Private 停止 As Boolean 'ストップの判定 」の貼り付けとSTOPコマンドボタンの取り付けを忘れないように。

・・・・・・・・・・・・・・・・・・・・・・
       略
・・・・・・・・・・・・・・・・・・・・・・

'*********************************************************************

'Range("I33") = Range("I33") + 10
Beep Range("M32"), Range("G31")
Beep Range("M32") * 783.99 / 987.76, Range("G31") - 100


Do Until Timer - 開始時刻 >= 経過時間 '(⊿t経つまでループする)
Loop
DoEvents
Loop

End Sub
-----------------------------------------------------------------------------------------------------

   Beepの要素

 Beep 周波数,音をだす時間(ミリ秒で指定)

 したがって、600Hzの音を300ミリ秒鳴らすには、Beep 600,300 と記述します。 


   音の高さ(音階)

 1オクターブ高い音は振動数が2倍で半音があり12段階(12半音)に分かれているので、振動数は1段階あたり2の12乗根(2^(1/12))倍ずつ高くなる。
平均律のラ=440Hz(調律基準)を基準に音階を計算してみると、
 ラ=440
 ラ#=440×(2^(1/12))=440×((2^(1/12)))^1≒466.1637615
 シ=440×(2^(1/12))×(2^(1/12))=440×((2^(1/12)))^2493.8833013
 ド=440×(2^(1/12))×(2^(1/12))×(2^(1/12))=440×((2^(1/12)))^3≒523.2511306
 ド#=440×((2^(1/12)))^4≒554.365262
 レ=440×((2^(1/12)))^5≒587.3295358
 レ#=440×((2^(1/12)))^6≒622.2539674
 ミ=440×((2^(1/12)))^7≒659.2551138
 ファ=440×((2^(1/12)))^8≒698.4564629
 ファ#=440×((2^(1/12)))^9≒739.9888454
 ソ=440×((2^(1/12)))^10783.990872
 ソ#=440×((2^(1/12)))^11≒830.6093952
 ラ=440×((2^(1/12)))^12=880

(84)「斜めドップラー効果」の救急車の「ピー^ポー」は「シ」「ソ」と聞こえる気がしたので、493.8833013×2≒987.76Hzと783.990872≒783.99Hzを使用した。


   音の長さ

 物理なので音楽的に考えなくとも良いが、気になる人は次のように計算する。
例えば、テンポ120では、1分間に四分音符120個の速度なので、四分音符1個の音の長さは、60÷120=0.5秒=500ミリ秒となる。
したがって、高い四分音符の「ド」は  Beep 1046.5,500 となる。