質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • C

    3956questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • VB

    311questions

    VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

wavファイルの波形表示

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,322

nnahito

score 1759

wavファイルの勉強がてら、プログラムを書いています。

wavファイルを読み込んで波形を表示したいのですが、どうも速度が遅すぎます。
約30秒ほどのwavファイルが、1~2分かかってしまいます。
最適な読み込み方法はあるのでしょうか。
言語は「C言語」とさせてください。(本当は違いますが、タグになかったので……)

現在利用しているアルゴリズムは、以下のサイト様のものを利用しています。
ActiveBasic講座様
For n=0 To wh.pcmbytes/2
    描画処理
Next
おそらくこの部分で時間を食っていますが、
最適な読み込み方法はあるのでしょうか?
Audacityなどでは一瞬で読み込まれるので……

ご存知の片、いらっしゃいましたらご教授ください。
よろしくお願いいたします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

VBで波形データを扱ったことがないのでなんともいえませんが、pcmbytesの値はどうなっていますか?
これが例えば16bitステレオの場合の4bytesを指しているなら、毎回ディスクに4バイト読み込むように指示しているので、かなりのオーバーヘッドになります。

最低でも数キロバイトずつメモリに読み込んで、そこから波形データを取得するような形にするのがよろしかと思います。
以下、オレオレ言語記述ですが、ロジック的にはご理解いただけるかと存じます。

FileStream fileStream = FileStream.open('test.dat');
Buffer buffer = new Buffer(4096);
while (fileStream.read(buffer, 4096)>0){
  for (int i=0; i<buffer.count; i++){
    byte data = buffer.get(i);
    //do something for data
  }
}
fileStream.close();

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/19 01:26

    ご回答有難うございます。
    メモリにデータはすでに格納しています。
    その後の描画処理で、動作が遅いので苦労しております…

    また、申し訳ありませんが、当方、Javaが大の苦手で全くわかりませんでした…

    キャンセル

  • 2015/03/19 14:55

    既にファイルをバッファリングしておられるのでしたら、読みこみ方法については問題無いかと存じます。
    恐らく、描画方法に問題があるのではないでしょうか。
    具体的な描画コードを掲載すれば、どなたか回答してくださるかもしれません。

    一般的な話をすれば、描画する時に、言語で用意されている線を引いたりするメソッドを使うのでは無く、描画領域のビットマップのメモリデータを直接書き換えるような方法がよくある高速化の手法です。

    キャンセル

  • 2015/03/19 17:03

    ご回答有難うございます!
    DCをメモリDCに先に描画すると、高速化出来ました!
    ありがとうございました!!

    キャンセル

同じタグがついた質問を見る

  • C

    3956questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • VB

    311questions

    VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。