WAVEIFコントロールを使った。ギターとベースのチューナー。 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 ベース  (学生) 投稿日時 2014/10/7 20:01:45
FFTの記述は、厳しいですから、FFT Activexコントロールの方法に変更しました。
お勧めのFFT Activexコントロールは、ないでしょうか?。
FFT OCX。
FFT Activex。
CONTEC
http://www.contec.co.jp/product/device/acxpac/






投稿者 もちだ  (社会人) 投稿日時 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
投稿者 ベース  (学生) 投稿日時 2014/9/30 17:24:33
リアルタイムマイク入力の周波数を読む仕組みのサンプルを教えてください。よろしくお願いします。
投稿者 ベース  (学生) 投稿日時 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



投稿者 もちだ  (社会人) 投稿日時 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資料が本当に少ないため、他の言語も視野に入れないとサンプルを探すにも難儀すると思います。

では。
投稿者 ベース  (学生) 投稿日時 2014/9/30 08:07:13
周波数を読む処理は、WAVEIFを使うとよいのでしょうか?。それとも、mciSendString関数を使うとよいのでしょうか?。サンプルを検索しましたが、サンプルがないです。よろしくお願いします。
投稿者 ベース  (学生) 投稿日時 2014/9/28 18:11:56
すいません。マイク入力の周波数を測定してから数字表示するコードです。
投稿者 ベース  (学生) 投稿日時 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
投稿者 ベース  (学生) 投稿日時 2014/9/27 15:36:03
WAVEIFコントロールを使った。マイク入力とギターを接続して使うギターとベースのチューナーを作成したいと思っているのですが、マイク入力の音をスピーカーから出す方法がわかりません。よろしくお願いします。
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