by NoWest » 2006年8月07日(月) 17:54
> beep音の周波数はどのように指定すればよいのでしょうか。
>
> こんなことですみませんが、C言語と同じように
> Beep(周波数,時間)
> でいいのですか?
> はじめたばっかりでしらべてもよくわかりません。
WinowsXPを含むNT系のOSの場合、Beep関数の周波数、及び発音時間は有効なのですが、9X系ではBeep関数はMessageBeep関数を呼び出すだけなので周波数を指定することはできません。
ご存知とは思いますが、周波数はHz(ヘルツ)単位で指定します。
基本的な周波数のセットは以下のようなものですが、実際には整数で指定しないといけませんので、小数点以下は切捨てか、四捨五入しないといけません。
C :261.62
C#277.18
D :293.66
D#:311.12
E :329.62
F :349.22
F#:369.99
G :391.99
G#:415.3
A :440
A#:466.16
B :493.88
後は倍音の考え方で、高い高音は基本の音に×2してやれば求められます。
要するに1オクターブ高いA(ラ)を出したい場合は440×2で880を指定します。
さらに1オクターブ高いAを出したければ880×2という具合です。
余談ですが、上の周波数表は「平均律」といいます。
実際に人間の耳が音階として美しく感じられる音階は「純正律」と呼ばれていますが、純正律は転調できないという問題があるので、一般には使われません。
※一般に使われないとは言っても現実の楽器は純正律を使って演奏しています。というのも”音が出る”というのは物理現象なので人間の耳で聞きながら演奏した場合、必ず純正律となってしまいます。ところがピアノみたいた鍵盤を持つ楽器では叩いた鍵盤と出る音が必ず一定でなければならないことと、「変調」という演奏法が実現できなければなりません。そこで純正律で得られる440~880のような基準周波数の間を12等分したものを使うことで音階を表現しています。
一般式としては、fを求めたい周波数、Fを基準周波数、nを音階とすれば
次の式で得られます。
f=F*2^(n/12)
追記
以前、面白半分で作ったプログラムがあるので参考まで、
こちら [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Const Freq_C = 262
Const Freq_D = 294
Const Freq_E = 330
Const Freq_F = 349
Const Freq_G = 392
Const Freq_A = 440
Const Freq_B = 494
Const Time_W = 250
Type SOUND_DATA
Frequence As DWord
Length As DWord
End Type
Dim sd[28]=[
[Freq_C,Time_W],[Freq_D,Time_W],[Freq_E,Time_W],[Freq_F,Time_W],
[Freq_E,Time_W],[Freq_D,Time_W],[Freq_C,Time_W*2],
[Freq_E,Time_W],[Freq_F,Time_W],[Freq_G,Time_W],[Freq_A,Time_W],
[Freq_G,Time_W],[Freq_F,Time_W],[Freq_E,Time_W*2],
[Freq_C,Time_W*2],[Freq_C,Time_W*2],
[Freq_C,Time_W*2],[Freq_C,Time_W*2],
[Freq_C,Time_W/2],[Freq_C,Time_W/2],[Freq_D,Time_W/2],[Freq_D,Time_W/2],[Freq_E,Time_W/2],[Freq_E,Time_W/2],[Freq_F,Time_W/2],[Freq_F,Time_W/2],
[Freq_E,Time_W],[Freq_D,Time_W],[Freq_C,Time_W*2]
] As SOUND_DATA
Dim cnt As Long
For cnt=0 To 28
Beep(sd[cnt].Frequence,sd[cnt].Length*4/5)
Sleep(sd[cnt].Length)
Next
[quote]> beep音の周波数はどのように指定すればよいのでしょうか。
>
> こんなことですみませんが、C言語と同じように
> Beep(周波数,時間)
> でいいのですか?
> はじめたばっかりでしらべてもよくわかりません。[/quote]
WinowsXPを含むNT系のOSの場合、Beep関数の周波数、及び発音時間は有効なのですが、9X系ではBeep関数はMessageBeep関数を呼び出すだけなので周波数を指定することはできません。
ご存知とは思いますが、周波数はHz(ヘルツ)単位で指定します。
基本的な周波数のセットは以下のようなものですが、実際には整数で指定しないといけませんので、小数点以下は切捨てか、四捨五入しないといけません。
C :261.62
C#277.18
D :293.66
D#:311.12
E :329.62
F :349.22
F#:369.99
G :391.99
G#:415.3
A :440
A#:466.16
B :493.88
後は倍音の考え方で、高い高音は基本の音に×2してやれば求められます。
要するに1オクターブ高いA(ラ)を出したい場合は440×2で880を指定します。
さらに1オクターブ高いAを出したければ880×2という具合です。
余談ですが、上の周波数表は「平均律」といいます。
実際に人間の耳が音階として美しく感じられる音階は「純正律」と呼ばれていますが、純正律は転調できないという問題があるので、一般には使われません。
※一般に使われないとは言っても現実の楽器は純正律を使って演奏しています。というのも”音が出る”というのは物理現象なので人間の耳で聞きながら演奏した場合、必ず純正律となってしまいます。ところがピアノみたいた鍵盤を持つ楽器では叩いた鍵盤と出る音が必ず一定でなければならないことと、「変調」という演奏法が実現できなければなりません。そこで純正律で得られる440~880のような基準周波数の間を12等分したものを使うことで音階を表現しています。
一般式としては、fを求めたい周波数、Fを基準周波数、nを音階とすれば
次の式で得られます。
[b]f=F*2^(n/12)[/b]
[b]追記[/b]
以前、面白半分で作ったプログラムがあるので参考まで、
[hide=こちら][code]Const Freq_C = 262
Const Freq_D = 294
Const Freq_E = 330
Const Freq_F = 349
Const Freq_G = 392
Const Freq_A = 440
Const Freq_B = 494
Const Time_W = 250
Type SOUND_DATA
Frequence As DWord
Length As DWord
End Type
Dim sd[28]=[
[Freq_C,Time_W],[Freq_D,Time_W],[Freq_E,Time_W],[Freq_F,Time_W],
[Freq_E,Time_W],[Freq_D,Time_W],[Freq_C,Time_W*2],
[Freq_E,Time_W],[Freq_F,Time_W],[Freq_G,Time_W],[Freq_A,Time_W],
[Freq_G,Time_W],[Freq_F,Time_W],[Freq_E,Time_W*2],
[Freq_C,Time_W*2],[Freq_C,Time_W*2],
[Freq_C,Time_W*2],[Freq_C,Time_W*2],
[Freq_C,Time_W/2],[Freq_C,Time_W/2],[Freq_D,Time_W/2],[Freq_D,Time_W/2],[Freq_E,Time_W/2],[Freq_E,Time_W/2],[Freq_F,Time_W/2],[Freq_F,Time_W/2],
[Freq_E,Time_W],[Freq_D,Time_W],[Freq_C,Time_W*2]
] As SOUND_DATA
Dim cnt As Long
For cnt=0 To 28
Beep(sd[cnt].Frequence,sd[cnt].Length*4/5)
Sleep(sd[cnt].Length)
Next[/code][/hide]