Visual C++でwavとmp3を同時に鳴らす方法
BGMとサウンドエフェクト(SE)を同時に鳴らす目的なら,
おそらく最も簡単かつ簡潔な方法を紹介しておきます。
※遅延とか細かいことを気にする人は,他のやり方を調べてください。

本当はBGM・SE両方ともwavの方が楽なのですが,
BGMはwavだと容量が大きくなりがちなので,mp3にします。
※wavでいいならwavでも下記方法で問題ないです。
逆にSEは1秒前後のものが多いので,wavで。

使うのはsndPlaySoundとmciSendStringの2つです。
sndPlaySoundでmp3を扱うためには,特殊な処理が必要なので,
こちらをSE(wav)にして,mciSendStringでBGM(mp3)を
扱うことにします。
両方mp3にしたければ,両方mciSendStringにすれば出来ると思いますが,
コードが少し面倒なので今回は避けます。

以下,コード例です。
<ヘッダ>
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
※<>大文字になってるけど,小文字で書いてください。
※順番違うとエラーが出たりします。

<sndPlaySoundで,wavを1回だけ再生する方法>
sndPlaySoundは基本1文でOK。
sndPlaySound(L"SE01.wav",SND_ASYNC);
ループ再生したいなら,以下のように。
sndPlaySound(L"SE01.wav",SND_ASYNC + SND_LOOP);
SND_ASYNCは,演奏開始後に制御を戻すのに必要です。

<mciSendStringで,前の曲を止めて,はじめからループ再生する方法>
mciSendString(L"open BGM01.mp3 type mpegvideo alias BGM01",NULL,0,NULL);
mciSendString(L"stop all",NULL,0,NULL);
mciSendString(L"play BGM01 from 0 repeat",NULL,0,NULL);
※openはcloseしない限り,1回だけ書けば何回でも再生可能。
※stopで止めないと前の曲も同時に鳴ってしまう。
  一部だけ止めたいならstop BGM03のようにすればOK。
※『from 0 repeat』で『最初からはじめてループ』っていうのを長ったらしい
  コードで解説している所が多いけど,これで問題なく動きます。
※『from 0』がないと,次に再生したときに途中から再生されるようになってしまう。


以上が概要です。もの凄く短いですが,エラーが出る要素満載で,
なかなかシンプルに解説してるページが見つかりませんでした。
ちなみに自分が使ってるのはVisual Studio 2008 professionalですが,
比較的最近のVisual C++環境なら,だいたい問題ないと思います。
コメント
コメント
コメントの投稿
URL:
本文:
パスワード:
非公開コメント: 管理者にだけ表示を許可する
 
トラックバック
トラックバック URL
http://nobu31d.blog.fc2.com/tb.php/35-41001481
この記事にトラックバック:する(FC2ブログユーザー)
トラックバック