• ベストアンサー

MIXERCONTROL.dwControlTypeの値について

今、WindowAPIを用いてCDの音楽のVolumeを拾ってこようと考えています。MIXERCONTROL.dwControlTypeの値がMIXERCONTROL_CONTROLTYPE_VOLUMEというのはとってこれたのですが、どうもこれはマスター音量(windowsでボリュームコントロールで設定する大きさ)のようで、音楽の音に反応して値が変化しません。自分としてはイコライザのように音楽の音量に反応するものを作りたいと考えているのですが、音に反応するMIXERCONTROL.dwControlTypeの値をどれにしたらいいのか判りません。わかる方は教えてください。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

mmioXxxを使用するということは、既に.wavファイルがあって、その中に記録されている音の音量を求めたい、ということですね? mmioXxxはもう10年近くも使ってないのですが、確かこんな感じでよかったかと思います。(Visual C++ .NETに付属のヘルプからの切り貼りです。)   HMMIO hmmio = mmioOpen(szFileName, NULL, MMIO_READ | MMIO_ALLOCBUF);   MMCKINFO mmckinfoParent;   mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E');   mmioDescend(hmmio, &mmckinfoParent, NULL, MMIO_FINDRIFF);   MMCKINFO mmckinfoSubchunk;   mmckinfoSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a');   mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK);   DWORD dwDataSize = mmckinfoSubchunk.cksize;   HPSTR pData = new char[dwDataSize];   mmioRead(hmmio, pData, dwDataSize);   // do whatever here   delete [] pData;   mmioClose(hmmio, 0); 「// do whatever here」の時点でpDataに.wavの音のデータが入っているので、これを適当に処理(音量を調べる等)してください。 この例では.wavの音のデータを一度に全部読み込もうとしていますが、.wavのサイズが大きい場合は少しずつ読み込んで処理する等、いろいろ工夫が必要になると思います。 なお、コンパイルエラーにはならないことを確認していますが、動作については全く確認していません。

garnetcrow
質問者

補足

xcrOSgS2wY さんありがとうございます。また、質問ですが、この方法で行うと、リアルタイムの音の大きさのデータって取得できますか?音楽を聴きながら、その時の音の大きさをバーで表したいので、それが可能かどうか、教えてください。 あと、貼り付けてコンパイルすると以下のようなエラーが出てしまいます。 error C2275: 'HMMIO' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。 c:\program files\microsoft visual studio\vc98\include\mmsystem.h(2290) : 'HMMIO' の宣言を確認してください。 これの回避の仕方も教えていただければ幸いです。力量不足で聞いてばかりではいけないことは判っていますが、お願いします。

その他の回答 (1)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

アンプやラジカセに、回せば音量の変わるツマミが付いてますよね(最近はボタンでしか音量が変わらないのもありますけど)。あのツマミが、Windows APIで言うところの「ボリューム」(Volume)です。アンプやラジカセのボリュームは、聞いている音楽の音の大きさによって勝手に変化したりしません。同じように、Windows APIで言うところの「ボリューム」も、聞いている音楽の音の大きさによって自動的に変化することはありません。 質問者さんが取得したいと思っている「音量」とは、音楽の音の大きさのことではないでしょうか。だとすると、その「音の大きさ」はwaveInXxx関数を使って「録音」し、録音した音楽の波形データの数値を調べて測定する必要があります。 あるいは、CD音楽の場合はリッピングしてwavファイルにし、そのwavファイルの内容(音楽の波形データ)の数値を調べて測定する方法もあります。(なお、リッピングの方法についての質問・回答はOKWebや教えてGooでは禁止事項となっているため、ここでは説明しません。説明すると削除されてしまいます。) wavファイルから波形データを取得するのには、mmioXxx関数が使えます。

garnetcrow
質問者

補足

xcrOSgS2wYさんありがとうございました。あつかましいですが、mmioXXX関数を使うための前準備の手順を教えていただけませんか?わかりにくい日本語ですいませんが、つまりは、 例) (1)mmioOpenを使う。 (2)mmioReadで読み取る などの情報をいただければ幸いです。仕事で使うつもりなのですが自分の力量不足のためぜんぜん前に進まず困っています。助けてください。お願いします。

関連するQ&A