重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

<ファイルを音声で持ち帰りたい>
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.1の回答に寄せられた補足コメントです。 補足日時:2016/02/15 22:41

A 回答 (4件)

波形データの周波数を求めるには高速フーリエ変換(FFT)が常道です。


FFTのプログラムは自分で書いてもよいですが、探せば専用のライブラリがあるでしょう。
データを一定の区間に区切ってFFTをかければそこに含まれる周波数成分が分かります。
適当な窓関数をかけたほうが良いですが、分からなければ無くてもとりあえずは動くでしょう。
ただ、ノコギリ波はやめた方がいいです。倍音成分が多いですので。
倍音を含まない正弦波がおすすめです。面倒なら三角波は幾分ましです。

あとはシリアル通信には同期の問題がありますが、まあいきなり色々言っても分からないと思いますのでとりあえずやってみると気づくと思います。
また些細な事ですが周波数はドド#レレ#ミ…とするより、一定間隔の周波数にした方がよいと思います。
    • good
    • 1
この回答へのお礼

回答ありがとうとざいます。
高速フーリエ変換、ノコギリ波より正弦波がおすすめ。
新しい単語でかなり技術的な敷居が高いのですが、よい課題になりそうです。
色々探して見ます。貴重なご意見ありがとうございました。

お礼日時:2016/02/17 20:05

ずいぶん手間なことをするんですね。

ダイヤルトーンを使うわけには行きませんか。DTMFを使えば1音で4ビットのデータが構成でき、4ビットのデータを簡単に(1個のICで)音声化も元のデータへの復元も可能です。音響カプラと同じ方式ですね。
あるいは9,600baudのモデムを使ってデータ/音声の変換をするとか。
    • good
    • 1
この回答へのお礼

キーワードDTMFで調べて見ました。プッシュ音を使うわけですね。ちょっと敷居が高いのですが、変調/復調をするソフトについて調べてみようと思います。
この手法でプログラミングできるか検討してみます。
情報提供ありがとうございました。

お礼日時:2016/02/18 22:49

>ボイスレコーダーをイヤホンジャックに挿して録音して持ち帰ります


なるほど。それなら、技術的に安定していた、
カンサスシティスタンダードを参考にされたらよいと思います。
https://ja.wikipedia.org/wiki/カンサスシティスタンダード
https://ja.wikipedia.org/wiki/データレコーダ

なお、カンサスシティスタンダードは300BPSですから、ボイスレコーダが32KBPSのラジオレベルの音質で記録するとして、100倍の容量が必要になります。
    • good
    • 0
この回答へのお礼

回答ありがとうとざいます。
色々探してサッポロシティースタンダードに行き着きましたが、
サンプルコーディングが見当たらず、かろうじて見つけたものも、
サイン関数を使ってパイ(3.14)で周波数を計算していました。
少し敷居が高かったので質問した次第です。

ラジオレベルの音質で100倍の容量と言われるように、
私の試算でも1メガバイトを音で録音するのに1時間以上必要との結論になりました。
それ以前にプログラミング手法とアルゴリズムに格闘することになりそうです。
とても参考になりました。貴重なご意見ありがとうございました。

お礼日時:2016/02/17 19:58

で、どーやって持ち帰るんですか?



やっぱりUSBメモリーが必要では?
まあ、CDに焼いてもいいけど
この回答への補足あり
    • good
    • 0
この回答へのお礼

イヤホンジャックにボイスレコーダーを挿して録音です。
ボイスレコーダーのファイルを解析します。

お礼日時:2016/02/14 19:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!