VB2008を使い始めたばかりの初心者です。
以下のようなプログラム(一部省略)で、ちょうど下から5行目くらいの
「右CHを最大個数まで読む」の行がエラーがでてしまいます。すぐ上の「左CHを最大個数まで読む」ではエラーはでません。
原因が分からないため、教えてください!!
WAVEファイルを読み込むプログラムです。
最大数を3000として考えています。
WAVEファイルは音声ファイルで、構成は以下のようになっています。
RIFF:4バイト
サイズ:4バイト
WAVE:4バイト
fmt:4バイト
fmtチャンクのデータ:20バイト←上の12バイトは読まなくて良いため、hdp=13としてここから読みはじめています
data:4バイト
dataサイズ:4バイト
dataチャンクのデータ:ここが読み取りたい音声にあたるデータ
また、WAVEファイルはステレオで、2チャンネルあり、実際の音データは(dataチャンクのデータ)左、右・・・と交互に入っています。
----------------------------------------------------------------------
Const WD As Short = 30000 '最大のデータ数30000
Private l_wave(WD) As Integer '左チャンネルのデータ配列
Private r_wave(WD) As Integer '右チャンネルのデータ配列
Private dmax As Integer 'データ数の最大値
Private filename As String 'ファイル名
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
'-------ファイルを開く-------------------------------------------------
OpenFileDialog1.Filter = "waveファイル(*.wav)|*.wav"
If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
filename = OpenFileDialog1.FileName
Else
Exit Sub
End If
'----------------------------------------------------------------------
Dim hID As New VB6.FixedLengthString(4) 'チャンクID、4文字分
Dim hdsize As Integer 'チャンクサイズ
Dim hdp As Integer 'ポインタ=チャンクの位置
Dim fsize As Integer
Dim i As Object
dmax = WD '最大データ個数
fsize = FileLen(filename) 'ファイルサイズの取得
hdp = 13 'fmtチャンクの位置
FileOpen(1, filename, OpenMode.Binary) 'ファイルをバイナリモードで開く
'****************ファイルの終わりまで繰り返す***********************************
Do Until hdp >= fsize
FileGet(1, hID.Value, hdp) 'チャンクHIDの種類の取得
FileGet(1, hdsize) 'チャンクのサイズの取得
'------チャンクIDがfmtならその位置をIntegerで返す---------------------
If InStr(hID.Value, "fmt") Then
TextBox1.Text = hID.Value
FileGet(1, wavfmt)
End If
'---------------------------------------------------------------------
'------チャンクIDがdataならその位置をIntegerで返す---------------------
If InStr(hID.Value, "data") Then
TextBox1.Text = TextBox1.Text & vbCrLf & hID.Value
For i = 0 To 10
FileGet(1, l_wave(i)) '左chデータを最大個数まで読む
FileGet(1, r_wave(i)) '右chデータを最大個数まで読む ***エラー箇所***
Next
End If
'-----------------------------------------------------------------------
hdp = hdp + hdsize + 8 '次のチャンクへ8バイトポインタ移動
Loop
'********************************************************************************
No.1ベストアンサー
- 回答日時:
Do ... Loop の設置方法がおかしいのでは ・・・
wavFmtまで読み込んだ後にDOループになるのでは ・・・
If hID.Value = "fmt " Then
TextBox1.Text = hID.Value
if hdsize< 16 then
MsgBox "no PCM DATA"
Exit Sub
end if
FileGet(1, wavfmt)
End If
dim ChSize as integer
dim dummy as byte
FileGet( 1, hID.Value )
FileGet( 1, ChSize )
Try
do while hID.value <> "data"
for n as integer = 1 to ChSize
FileGet(1,dummy)
next
FileGet( 1, hID.Value )
FileGet( 1, ChSize )
Loop
for i = 1 to ChSize step 2
FileGet( 1, l_wave(i))
FileGet( 1, r_wave(i))
next
Catch ex Exception
End Try
FileClose(1)
といった具合なのでは ・・・
本当です!Do Loopを変えたらできました!!ありがとうございます!
あとお聞きしたいのですが、FileGet(1,dummy)とは、一度退避させるようなものですか?必ず必要なのでしょうか?
あまり分からず、使わせていただきましたので・・・
ぜひご回答おねがいします!!
ちなみに下から7行目が「For i = 0 To 10」じゃなくて、「For i = 0 To dmax-1」でしたね、すみません。テスト用に変更していました。
No.2
- 回答日時:
do while hID.value <> "data"
for n as integer = 1 to ChSize
FileGet(1,dummy)
next
FileGet( 1, hID.Value )
FileGet( 1, ChSize )
Loop
の部分の FileGet(1,dummy)ということでしょうか?
これは退避というより読み捨てです
今回取得したチャンクのシグネッチャーが『data』以外だったのでその長さ分読み捨てて次のチャンクを読み込むといった処理をしています
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
このQ&Aを見た人はこんなQ&Aも見ています
-
賃貸で可能な古民家風レトロな部屋作りのコツ!改めて知る畳の高い機能性と魅力も紹介
畳の部屋を雰囲気のよい部屋に仕上げたい!賃貸住宅でもできる古民家風のレトロな部屋作りのコツを伺った。
-
拡張子はなぜ、大文字と小文字のものがある?
Windows Vista・XP
-
Shapeコントロールの.NET移行方法
Visual Basic(VBA)
-
VB.NETにて、構造体へデータをセットするにはどうすればよいですか?
Visual Basic(VBA)
-
-
4
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
5
C# 固定長ファイルの取得 FileGet
C言語・C++・C#
-
6
FileOpen 関数で既にファイルが開かれている場合
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
エラー:ストリームの終わりを...
-
EXCEL VBAでテキストファイルの...
-
ページ読み込み時に自動的にsub...
-
VBA バイナリ―から文字列にす...
-
機器とRS232Cクロスケーブルで...
-
C++ Builderにおける画像データ...
-
c言語についての質問です
-
入力ファイルをバイナリにする利点
-
24ビットのWaveデータの中身に...
-
FTPでエクセルをPUTするとファ...
-
Microsoft VBAで2GBを超えるフ...
-
エクセルVBA 2千万行のCSVファ...
-
PHPのfgetcsvの処理容量について
-
= (イコール)で始まるセルの値...
-
EOF
-
バイナリエディタのつかいかた
-
C言語で、ファイルを読み込んで...
-
ダンプツール作成… 行き詰まり...
-
VBでCSVファイルを読み込む方法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
EXCEL VBAでテキストファイルの...
-
バイナリエディタのつかいかた
-
ページ読み込み時に自動的にsub...
-
VBA バイナリ―から文字列にす...
-
エクセルVBA 2千万行のCSVファ...
-
エラー:ストリームの終わりを...
-
EOF
-
【python】Excelファイルを読み...
-
EXCEL VBAで、バイナリデータの...
-
入力ファイルをバイナリにする利点
-
DXFファイル用クラスライブラリ...
-
バイナリーデータの一部データ...
-
C言語とシリアル通信の送受信...
-
C言語の質問です。バイナリ形...
-
Javaでのエンディアン変換
-
24ビットのWaveデータの中身に...
-
bitmap画像の保存がうまくいき...
-
PHPのfgetcsvの処理容量について
おすすめ情報