• 締切済み

再生音声の音量を変更する関数を教えてください.

みなさんこんにちは. 今,VisualStudio.Net2005を使って簡易な音声再生ソフトを作ろうと考えております. PlaySound( L"soundfilename.wav", NULL, (int)(SND_ASYNC | SND_FILENAME)); の関数で引数の音声ファイルを再生することまではできましたが,再生中の音声のボリュームを変更する方法が分かりません. どなたか,再生中の音声のボリュームを変更する方法や関数を知っているかたがいらっしゃたら教えていただきたく存じ上げます. 何卒よろしくお願いいたします.

みんなの回答

回答No.3

> mixer, mimio のAPIを一度詳しく調べてみようと思います. 揚げ足取りのようで失礼ですが一応「mimio」ではなく「mmio」です。恐らくMulti Media Input Output の略だと思います。 参考までに、wave系関数は一番古いタイプの音声入出力です。それ以外に DirectSound系関数や、Windows Vista以降でしか使えませんがCore Audio APIというのもあります。仕事でやっているリアルタイム音声処理だと結構シビアな問題があるのですが、効果音再生でそんなに違わないかと思います。 とは言え、wave系関数が一番参考文献やネット情報が多いので、新しく始めるには適しているかと思います。 > 再度質問事項が出るかもしれませんが,もし, >ご回答可能でしたらまたよろしくお願いいたします. ここは半年ぶりぐらいに来たのですが、しばらくウォッチする事にします。 が、私がいなくても私なんかよりよっぽど凄い人が多いのでそういう諸先輩方が回答して下さる事でしょう。

回答No.2

方法はおおまかに2通りあるかと思います。 1つはNo.1の方が書いていらっしゃいますように、mixer* 系のAPIを使ってミキサーのマスターボリュームまたは、WAVEのボリュームを制御してしまう方法です。 この方法ならばあらゆる再生音の音量を一挙に!制御できますが、ミキサーの設定を変えてしまうと他のアプリの音量まで変わってしまいます。そのため、起動時の音量を記憶して終了時に戻したりとか、終了時の音量を記憶して次回起動時に復活したりとかの工夫もありますが、アプリ起動中にユーザが別の目的で変更した音量設定まで戻してしまったりと副作用も多く、使う立場からすると頭の痛くなる状況です。 が、世の中の多くのアプリがこの方法で音量を制御しているためか、Windows Vistaでは業を煮やしたMicrosoft社が、mixer*系APIの「マスターボリューム」で制御した音量は、実際のマスターボリュームじゃなくて、アプリケーション毎に新設された仮想マスターボリュームを制御する事によって、このややこしい状況を解消しようとしています。 なので、あまりお勧めの方法ではありません。 もう1つは、mmio* 系のAPIを使って WAV ファイルのPCMデータをそのままメモリに読み込んで、waveOut* 系APIを使って再生するという方法でPlaySound()と同様の機能を組んで、PCMデータを読み込んだところで、8ビットデータなら128を引いてから倍率をかけて再び128を加え0~255でクリッピング、16ビットデータならそのまま倍率をかけて-32768~+32767でクリッピングしてからバッファに書き込んで、waveOut*系APIに渡します。 1倍以上の倍率にすると音が歪む可能性があるのが欠点です。なので、音量が大きめのWAVを用意しておき主に倍率は0~1の範囲で使うようにします。 この方法は WinAmp や Windows Media Player のアプリケーションボリュームに使われている方法で、使う立場からするとミキサーの値が勝手に変わったりしないので使いやすいものです。 ただし、WAV以外の形式のファイルを再生しようとすると、デコーダを持ってきて組み込むなど非常に大変な話になってしまうのでWAV限定の効果音などの再生に威力を発揮するものです。 仕事で開発した MyPlaySound() ってWAV再生用の関数は PlaySound() と同じように使えて音量や再生する音声デバイス繰り返し回数などを制御できるようにしたものでうまく動作しています。残念ながら著作権は会社にあるので勝手に出せませんが中身はここで書いたような形になっています。 以上、参考になればと思います。 具体的な関数の使い方は例えば「waveOutWrite」とか「waveOutOpen」などの関数名でネットで調べればわかるかと思います。

haribobear
質問者

お礼

どうもありがとうございます.mixer, mimio のAPIを一度詳しく調べてみようと思います.開発された関数の中身を解説していただけて,本当に感謝しております.音声に関する知識が乏しいため,再度質問事項が出るかもしれませんが,もし,ご回答可能でしたらまたよろしくお願いいたします.失礼いたします.

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★次のリンク先をどうぞ。 ・http://hp.vector.co.jp/authors/VA016117/mixer1.html→『ミキサー その1(音量の調節)』  http://hp.vector.co.jp/authors/VA016117/mixer2.html→『ミキサー その2(ミュート)』  http://hp.vector.co.jp/authors/VA016117/mixer3.html→『ミキサー その3(多チャンネル対応化)』  あまり詳しくないですが参考になればと思い書き込みました。 ・以上。

参考URL:
http://hp.vector.co.jp/authors/VA016117/index.html
haribobear
質問者

お礼

リンク先のご提供どうもありがとうございます. ご返信が遅くなってしまい,申し訳ありません. とりあえず,リンク先を熟読してみます.ミキサーが何のかを一度理解する必要があるかもしれません.

関連するQ&A

  • wavの連続再生ってどうやるの?

    WindowsでC++のプログラミングをやっています。 wavで3つの音楽ファイルを連続再生させたいのですがどうすればよいのでしょうか?? 1曲を1回再生なら PlaySound("c:\\01.wav",NULL,SND_FILENAME | SND_ASYNC | NULL ); で、できたのですが、3曲連続で再生させようとしても PlaySound("c:\\01.wav",NULL,SND_FILENAME | SND_ASYNC | NULL ); PlaySound("c:\\02.wav",NULL,SND_FILENAME | SND_ASYNC | NULL ); PlaySound("c:\\03.wav",NULL,SND_FILENAME | SND_ASYNC | NULL ); とすると03.wavだけが再生されてしまいます。 実際全部再生されているのでしょうけど前のが全部再生されないうちに次のが再生されてしまっているのだと思います。 01.wavが1曲全部再生してから02.wavを再生させるようにするにはどうすればよいのでしょうか。 どなたかよろしくお願いします><

  • PlaySoundでSND_SYNC(同期)させると途中で音楽が止まります、、

    現在、特定のフォルダにある音楽(.wav)ファイルを検索して、パスを受け取り、それを順々に再生する、簡単な音楽再生プレイヤーを作成しようと思っています。 そこで問題となっているのが、同期を取るSND_SYNCなのですが、通常なら音楽が終了するまで待機するはずなのですが、 http://social.msdn.microsoft.com/forums/ja-JP/vsgeneralja/thread/4795014f-c428-43f1-a6b8-2267f26cde81 こちらにもあるとおり、途中で止まり、次の曲が再生されます。 そしてその曲も途中で止まり・・が続きます。 ASYNCにすると最後まで再生されるのですが、一番最後の曲のみ再生になります。 一応、応急処置として、ASYNCを宣言し、_getch();にて一時待たせていますが、 どうにかならないものでしょうか、、。もしかしたら音楽ファイルのサイズの問題かもしれませんが・・。 とりあえず検索は正常動作しているので、playsoundを行う関数は、 void prays(char *fname) {    printf("%sを再生します。\n",fname);    char T[100];    sprintf(T,"wavfile\\%s",fname);    PlaySound(T, NULL, SND_FILENAME| SND_ASYNC |SND_NOSTOP );//    _getch();    return ; } 環境 OS:winXP コンパイラ=BCC55(PSDK) 言語=C(メイン)、C++、WIN32API 回答お願いします。。

  • VC++6.0で再生音量の調整

    現在、VC++6.0で音を出すプログラムを作ろうとしています。 playsoundを使って、wavファイルを再生することで音を出すことは出来ました。次に音量を自由にしたいですが、わかりません。最終的にはボリュームコントロールのように、スライダを使って音量を変更したいです。 できれば、DirectXを使いたくないです。ただ、他に方法がなければ、DirectXを使いたいと考えています。 ちょっとしたことでも教えて頂ければ嬉しいです。 よろしくお願いします。

  • VBで音声再生に関して

    ヘッダ情報のない16_khz,16_bitの音声ファイルをwavへの変換なしで直接取り出して 再生したいのですが、再生するAPIかなにかないでしょうか? メモリー上にバイト型配列でおきwavのヘッダ情報をつけ音声ファイルをくっつける という方法を考えついたのですが それだとPlaySound()APIではメモリー上から呼び出せず困っています。 wavファイルのヘッダ情報についてもわかりません。

  • 「Visual C++ 2008 Express」の「PlaySoun

    「Visual C++ 2008 Express」の「PlaySound」関数について。 サイコロゲームが完成したのでBGMを入れようと思い 「PlaySound」関数を使ったところエラーに沢山阻まれうまくいきません。 --作成した経路&環境&やりたいこと-- 「Windows フォームアプリケーション」→「ソリューションも作成」 DirectXなしで「wav」ファイルを読みこみたい。 動画を添付してますが一応コードを乗せときますね。 --------------------------------------------------------------- #pragma once //ここから追加 #pragma comment(lib,"winmm.lib") #include <stdio.h> #include <windows.h> #include <mmsystem.h> //ここまで追加 namespace WinFAPI_S {  ~~省略~~ (一番下の方まできて・・・) #pragma endregion //ここから追加 int main(){ PlaySound("霊夢テーマ2.wav",NULL, SND_FILENAME | SND_NOSTOP | SND_SYNC); } }; } ------------------------------------------------------------- これをビルドすると「\Form1.h(74) : error C2664: 'PlaySoundW' : 1 番目の引数を 'const char [16]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)」 というエラーがでてしまう困っております。 このエラーを解決するにはどうしたらよいでしょうか? またソースの書き方などが間違っているとか、アドバイスなどがございましたら言ってください。 それではよろしくお願いいたします。

  • メモリに読み込んだ音源のPlaySoundによる再生

    HANDLE fh,fh2; DWORD dummy,dummy2; case WM_CREATE: fh=CreateFile(TEXT("F:\\shot.wav"),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ fh2=CreateFile(TEXT("F:\\ENDING.WAV"),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ /* バッファ確保 */ lpSound = GlobalAlloc(GPTR,GetFileSize(fh,NULL)); lpSound2 = GlobalAlloc(GPTR,GetFileSize(fh2,NULL)); ReadFile(fh ,lpSound ,GetFileSize(fh ,NULL),&dummy ,NULL); /* 読み込み */ ReadFile(fh2,lpSound2,GetFileSize(fh2,NULL),&dummy2,NULL); /* 読み込み */ CloseHandle(fh); CloseHandle(fh2); として音源をメモリに読み込み、その後イベント発生時にPlaySound関数で音源をならしているのですが、 PlaySound(lpSound,NULL,SND_ASYNC|SND_MEMORY); 一番最初のイベント発生時に音源読み込みに時間が掛かり即座に鳴りません。次のイベント発生時は同時に鳴るのですが.... 一番最初から同時に鳴らすにはどのようにしたら良いでしょうか? 根本的にPlaySound関数では良くないのでしょうか? 御指導の程よろしくお願いします。

  • excelで音声再生時に並行して別の操作をしたい

    下記のようなプログラムで音声再生をしていますが、再生が全部終了するまで別の操作ができません。再生と並行してスクロールなど別の操作もできるようにするにはどのように書き換えればよいでしょうか? Declare Function PlaySound Lib "Winmm.dll" Alias "PlaySoundA" _ (ByVal pszSound As String, _ ByVal hmod As Long, _ ByVal fdwSound As Long) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Const SND_ASYNC = &H1& '再生後すぐに制御を戻す Public Const SND_SYNC = &H0& '再生が完了するまで制御を戻さない Sub C列再生() EN = Range("A65536").End(xlUp).Row For I = 2 To EN INF = ThisWorkbook.Path & "\ONSEI-n\" & Range("C" & I).Value & ".WAV" PlaySound INF, 0, SND_SYNC '再生が完了するまで制御を戻さない Sleep 1000 '1000mS待ち Next I End Sub Sub A列再生() EN = Range("A65536").End(xlUp).Row For I = 2 To EN INF = ThisWorkbook.Path & "\ONSEI\" & Range("A" & I).Value & ".WAV" PlaySound INF, 0, SND_SYNC '再生が完了するまで制御を戻さない Sleep 1000 '1000mS待ち Next I End Sub

  • WAVEの音量を個別に変更する方法

    みなさんこんにちは. 今,VisualStudio.Net2003を使ってWAVEの音量調節を可能にしたいです。 waveOut系の関数でWAVEデータを管理しているのですが、WAVEファイル一つだけに絞って音量調節したいのですが、よく分かりません。 waveOutsetVolumeだとマスターボリュームを弄るようなので殆どのアプリに影響がでてしまいます。 どなたか,再生中の音声のボリュームを変更する方法や関数を知っているかたがいらっしゃたら教えていただきたく存じ上げます. 何卒よろしくお願いいたします.

  • C#での音声再生について

    音声再生についての質問です。 ↓のページにある「メモリ内のWAVEデータを非同期再生する際の不具合について」を参考にして、PlaySound関数を利用してWAVEファイルを再生しようとしています。 http://dobon.net/vb/dotnet/programing/playembeddedwave.html ただし、この方法を使用して、一つ目の音声ファイルを再生中にもう一つの音声ファイルを再生しようとすると、最初に再生していた音声が中断されてしまいます。 複数の音声ファイルを同時に再生する(音が重なって再生されるようにする)には、どうすればよいのでしょうか。 よろしくお願いします。

  • excelのマクロで音声の停止と再生

    excelのマクロでいくつかのwavファイルを音声再生途中で一時停止と、その途中からの音声再生はどのようにすればよいのでしょうか? Declare Function PlaySound Lib "Winmm.dll" Alias "PlaySoundA" _ (ByVal pszSound As String, _ ByVal hmod As Long, _ ByVal fdwSound As Long) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Const SND_ASYNC = &H1& '再生後すぐに制御を戻す Public Const SND_SYNC = &H0& '再生が完了するまで制御を戻さない Private Function MusicLength(ByVal FilePath As String) As Date Dim oSH As Object, oFS As Object, oFLD As Object, oF As Object Dim sT As Date Set oSH = CreateObject("Shell.Application") Set oFS = CreateObject("Scripting.FileSystemObject") Set oF = oFS.getfile(FilePath) Set oFLD = oSH.Namespace(oF.ParentFolder.Path) sT = CDate(oFLD.GetDetailsOf(oFLD.ParseName(oF.Name), 27)) MusicLength = sT + #12:00:01 AM# End Function Sub A列再生() Dim En As Long, i As Long Dim INF As String Dim ML As Date, sT As Date En = Range("A65536").End(xlUp).Row For i = 2 To En INF = ThisWorkbook.Path & "\ONSEI\" & Range("A" & i).Value & ".WAV" ML = MusicLength(INF) PlaySound INF, 0, SND_ASYNC ' sT = Now Do Until Now > sT + ML Sleep 100

専門家に質問してみよう