コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

ビープ音サンプル

sound.beepコマンドを追加したので、ビープ音を鳴らすサンプルを作ってみました。
先ずは動画から・・・。

音階を出す

sound.beepコマンドは、周波数と鳴らす時間を設定して音を鳴らします。音階を鳴らそうとすると音階を周波数にしてプログラムする必要があります。そこで、音階と周波数の関係を書いておきます。
実は、NDSのプログラムの記事で音階と周波数とサンプリング周波数について、一度、書いているのですが、もう一度、書きたいと思います。

音階は一般的に440Hz(ラの音)を基準として考えます。ラの音から半音下がると-1、半音上がると+1、と考えると、(440Hzから半音×nだけ移動した音の周波数)P = 440×2の(n/12)乗 と表されます。例えば、1オクターブ低いラの音は、440*pow(2,-12/12)となり、=220Hzとなります。丁度半分の周期ですね。では、1オクターブ高いラの音は、440*pow(2,12/12)なので、=880Hzとなります。2倍の周期です。表にすると下のような感じです。

音階     n      Hz
C	-105	1.02	計算式:440*pow(2,-105/12)
|	  |	  |	   |         |
A	-24	110.00	計算式:440*pow(2,-24/12)
A#	-23	116.54	計算式:440*pow(2,-23/12)
B	-22	123.47	計算式:440*pow(2,-22/12)
C	-21	130.81	計算式:440*pow(2,-21/12)
C#	-20	138.59	計算式:440*pow(2,-20/12)
D	-19	146.83	計算式:440*pow(2,-19/12)
D#	-18	155.56	計算式:440*pow(2,-18/12)
E	-17	164.81	計算式:440*pow(2,-17/12)
F	-16	174.61	計算式:440*pow(2,-16/12)
F#	-15	185.00	計算式:440*pow(2,-15/12)
G	-14	196.00	計算式:440*pow(2,-14/12)
G#	-13	207.65	計算式:440*pow(2,-13/12)
A	-12	220.00	計算式:440*pow(2,-12/12)
A#	-11	233.08	計算式:440*pow(2,-11/12)
B	-10	246.94	計算式:440*pow(2,-10/12)
C	-9	261.63	計算式:440*pow(2,-9/12)
C#	-8	277.18	計算式:440*pow(2,-8/12)
D	-7	293.66	計算式:440*pow(2,-7/12)
D#	-6	311.13	計算式:440*pow(2,-6/12)
E	-5	329.63	計算式:440*pow(2,-5/12)
F	-4	349.23	計算式:440*pow(2,-4/12)
F#	-3	369.99	計算式:440*pow(2,-3/12)
G	-2	392.00	計算式:440*pow(2,-2/12)
G#	-1	415.30	計算式:440*pow(2,-1/12)
A	0	440.00	計算式:440*pow(2,0/12)
A#	1	466.16	計算式:440*pow(2,1/12)
B	2	493.88	計算式:440*pow(2,2/12)
C	3	523.25	計算式:440*pow(2,3/12)
C#	4	554.37	計算式:440*pow(2,4/12)
D	5	587.33	計算式:440*pow(2,5/12)
D#	6	622.25	計算式:440*pow(2,6/12)
E	7	659.26	計算式:440*pow(2,7/12)
F	8	698.46	計算式:440*pow(2,8/12)
F#	9	739.99	計算式:440*pow(2,9/12)
G	10	783.99	計算式:440*pow(2,10/12)
G#	11	830.61	計算式:440*pow(2,11/12)
A	12	880.00	計算式:440*pow(2,12/12)
A#	13	932.33	計算式:440*pow(2,13/12)
B	14	987.77	計算式:440*pow(2,14/12)
C	15	1046.50	計算式:440*pow(2,15/12)
C#	16	1108.73	計算式:440*pow(2,16/12)
D	17	1174.66	計算式:440*pow(2,17/12)
D#	18	1244.51	計算式:440*pow(2,18/12)
E	19	1318.51	計算式:440*pow(2,19/12)
F	20	1396.91	計算式:440*pow(2,20/12)
F#	21	1479.98	計算式:440*pow(2,21/12)
G	22	1567.98	計算式:440*pow(2,22/12)
G#	23	1661.22	計算式:440*pow(2,23/12)
A	24	1760.00	計算式:440*pow(2,24/12)
|	 |	   |	   |        |
D#	54	9956.06	計算式:440*pow(2,54/12)

sound.beepコマンドは、サンプリング周波数20kHz固定で、1Hzから10kHzまでの波形を作るので、上の表の範囲の音階が出せることになります。

サンプルプログラム

サンプルプログラムは、上の周波数を音階として音を鳴らすプログラムです。音と同時に音階を文字で表示するのと、表示位置を音階の高さに比例させています。

------------------------------------------
--Beepサンプル
------------------------------------------
--関数宣言--------------------------------
main={}       --mainメソッド
printscrl={}  --スクロールするテキスト表示
--グローバル変数宣言----------------------
--画面サイズ取得
Gwide, Gheight = canvas.getviewSize()
LuaridaPath = system.getCardMnt().."/luarida"  --luaファイルを保存しているPath
BLK = color(0,0,0)
WHI = color(255,255,255)
------------------------------------------
--メイン
------------------------------------------
function main()
local tm, i
local h = { si0=0, do0=1, re=3, mi=5, fa=6, so=8, ra=10, si=12, do1=13 }
local p = { si0=494, do0=523, re=587, mi=659, fa=698, so=784, ra=880, si=988, do1=1047 }
local o = { do0="ド",re="レ",mi="ミ",fa="ファ",so="ソ",ra="ラ",si="シ" }
local kai = { h.re, h.mi, h.fa, h.so, h.mi, h.fa, h.re, h.mi, h.do0, h.re, h.si0, h.do0, h.do1, h.do0 }
local mel = { p.re, p.mi, p.fa, p.so, p.mi, p.fa, p.re, p.mi, p.do0, p.re, p.si0, p.do0, p.do1, p.do0 }
local len = {  80,   128,   64,   120,  80,  120,   80,  120,    80,  120,    80,   180,    50,   320 }
local onp = {  o.re, o.mi, o.fa, o.so, o.mi, o.fa, o.re, o.mi, o.do0, o.re, o.si, o.do0, o.do0, o.do0 }
local x = 0
 canvas.drawCls( WHI )
 canvas.drawTextCenter( "ビープ音サンプル", Gwide/2, 2, 24, BLK )

 for i=1, #mel do
   sound.beep( mel[i], len[i] )
   canvas.drawText( onp[i], x*22, Gheight-kai[i]*15-70, 20, BLK )
   if( mel[i]==p.fa )then
     x = x + 2
   else
     x = x + 1
   end
   tm = system.getSec() + len[i]/900
   while( tm>system.getSec() )do end
 end

 toast("画面タッチで終了します")
 touch(3)
end
main()

beep音で、昔を懐かしんでください。