八章:音を出す

「八章:音を出す」の編集履歴(バックアップ)一覧に戻る

八章:音を出す - (2013/09/02 (月) 15:45:26) の編集履歴(バックアップ)


画像が出てタッチもできる。
でも、なんだか物足りない。
やっぱり音が出る方がいじってる感じがするよね!

という訳で、今回は音関係について触れていくよ!

※プロジェクトを作成したらresフォルダーに「rawフォルダー」を作成して
 その中にSE用のサウンドファイルとBGM用のサウンドファイルを入れておく。

+ ソース
※ボタンを複数配置したときのソースを流用
ボタン名は分かりやすいように変更すること。実際の表示名も同様。
例:button→musicButton button→seButton
  1. public class MainActivity extends Activity implements OnClickListener{
  2.  
  3.     //インスタンス変数宣言
  4. private SoundPool mSoundPool;
  5. private MediaPlayer mMediaPlayer;
  6. private int mSoundId;
  7.  
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12.  
  13. //ボタンのクリックイベントを使えるようにする
  14. Button button = (Button) findViewById(R.id.button01);
  15. button.setOnClickListener(this);
  16. Button button2 = (Button) findViewById(R.id.button02);
  17. button2.setOnClickListener(this);
  18. }
  19.  
  20. @Override
  21. public void onClick(View v)
  22. {
  23. switch(v.getId())
  24. {
  25. case R.id.button01:
  26. //MediaPlayerが再生中かどうか判定
  27. //再生中ならtrue そうでなければfalse
  28. if(mMediaPlayer.isPlaying() == false)
  29. {
  30. //MediaPlayer再生
  31. mMediaPlayer.start();
  32. }else
  33. {
  34. //MediaPlayer一時停止
  35. mMediaPlayer.pause();
  36. }
  37. break;
  38. case R.id.button02:
  39. //SoundPool再生
  40. mSoundPool.play(mSoundId, 1.0F, 1.0F, 0, 0, 1.0F);
  41. break;
  42. }
  43. }
  44.  
  45. @Override
  46. protected void onResume(){
  47. super.onResume();
  48.  
  49. //予め音声データの読み込みを行う(インスタンス生成)
  50. mSoundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
  51. mSoundId= mSoundPool.load(getApplicationContext(), R.raw.se, 0);
  52. //MediaPlayer準備(インスタンス生成)
  53. mMediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.bgm);
  54. }
  55.  
  56. @Override
  57. protected void onPause(){
  58. super.onPause();
  59.  
  60. //SoundPoolのリリース
  61. mSoundPool.release();
  62. //MediaPlayerのリリース
  63. mMediaPlayer.release();
  64. }
  65. }
  66.  

+ 解説

・SoundPoolとMediaPlayerの違いについて

 ・SoundPool
  だいたい5秒くらいの短い音声を再生することが出来る。
  サンプルで押してみると分かるが、連打すると先に鳴った音をキャンセルして音が鳴る。
  もちろん複数サウンドの同時再生も可能。(ここでは書かないけど)
  音声ファイル形式はWAVE、ogg、(mp3)※機種によっては再生されないことがあるらしい。
  この特性からしてSE向きってはっきりわかんだね

 ・MediaPlayer
  長い音声が再生できる。
  再生開始した後にまた再生しようとしても受け付けない。
  SoundPoolのようにキャンセルして最初から再生するようにしたければ追加で記述する必要がある。
  実際は再生、一時停止(再度再生時止めた場所から再生)、停止(再度再生時頭出し再生)
  みたいに分けて管理してあげるといいんじゃないかな!
  音声ファイル形式はmp3を筆頭に有名どころは揃ってるらしい。
  この特性からしてBGM向きってはっきりわかんだね

・SoundPoolとMediaPlayerの使い方

 ・SoundPool
  1:インスタンス生成
  1. mSoundPool = new SoundPool(int maxStreams, int streamType, int srcQuality);
   maxStreams:読み込むサウンドの最大数
   streamType:Streamのタイプ(普通はSTREAM_MUSICを使用するらしい)
   srcQuality:サンプリングレートのクオリティ(デフォルトは0)
  2:読み込みする
  1. mSoundId = mSoundPool.load(Context context, int resId, int priority);
   context:getApplicationContext()を指定してあげるといい。
        自分で破棄する必要のあるものにはこの指定をしたほうがいいらしい。
   resId:Rからリソースを指定する。
   priority:プライオリティ(優先度?)基本的に1を指定する。
  3:再生する
  1.  
{
mSoundPool.play(int soundID,
               float leftVolume,
               float rightVolume,
               int priority,
               int loop,
               float rate);}
   soundID:loadしたときの戻り値。ここではmSoundId
   leftVolume:スピーカの音量(0.0~1.0)
   rightVolume:スピーカの音量(0.0~1.0)
   priority:プライオリティ(優先度?0が一番高いらしい)
   loop:ループ回数(-1のとき無限ループ、0のときループなし)
   rate:再生速度(0.5~2.0 0.5倍から2.0倍の間で速度を設定できる)
  4:終了時破棄

 ・MediaPlayer