
<ファイルを音声で持ち帰りたい>
USBを使わずにファイルを持ち帰る方法を考案しましたが、
(バイナリ→音声→録音→録音ファイルを解析→元のバイナリ とします)
そんなアプリを開発したいと思っています。
既にバイナリーファイルをWAV形式に変換するツールを開発されている方がいます。
当方もドレミファを鳴らすWAVファイル生成アプリを作成しました。
これによりバイナリの16進を音階(2オクターブ)に変換し、
ボイスレコーダーで保存するところまでこぎつけました。
問題は録音された音階を元のバイナリに戻す方法です。
どなたかノコギリ波形を解析するアプリのソースを公開されてないでしょうか。
ボイスレコーダーのWAVファイルの波型波形を解析する方法を教えて欲しいのです。
関数かVB, C++のソースが分かれば最もよいです。
質問には色々語弊(誤解をまねく表現)がありますが、
純粋にプログラミングについての質問ですので、よろしくお願いします。
以下参考です。
なんでもピーガー(バイナリーファイルをWAV形式に変換)
http://www.tiny-yarou.com/datarec.html
以下にまがりなりにでも音階を生成するアプリのソースを載せておきます。
Option Explicit
Public Const gPaiRad As Double = 3.1415926535
Private Type def_udtRIFF
'REFヘッダ
RiffTagH As String * 4
FileSize As Long
WaveTagH As String * 4
'fmtチャンク
fmtChank As String * 4
fmtChSiz As Long
'WAVEフォーマット
FormatId As Integer
ChanelCt As Integer
SamplRat As Long
DataSped As Long
BlockSiz As Integer
SamplBit As Integer
'Dataチャンク
DatTagH As String * 4
DataSize As Long
End Type
Public Type def_udtWaveTagH
RIFF As def_udtRIFF
End Type
'*** 音階(ドレミファソラシド)を作成 ***
Public Sub Main()
Dim wWavHead As def_udtWaveTagH, iix As Long
Dim wOtFlNo As Integer, wOtFlNa As String
Dim wWavData As Byte, wByouSu As Long
'*** 初期設定 ***
With wWavHead.RIFF
.RiffTagH = "RIFF"
'.FileSize = 0
.WaveTagH = "WAVE"
.fmtChank = "fmt "
.fmtChSiz = &H10
.FormatId = 1
.ChanelCt = 2
.SamplRat = 44100
.DataSped = 176400
.BlockSiz = 4
.SamplBit = 16
.DatTagH = "data"
'.DataSize = 10
End With
'*** WAVファイル出力 ***
wOtFlNo = FreeFile()
wOtFlNa = "D:\Gomi\hogehoge.wav"
On Error Resume Next
Kill wOtFlNa
On Error GoTo ErSyori
Open wOtFlNa For Binary Access Write As wOtFlNo
On Error GoTo ErSyor2
'データサイズ 波形データのバイト数
wByouSu = 5 '秒数
wWavHead.RIFF.DataSize = 44100 * 4 * wByouSu
'ファイルサイズ フルサイズ-8
wWavHead.RIFF.FileSize = 44 + wWavHead.RIFF.DataSize - 8
'ebug.Print "ファイルサイズ " & wWavHead.RIFF.FileSize + 8
Put wOtFlNo, , wWavHead 'ヘッダ出力
Dim wRaNoOt As Double, wLen As Long, wValueVa As Double
wRaNoOt = 440 'ラの音
wLen = wWavHead.RIFF.SamplRat / wRaNoOt
For iix = 1 To wWavHead.RIFF.DataSize 'wWavHead.RIFF.SamplRat * 2
If iix <= wWavHead.RIFF.DataSize * (1 / 16) Then
wValueVa = Sin(2 * gPaiRad * iix * 261.6 / 44100) '0:ド
ElseIf iix <= wWavHead.RIFF.DataSize * (2 / 16) Then
wValueVa = Sin(2 * gPaiRad * iix * 277.2 / 44100) '1:ド#
ElseIf iix <= wWavHead.RIFF.DataSize * (3 / 16) Then
wValueVa = Sin(2 * gPaiRad * iix * 293.7 / 44100) '2:レ
'文字数制限で省略
ElseIf iix <= wWavHead.RIFF.DataSize * (14 / 16) Then
wValueVa = Sin(2 * gPaiRad * iix * 554.4 / 44100) 'D:ド#
ElseIf iix <= wWavHead.RIFF.DataSize * (15 / 16) Then
wValueVa = Sin(2 * gPaiRad * iix * 587.4 / 44100) 'E:レ
Else
wValueVa = Sin(2 * gPaiRad * iix * 622.3 / 44100) 'F:レ#
End If
If wValueVa > 0 Then
wWavData = wValueVa * 255
Else
wWavData = wValueVa * -255
End If
'wWavData = iix Mod 256 '128:中心(振幅なし) ノコギリデータ
Put wOtFlNo, , wWavData
Next
Close wOtFlNo
Exit Sub
ErSyori:
MsgBox "ここで止まる時はメディアプレーヤーで該当のファイルを開いている時です"
Exit Sub
ErSyor2:
Stop '調査されたし
MsgBox Err.Number & " " & Err.Description
Resume
End Sub
No.3ベストアンサー
- 回答日時:
波形データの周波数を求めるには高速フーリエ変換(FFT)が常道です。
FFTのプログラムは自分で書いてもよいですが、探せば専用のライブラリがあるでしょう。
データを一定の区間に区切ってFFTをかければそこに含まれる周波数成分が分かります。
適当な窓関数をかけたほうが良いですが、分からなければ無くてもとりあえずは動くでしょう。
ただ、ノコギリ波はやめた方がいいです。倍音成分が多いですので。
倍音を含まない正弦波がおすすめです。面倒なら三角波は幾分ましです。
あとはシリアル通信には同期の問題がありますが、まあいきなり色々言っても分からないと思いますのでとりあえずやってみると気づくと思います。
また些細な事ですが周波数はドド#レレ#ミ…とするより、一定間隔の周波数にした方がよいと思います。
回答ありがとうとざいます。
高速フーリエ変換、ノコギリ波より正弦波がおすすめ。
新しい単語でかなり技術的な敷居が高いのですが、よい課題になりそうです。
色々探して見ます。貴重なご意見ありがとうございました。
No.4
- 回答日時:
ずいぶん手間なことをするんですね。
ダイヤルトーンを使うわけには行きませんか。DTMFを使えば1音で4ビットのデータが構成でき、4ビットのデータを簡単に(1個のICで)音声化も元のデータへの復元も可能です。音響カプラと同じ方式ですね。あるいは9,600baudのモデムを使ってデータ/音声の変換をするとか。
キーワードDTMFで調べて見ました。プッシュ音を使うわけですね。ちょっと敷居が高いのですが、変調/復調をするソフトについて調べてみようと思います。
この手法でプログラミングできるか検討してみます。
情報提供ありがとうございました。
No.2
- 回答日時:
>ボイスレコーダーをイヤホンジャックに挿して録音して持ち帰ります
なるほど。それなら、技術的に安定していた、
カンサスシティスタンダードを参考にされたらよいと思います。
https://ja.wikipedia.org/wiki/カンサスシティスタンダード
https://ja.wikipedia.org/wiki/データレコーダ
なお、カンサスシティスタンダードは300BPSですから、ボイスレコーダが32KBPSのラジオレベルの音質で記録するとして、100倍の容量が必要になります。
回答ありがとうとざいます。
色々探してサッポロシティースタンダードに行き着きましたが、
サンプルコーディングが見当たらず、かろうじて見つけたものも、
サイン関数を使ってパイ(3.14)で周波数を計算していました。
少し敷居が高かったので質問した次第です。
ラジオレベルの音質で100倍の容量と言われるように、
私の試算でも1メガバイトを音で録音するのに1時間以上必要との結論になりました。
それ以前にプログラミング手法とアルゴリズムに格闘することになりそうです。
とても参考になりました。貴重なご意見ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
C言語の質問です。バイナリ形...
-
エクセルVBA 2千万行のCSVファ...
-
VBA バイナリ―から文字列にす...
-
JavaScriptの実行速度が遅い
-
ページ読み込み時に自動的にsub...
-
FTPを使わないファイルアップロ...
-
デバイスファイルに書き込むこと
-
EXCEL VBAでテキストファイルの...
-
COBOL で組まれたシステムのデ...
-
C言語でBMPファイルの内容を表...
-
バッファサイズについて
-
リストビュー ⇔ 別ファイル構...
-
VBAを使って、一部バイナリデー...
-
ファイルを音声で持ち帰りたい
-
EOF
-
EXCEL VBAで、バイナリデータの...
-
バイナリファイルの比較につい...
-
BMP画像の画像データ本体をテキ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
エラー:ストリームの終わりを...
-
ページ読み込み時に自動的にsub...
-
VBA バイナリ―から文字列にす...
-
EOF
-
入力ファイルをバイナリにする利点
-
EXCEL VBAでテキストファイルの...
-
【python】Excelファイルを読み...
-
MacからWinにファイルを添付す...
-
関数の容量を知るには?
-
= (イコール)で始まるセルの値...
-
EXCEL VBAで、バイナリデータの...
-
BMP画像の画像データ本体をテキ...
-
VC++2010でmecabを使いたい
-
C言語とシリアル通信の送受信...
-
ファイルをダウンロードして展...
-
バイナリーデータの一部データ...
-
wave形式(*.wav)のフォーマット...
-
デバイスファイルに書き込むこと
おすすめ情報
ボイスレコーダーをイヤホンジャックに挿して録音して持ち帰ります。