ページ 11

beepについて

Posted: 2006年8月07日(月) 16:30
by まいく
beep音の周波数はどのように指定すればよいのでしょうか。

こんなことですみませんが、C言語と同じように
Beep(周波数,時間)
でいいのですか?
はじめたばっかりでしらべてもよくわかりません。

Re: beepについて

Posted: 2006年8月07日(月) 17:54
by NoWest
> 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)


追記
以前、面白半分で作ったプログラムがあるので参考まで、

Beepについて

Posted: 2006年11月29日(水) 00:39
by TTL
調子に乗ってこんなのを作ってしまいました。

コード: 全て選択


Sub PlayBeep(ByVal command As BytePtr)As DWord
	Dim A As DWord
	Dim B As DWord
	Dim L As DWord
	Dim O As DWord
	O=4
	L=500
*PB1
	Select Case GetByte(command)
		Case &h41
			A=O*12
			If GetByte(command+1)=&h23 Then
				A++
				command++
			End If
			If GetByte(command+1)=&h62 Then
				A--
				command++
			End If
		Case &h42
			A=O*12+2
			If GetByte(command+1)=&h23 Then
				A++
				command++
			End If
			If GetByte(command+1)=&h62 Then
				A--
				command++
			End If
		Case &h43
			A=O*12+3
			If GetByte(command+1)=&h23 Then
				A++
				command++
			End If
			If GetByte(command+1)=&h62 Then
				A--
				command++
			End If
		Case &h44
			A=O*12+5
			If GetByte(command+1)=&h23 Then
				A++
				command++
			End If
			If GetByte(command+1)=&h62 Then
				A--
				command++
			End If
		Case &h45
			A=O*12+7
			If GetByte(command+1)=&h23 Then
				A++
				command++
			End If
			If GetByte(command+1)=&h62 Then
				A--
				command++
			End If
		Case &h46
			A=O*12+8
			If GetByte(command+1)=&h23 Then
				A++
				command++
			End If
			If GetByte(command+1)=&h62 Then
				A--
				command++
			End If
		Case &h47
			A=O*12+10
			If GetByte(command+1)=&h23 Then
				A++
				command++
			End If
			If GetByte(command+1)=&h62 Then
				A--
				command++
			End If
		Case &h4F
			O=GetByte(command+1)-48
			command+=2
			Goto *PB1
		Case &h53
			Sleep(L)
			command++
			Goto *PB1
		Case &h4C
			L=0
*PB2
			command++
			If GetByte(command)>47 And GetByte(command)<58 Then
				L*=10
				L+=GetByte(command)-48
				Goto *PB2
			End If
			command--
			Goto *PB1
		Case 0
			Exit Function
		Case Else
			command++
			Goto *PB1
	End Select
	Beep (Fix(2^(A/12)*27.5625+0.5),L)
	command++
	Goto *PB1
End Sub
NT系ならMML風の命令でBeep音演奏ができます(笑)

コード: 全て選択


'A B C D E F G それぞれ、ラ、シ、、、ソが出る
'# b(Bの小文字)をA~Gの後につけると半音上げ下げ  C#ならCより半音高い音 DbならDより半音低い音
'L 出す音の長さ(ミリ秒)を指定
'O オクターブを設定
'なお、命令と命令の間はスペース(&h20)を入れてよい

PlayBeep("L250 O4CO3GO4CO3G O4GO3GO4GO3G O5AO4AO5AO4A O4GO3GEG")
PlayBeep("L250 O4FO3GO4FO3G O4EO3GO4EO3G O4DO3GO4DO3G O4CO3GEG")
PlayBeep("L250 O4GO3GO4GO3G O4FO3GO4FO3G O4EO3GO4EO3G O4DO3GDG")
PlayBeep("L250 O4GO3GO4GO3G O4FO3GO4FO3G O4EO3GO4EO3G O4DO3GDG")
PlayBeep("L250 O4CO3GO4CO3G O4GO3GO4GO3G O5AO4AO5AO4A O4GO3GEG")
PlayBeep("L250 O4FO3GO4FO3G O4EO3GO4EO3G O4DO3GO4DO3G O4L1000C")

'こんなふうに書くと演奏される。
[/code]