music.cpp
1    #include "music.h"
2    #include "fps.h"
3    
4    //グローバル変数
5    Music titleBGM;	//タイトルBGM
6    Music playBGM;	//プレイBGM
7    Music resultBGM;	//リザルトBGM
8    //SE
9    Music buttonSE;	//ボタンSE
10   Music hitSE_01;	//ヒット時のSE
11   Music hitSE_02;	//ヒット時のSE
12   
13   //音楽の初期化(読み込み・ハンドル生成)
14   bool MusicInit()
15   {
16       //BGM
17       titleBGM = MusicLoad(MUSIC_PATH_TITLE_BGM, MUSIC_VOLUME_BGM, DX_PLAYTYPE_LOOP);
18       if (titleBGM.Handle == -1)
19       {
20           return false;
21       }
22   
23       playBGM = MusicLoad(MUSIC_PATH_PLAY_BGM, MUSIC_VOLUME_BGM, DX_PLAYTYPE_LOOP);
24       if (playBGM.Handle == -1)
25       {
26           return false;
27       }
28   
29       resultBGM = MusicLoad(MUSIC_PATH_RESULT_BGM, MUSIC_VOLUME_BGM, DX_PLAYTYPE_LOOP);
30       if (resultBGM.Handle == -1)
31       {
32           return false;
33       }
34   
35       //SE
36       buttonSE = MusicLoad(MUSIC_PATH_BUTTON_SE, MUSIC_VOLUME_SE, DX_PLAYTYPE_BACK);
37       if (buttonSE.Handle == -1)
38       {
39           return false;
40       }
41       hitSE_01 = MusicLoad(MUSIC_PATH_Hit_SE_01, MUSIC_VOLUME_SE, DX_PLAYTYPE_BACK);
42       if (hitSE_01.Handle == -1)
43       {
44           return false;
45       }
46       hitSE_02 = MusicLoad(MUSIC_PATH_Hit_SE_02, MUSIC_VOLUME_SE, DX_PLAYTYPE_BACK);
47       if (hitSE_02.Handle == -1)
48       {
49           return false;
50       }
51       
52       return true;
53   }
54   
55   //音楽の終了
56   void MusicEnd()
57   {
58       MusicDelete(titleBGM);
59       MusicDelete(playBGM);
60       MusicDelete(resultBGM);
61       MusicDelete(buttonSE);
62       MusicDelete(hitSE_01);
63       MusicDelete(hitSE_02);
64   }
65   
66   /// 音楽の読み込みエラーメッセージ
67   /// @param path ファイルのパス
68   void MusicLoadErrMessage(const char* path)
69   {
70       //エラーメッセージ用文字列
71       char ErrStr[MUSIC_ERR_STR_MAX];
72   
73       //エラーメッセージ用文字列の内容を空にする
74       for (int i = 0; i < MUSIC_ERR_STR_MAX; i++)
75       {
76           ErrStr[i] = '\0';
77       }
78   
79       //エラーメッセージ内容を連結して生成
80       sprintf_s(ErrStr, sizeof(ErrStr), "%s%s", path, MUSIC_LOAD_ERR_CAP);
81   
82       //エラーメッセージ表示
83       MessageBox(
84           GetMainWindowHandle(),    //ウィンドウのハンドル
85           ErrStr,                   //エラーメッセージ
86           MUSIC_LOAD_ERR_TITLE,     //エラータイトル
87           MB_OK);              //OKボタンのみ
88       
89   }
90   
91   /// 音楽の読み込み
92   /// @param path ファイルのパス
93   /// @param volume 音量
94   /// @param playType 再生タイプ
95   Music MusicLoad(const char* path, int volume, int playType)
96   {
97       Music music;
98       //ファイルの場所をコピー
99       strcpy_s(music.Path, sizeof(music.Path), path);
100  
101      //音楽をメモリに読み込む
102      music.Handle = LoadSoundMem(music.Path);
103  
104      //読み込めなかった場合
105      if (music.Handle == -1)
106      {
107          MusicLoadErrMessage(music.Path);
108      }else
109      {
110          //読み込めた場合
111          music.Volume=volume;    //最大音量を設定
112          ChangeMusicVolume(&music, music.Volume);//再生音量を設定
113          music.PlayType = playType;    //再生タイプを設定
114          music.IsPlayStart = true;    //停止後は最初から再生
115      }
116      
117      return music;
118  }
119  
120  /// 音楽の再生
121  /// @param music 音楽データ
122  void MusicPlay(Music music)
123  {
124      switch (music.PlayType)
125      {
126      case DX_PLAYTYPE_BACK:
127          //バックグラウンド再生
128          PlaySoundMem(music.Handle, DX_PLAYTYPE_BACK, music.IsPlayStart);
129          break;
130      case DX_PLAYTYPE_LOOP:
131          //ループ再生
132          //再生されていないなら
133          if(CheckSoundMem(music.Handle) == 0)
134          {
135              //ループ再生する
136              PlaySoundMem(music.Handle, DX_PLAYTYPE_LOOP, music.IsPlayStart);
137          }
138          break;
139          default:
140              break;
141      }
142  }
143  
144  /// 音楽の一時停止
145  /// @param music 一時停止する音楽
146  void MusicPause(Music* music)
147  {
148      //停止後は今の再生位置から再生する
149      music->IsPlayStart = false;
150  
151      //再生されているかどうか
152      if (CheckSoundMem(music->Handle))
153      {
154          //音楽の一時停止
155          StopSoundMem(music->Handle);
156  
157          //マスター音量に戻す
158          ChangeVolumeSoundMem(GetVolume(music->Volume), music->Handle);
159  
160          //フェード初期化
161          music->FadeInStartFlg = false;
162          music->FadeOutStartFlg = false;
163      }
164  
165      return;
166  }
167  
168  /// 音楽の停止
169  /// @param music 停止する音楽
170  void MusicStop(Music* music)
171  {
172      //停止後は最初から再生する
173      music->IsPlayStart = true;
174  
175      //再生されているかどうか
176      if (CheckSoundMem(music->Handle))
177      {
178          //音楽の一時停止
179          StopSoundMem(music->Handle);
180  
181          //マスター音量に戻す
182          ChangeVolumeSoundMem(GetVolume(music->Volume), music->Handle);
183  
184          //フェード初期化
185          music->FadeInStartFlg = false;
186          music->FadeOutStartFlg = false;
187      }
188      return;
189      
190  }
191  
192  /// 音楽の削除
193  /// @param music 削除する音楽
194  void MusicDelete(Music music)
195  {
196      //正常に読み込んでた場合
197      if (music.Handle != -1)
198      {
199          //音楽をメモリから削除
200          DeleteSoundMem(music.Handle);
201      }
202  }
203  
204  /// 音楽の音量変更
205  /// @param music 音楽データ
206  /// @param volume 音量
207  void ChangeMusicVolume(Music* music, int volume)
208  {
209      //音量が最大音量を超えていたら
210      if(volume <= music->Volume)
211      {
212          //ボリュームを変更
213          ChangeVolumeSoundMem(GetVolume(volume), music->Handle);
214  
215      }
216  
217      return;
218  }
219  
220  /// フェードイン中かどうか
221  /// @param music 音楽データ
222  /// @param fadeInMillTime フェードイン時間(1000=1秒)
223  /// @return true フェードイン終了 false フェードイン中
224  bool FadeInPlayMusic(Music* music, int fadeInMillTime)
225  {
226      //初めてフェードインを行う
227      if (!music->FadeInStartFlg)
228      {
229          //フェードイン時間を設定
230          music->FadeInMillTime = 0;
231          music->FadeInMillTimeMax = (fadeInMillTime/1000.0f) * GAME_FPS;
232          //音量を0にする
233          ChangeMusicVolume(music, 0);
234          //音楽の再生
235          MusicPlay(*music);
236          //フェードイン開始
237          music->FadeInStartFlg = true;
238      }
239  
240      //フェードイン中
241      if(music->FadeInStartFlg)
242      {
243          if(music->FadeInMillTime <= music->FadeInMillTimeMax)
244          {
245              //フェードイン時間をカウントアップ
246              music->FadeInMillTime++;
247  
248              //音量を変更(経過時間/最大時間 * 最大音量)
249              ChangeMusicVolume(music,
250                  (float)music->FadeInMillTime/music->FadeInMillTimeMax * music->Volume);
251          }
252          else if(music->FadeInMillTime >= music->FadeInMillTimeMax)
253          {
254              //フェードイン終了
255              return true;
256          }
257      }
258      return false;
259  }
260  
261  /// フェードアウト中かどうか
262  /// @param music 音楽データ
263  /// @param fadeOutMillTime フェードアウト時間(1000=1秒)
264  /// @return true フェードアウト終了 false フェードアウト中
265  bool FadeOutPlayMusic(Music* music, int fadeOutMillTime)
266  {
267      //初めてフェードアウトを行う
268      if (!music->FadeOutStartFlg)
269      {
270          //フェードアウト時間を設定
271          music->FadeOutMillTime = 0;
272          music->FadeOutMillTimeMax = (fadeOutMillTime/1000.0f) * GAME_FPS;
273  
274          //音量を最大にする
275          ChangeMusicVolume(music, music->Volume);
276          //音楽を再生
277          MusicPlay(*music);
278          //フェードアウト開始
279          music->FadeOutStartFlg = true;
280      }
281  
282      if (music->FadeOutStartFlg)
283      {
284          if (music->FadeOutMillTime <= music->FadeOutMillTimeMax)
285          {
286              //フェードアウト時間をカウントアップ
287              music->FadeOutMillTime++;
288  
289              //音量を変更(100%-(経過時間/最大時間 * 最大音量))
290              ChangeMusicVolume(music,
291                  (1 - (float)music->FadeOutMillTime / music->FadeOutMillTimeMax) * music->Volume);
292              return false;
293          }
294          else if (music->FadeOutMillTime >= music->FadeOutMillTimeMax)
295          {
296              //フェードアウト終了
297              return true;
298          }
299      }
300      return false;
301  }
302  
303  
304  
305  
306