WAVEIFコントロールを使った。ギターとベースのチューナー。
投稿者 ベース  (学生)
投稿日時
2014/9/28 16:05:11
下のコードで録音と再生は、できますが、数字にしたり、マイク入力をスピーカーから出力する方法ができません。よろしくお願いします。
Public Class Form1
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' record from microphone
mciSendString("open new Type waveaudio Alias recsound", "", 0, 0)
mciSendString("record recsound", "", 0, 0)
End Sub
Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
' stop and save
mciSendString("save recsound c:\record.wav", "", 0, 0)
mciSendString("close recsound", "", 0, 0)
End Sub
Private Sub button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
' play audio
My.Computer.Audio.Play("c:\record.wav", AudioPlayMode.Background)
End Sub
End Class
Public Class Form1
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' record from microphone
mciSendString("open new Type waveaudio Alias recsound", "", 0, 0)
mciSendString("record recsound", "", 0, 0)
End Sub
Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
' stop and save
mciSendString("save recsound c:\record.wav", "", 0, 0)
mciSendString("close recsound", "", 0, 0)
End Sub
Private Sub button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
' play audio
My.Computer.Audio.Play("c:\record.wav", AudioPlayMode.Background)
End Sub
End Class
投稿者 ベース  (学生)
投稿日時
2014/9/28 18:11:56
すいません。マイク入力の周波数を測定してから数字表示するコードです。
投稿者 ベース  (学生)
投稿日時
2014/9/30 08:07:13
周波数を読む処理は、WAVEIFを使うとよいのでしょうか?。それとも、mciSendString関数を使うとよいのでしょうか?。サンプルを検索しましたが、サンプルがないです。よろしくお願いします。
投稿者 もちだ  (社会人)
投稿日時
2014/9/30 15:11:29
回答するだけの知識は持ち合わせていませんが、以前、音程解析(音痴かどうかを見る)をしようとしたり、
ソフトシンセを作ろうとして同じような話になったので、一応参考までに。
記事の要点としてはこうでしょうか。
・WAVEIFコントロールを使用している
(これかな?:http://www32.ocn.ne.jp/~kentaro/Software/WaveIF/WaveIn/index.html)
・録音、再生はできる
・マイクから入力の音声をスピーカーから出したい
・周波数を測定してから数字表示したい
スピーカーから音を出すというのは再生すれば出来る話なので、リアルタイムで、という話かと思いますが、
Windowsだったら大抵はラインインをそのままスピーカーに出力できるはずで、わざわざVBで組まずとも
出来るのでは、と思います。
参考:マイク入力をスピーカーに出力
http://okwave.jp/qa/q3600909.html
データを細切れにし、リアルタイム編集しながら再生する方法があるので、録音しつつやれば自力でもできるかも知れませんが…。
参考:WAVEファイルのデータをリアルタイムに書き換えて再生する
http://www.atelier-blue.com/memo/memo2006-4-22.htm
周波数の数字というのは、録音した音声の波形から得られる値の話をしているのでしょうか?
WAVEIFにせよmciSendStringにせよ制御するものなので、解析の為にデータを抜くなどの細かい作業は
難しいんじゃないかと思います(バッファが抜ければいけるかも知れませんが)。
WAVファイルへの録音後ならば、無圧縮の波形データが書き込まれているため、VB単体でも数値化することが可能です。
WAVファイルは頭から44バイト目までがヘッダにあたり、フォーマットなどが記載されています。
それ以降は波形が生データで格納されています。
参考:
http://www.kk.iij4u.or.jp/~kondo/wave/
http://www.asahi-net.or.jp/~cv9t-sum/knowledge40.htm#WAVE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB
ただし、サンプリング周波数、ビットレート、チャンネル数に比例してデータ量が膨大なものとなるため、
最初は周波数を落とし、ビットレートは8ビット、モノラルで録音されたものを解析するスタイルで
実験されることをお勧めします。特にステレオだと互い違いに左右のデータが並ぶので、データを拾うのも面倒です。
(そもそもギターならモノラルで良いだろうという気もしますが)
しかし、このままでは波形に追従して値を拾っているだけなので、どういう音(どういう波形)であるかまでは判らないはずです。
アナライザーのようなもの(入力した音声の主音程とか倍音構成とかを見せる)を出したい場合は
信号解析が必要となりまして、フーリエ変換の知識が必要と記憶しています
(私は知識がなく断念。楽に出来る方法があるのかも知れませんが…)。
参考:信号解析
http://www.geocities.jp/horie_ryu/page01.html
参考:VB のサウンド波形のサンプリングと分析プログラム
http://www.bvbcode.com/jp/2fy0ojqu-308755
こういった音声処理系はVB資料が本当に少ないため、他の言語も視野に入れないとサンプルを探すにも難儀すると思います。
では。
ソフトシンセを作ろうとして同じような話になったので、一応参考までに。
記事の要点としてはこうでしょうか。
・WAVEIFコントロールを使用している
(これかな?:http://www32.ocn.ne.jp/~kentaro/Software/WaveIF/WaveIn/index.html)
・録音、再生はできる
・マイクから入力の音声をスピーカーから出したい
・周波数を測定してから数字表示したい
スピーカーから音を出すというのは再生すれば出来る話なので、リアルタイムで、という話かと思いますが、
Windowsだったら大抵はラインインをそのままスピーカーに出力できるはずで、わざわざVBで組まずとも
出来るのでは、と思います。
参考:マイク入力をスピーカーに出力
http://okwave.jp/qa/q3600909.html
データを細切れにし、リアルタイム編集しながら再生する方法があるので、録音しつつやれば自力でもできるかも知れませんが…。
参考:WAVEファイルのデータをリアルタイムに書き換えて再生する
http://www.atelier-blue.com/memo/memo2006-4-22.htm
周波数の数字というのは、録音した音声の波形から得られる値の話をしているのでしょうか?
WAVEIFにせよmciSendStringにせよ制御するものなので、解析の為にデータを抜くなどの細かい作業は
難しいんじゃないかと思います(バッファが抜ければいけるかも知れませんが)。
WAVファイルへの録音後ならば、無圧縮の波形データが書き込まれているため、VB単体でも数値化することが可能です。
WAVファイルは頭から44バイト目までがヘッダにあたり、フォーマットなどが記載されています。
それ以降は波形が生データで格納されています。
参考:
http://www.kk.iij4u.or.jp/~kondo/wave/
http://www.asahi-net.or.jp/~cv9t-sum/knowledge40.htm#WAVE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB
ただし、サンプリング周波数、ビットレート、チャンネル数に比例してデータ量が膨大なものとなるため、
最初は周波数を落とし、ビットレートは8ビット、モノラルで録音されたものを解析するスタイルで
実験されることをお勧めします。特にステレオだと互い違いに左右のデータが並ぶので、データを拾うのも面倒です。
(そもそもギターならモノラルで良いだろうという気もしますが)
しかし、このままでは波形に追従して値を拾っているだけなので、どういう音(どういう波形)であるかまでは判らないはずです。
アナライザーのようなもの(入力した音声の主音程とか倍音構成とかを見せる)を出したい場合は
信号解析が必要となりまして、フーリエ変換の知識が必要と記憶しています
(私は知識がなく断念。楽に出来る方法があるのかも知れませんが…)。
参考:信号解析
http://www.geocities.jp/horie_ryu/page01.html
参考:VB のサウンド波形のサンプリングと分析プログラム
http://www.bvbcode.com/jp/2fy0ojqu-308755
こういった音声処理系はVB資料が本当に少ないため、他の言語も視野に入れないとサンプルを探すにも難儀すると思います。
では。
投稿者 ベース  (学生)
投稿日時
2014/9/30 17:18:23
もちださん。ありがとうございました。
softtune、amplitube、というソフトは、リアルタイムでマイクの入力の音をA0からE6の範囲で音の周波数を読むソフトです。
サンプルを検索しましたが、C言語と、silverlight言語でサンプルに近いのがありますが、希望通りの動作をしません。
リアルタイムマイク入力を勉強できるサイトは、ありますでしょうか?。
ソフト。
softtune。
amplitube。
簡単WAVE録音再生。
open source guitar tuner。
サンプル。
vb net guitar tuner。
FFT guitar tuner
http://www.codeproject.com/Articles/32172/FFT-Guitar-Tuner
softtune、amplitube、というソフトは、リアルタイムでマイクの入力の音をA0からE6の範囲で音の周波数を読むソフトです。
サンプルを検索しましたが、C言語と、silverlight言語でサンプルに近いのがありますが、希望通りの動作をしません。
リアルタイムマイク入力を勉強できるサイトは、ありますでしょうか?。
ソフト。
softtune。
amplitube。
簡単WAVE録音再生。
open source guitar tuner。
サンプル。
vb net guitar tuner。
FFT guitar tuner
http://www.codeproject.com/Articles/32172/FFT-Guitar-Tuner
投稿者 ベース  (学生)
投稿日時
2014/9/30 17:24:33
リアルタイムマイク入力の周波数を読む仕組みのサンプルを教えてください。よろしくお願いします。
投稿者 もちだ  (社会人)
投稿日時
2014/10/1 15:39:18
(サンプルではありません)
少し調べてみたところ、同じような話題のものが見つかりました。フーリエ変換のDLLを公開されています。
http://hp.vector.co.jp/authors/VA014203/software/fftdll.htm
ページ中央、3.質問等のセクションにこんな内容の記載があります(一部改変)。
----
Q.マイクから音を入力してその音をFFTしました。そして、それをリアルタイムに
スペクトル表示したいのですがどうしたらよいか分かりません。
A.順序的には
1.マイクから音を取り込む
2.Waveファイルをテキストファイルへ変換する
3.FFTをかける
4.グラフとして表示する
5.決めた時間間隔で繰り返す
となります。
--ここまで--
音を取り込んで保存が出来るのであれば、2~5を実現すれば出来るのではないでしょうか?
他参考:Visual Basicサンプル 数値演算モジュールなど/NUMERICAL RECIPES からの移植
http://homepage3.nifty.com/numericworld/computer/vb/mathpack.htm
少し調べてみたところ、同じような話題のものが見つかりました。フーリエ変換のDLLを公開されています。
http://hp.vector.co.jp/authors/VA014203/software/fftdll.htm
ページ中央、3.質問等のセクションにこんな内容の記載があります(一部改変)。
----
Q.マイクから音を入力してその音をFFTしました。そして、それをリアルタイムに
スペクトル表示したいのですがどうしたらよいか分かりません。
A.順序的には
1.マイクから音を取り込む
2.Waveファイルをテキストファイルへ変換する
3.FFTをかける
4.グラフとして表示する
5.決めた時間間隔で繰り返す
となります。
--ここまで--
音を取り込んで保存が出来るのであれば、2~5を実現すれば出来るのではないでしょうか?
他参考:Visual Basicサンプル 数値演算モジュールなど/NUMERICAL RECIPES からの移植
http://homepage3.nifty.com/numericworld/computer/vb/mathpack.htm
投稿者 ベース  (学生)
投稿日時
2014/10/7 20:01:45
FFTの記述は、厳しいですから、FFT Activexコントロールの方法に変更しました。
お勧めのFFT Activexコントロールは、ないでしょうか?。
FFT OCX。
FFT Activex。
CONTEC
http://www.contec.co.jp/product/device/acxpac/
お勧めのFFT Activexコントロールは、ないでしょうか?。
FFT OCX。
FFT Activex。
CONTEC
http://www.contec.co.jp/product/device/acxpac/
waveout.openを入れてから、スピーカー出力を開くことはできました。
Public Class Form1
Dim Buffer() As Byte ' 録音されたデータを受け取るためのバッファ
Dim fileRec As Integer ' 録音されたデータを保存する一時ファイルのファイル番号
Dim strRecFileName As String ' 一時ファイルのファイル名
Dim WaveSize As Long ' 録音されたデータのサイズ
Private Property DataSet As Long
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdRec.Click
TextBox1.Text = "wavein"
WaveIn.Open()
WaveIn.Start()
WaveOut.Open()
End Sub
End Class