• ベストアンサー

wave音源の再生

現在Microsoft visual c++でプログラミングをしています。 wavファイルの再生をしたいのですが、 PlaySoundという関数を使って一応、再生はできたのですが この関数だと同時に1つの音しか出ない様なのです。 プログラム中で1曲BGMの様に常に流しておいて、その所々で効果音 が鳴る様にしたいのですが。。。 ご教授お願いします。

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

  • ベストアンサー
  • aho0xff
  • ベストアンサー率12% (218/1772)
回答No.2

えーーと、専門用語すっかり忘れてしまいましたが、基本的にwindowsAPIで *.wav ファイルを複数同時に鳴らすのは無理(のはず)です。 簡単な方法はDirectSoundを使用することです。 でなければ、自分で*.wavファイルをリアルタイムで合成するルーチンを 作成する必要があるはずです。

ta-yuki21
質問者

お礼

windowsAPIでは同時に鳴らすのはむりなのですか。 ありがとうございます。勉強になります。 勉強不足でDirectSoundと言うものも知らない それを調べさせていただきたいと思います。 ご回答ありがとうございました。

その他の回答 (1)

回答No.1

一般的かわかりませんが、効果音とBGM用のスレッドを作ってしまうのが分かりやすい気がしますが、どうでしょう?

ta-yuki21
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • 音楽ファイルを平行して再生するにはどうしたら?

    XPのVisualStudioでプログラムしています. あるBGMを流しながら効果音のような音楽を流すにはどうしたらいいのでしょうか. 単純に音楽再生ソフトとPlaySoundを並行すると音が鳴らないですよね. どうしたらいいのかわからず悩んでいます>< どなたか教えてください!

  • VBでのwavファイルの再生について

    実は今VB6を使ってゲームを作ってます。 wavファイルを再生させて音を出してるですが、少し困ったことがあります。使ってる関数はwin32APIのPlaySoundを使ってます。 普通に音を再生する分には問題ないのですが、非常に短い間隔で再生を繰り返すと音が鳴らなくなります。 再生時間0.07秒のwavファイルを再生し終わる前に、もう一度そのファイルを再生すると音が鳴らない。 PlaySoundの他にも音を再生するAPI関数があるようですけど、使い方が良く分かりません。 どうすればいいでしょうか? VB6で、OSはwindowsXP使ってます。

  • win32 mciについて

    WindowsVISTA 32bit にて Microsoft Visual C++ 2008を使い ゲームを作成しています。 mciSendCommandでBGMを鳴らし、PlaySoundで効果音を鳴らしています。 上記WindowsVISTA 32bitでは正常に動作しています。 ただ、Windows7 64bitで動作させると効果音が何度目かの再生の時に タイムラグが発生してwindowsも一時的に止まってしまいます。 このとき、BGMは鳴っていますが、タイムラグが解消しプログラムに 戻るとき一瞬BGMがとまります。 タイムラグの長さは0.5秒から3秒ほどで、頻度はすぐに発生することもあり、 数十回再生後に発生することもあります。 mciSendCommandはファイルからですが、 PlaySoundはファイルからでも、メモリからでも症状は同じです。 リソースはまだためしてはいません。 また、 mciSendCommandを使ってBGMを2回以上ミキシングしても 何回目かの再生で同じ症状が出ますし、 BGMをメモリにおいてPlaySoundで鳴らし、効果音をmciSendCommandで ファイルから鳴らしても何度目かで同じ症状が出ます。 プログラム実行後にSleepやタイマーで2/100秒ほどのウェイトを入れると 少し軽減されるようですが症状は出ます。 64bitOSがMCIをサポートしないというのをネット上で見ましたが、 何か対処の方法はないでしょうか? どなたかご存知の方いらっしゃれば教えてください。

  • 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を再生させるようにするにはどうすればよいのでしょうか。 どなたかよろしくお願いします><

  • .mid が再生されません

    以前ハマっていたRPGツクール2000で作成されたゲームを久しぶりにやろうとしてみたら、効果音が鳴るのになぜかBGMがなりませんでした。 そこで調べたところ、効果音の拡張子は「.wav]で、BGMは「.mid」でした。 さらに、「.mid」はWindowsMediaPlayer9では再生しようとしても音が流れず、QuickTimeでは普通に再生できたのでファイルには異常は無いようです。 もちろん、「.wav」はメディアプレイヤーでも再生できます。 メディアプレイヤーが原因でしょうか? それともほかに原因があるのでしょうか? 初心者なので簡単なことかもしれませんが、BGMがないゲームはとてもツマランです。 どうか助けてください。

  • 【C#】wavファイルの複数同時再生

    プログラミング初心者です。 Visual C#で,wavファイルを複数,同時にループ再生するアプリケーションを作っています。 いろいろ調べた結果,複数のwavファイルを同時に再生するためにMicrosoft.DirectX.AudioVideoPlaybackを使用する必要があることが分かり,サイトのようにコーディングしたところ,複数のwavファイルを再生することができました。 (参考にしたサイト http://someprog.blog.fc2.com/blog-entry-4.html) しかしながら,これらのwavファイルをループ再生する方法がどうしても分かりません。PlayLoopingを試したところダメでした。このDirectXはループ再生できないのでしょうか? 分かる方いらっしゃいましたら,何とぞご教示ください。 【環境】 OS: Windows 7 Home Premium 32bit IDE: Microsoft Visual Studio 2012 for Windows Desktop

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

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

  • ツクール2000のBGMが再生されなくなりました。

    パソコン初心者です。 最近まで正常だったのですが・・ ツクール2000のフリーゲームのBGMが鳴らなくなってしまいました。 効果音は正常に再生されます。 (効果音)WAVファイルは正常に関連付けされているようなのですが、(BGM)MIDIシーケンスファイルが自動再生されません。フォルダを開いてMIDIシーケンスファイルをクリックすると音は再生されるのでファイルが壊れているわけではないと思います。ツクール2000を数回インストゥールし直しましたが効果がありません。 BGMがゲームプレイ中に自動再生されるよう、ご指導ください。

  • PCM同時再生をする方法 電子工作

    SDカードから取り出したWAVやMP3ファイルを再生する装置を考えています。 単純な1ファイルの再生はMP3デコーダーチップなどで実現しますが、2ファイル以上の同時再生(BGMが鳴りながら効果音を出す等)はどのようにして実現すればよいのでしょうか。 ご存じの方、ヒントだけでも教えていただければ幸いです。

  • メモリに読み込んだ音源の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関数では良くないのでしょうか? 御指導の程よろしくお願いします。

専門家に質問してみよう