八章:音を出す


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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

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

※プロジェクトを作成したら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:インスタンス生成
mSoundPool = new SoundPool(int maxStreams, int streamType, int srcQuality);
   maxStreams:読み込むサウンドの最大数
   streamType:Streamのタイプ(普通はSTREAM_MUSICを使用するらしい)
   srcQuality:サンプリングレートのクオリティ(デフォルトは0)
  2:読み込みする
mSoundId = mSoundPool.load(Context context, int resId, int priority);
   context:getApplicationContext()を指定してあげるといい。
        自分で破棄する必要のあるものにはこの指定をしたほうがいいらしい。
   resId:Rからリソースを指定する。
   priority:プライオリティ(優先度?)基本的に1を指定する。
  3:再生する
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:終了時破棄
mSoundPool.release();
   SoundPoolは自前で破棄しないとメモリリークが発生するので気を付けること。

 ・MediaPlayer
  1:インスタンス生成&読み込み
mMediaPlayer = MediaPlayer.create(Context context, int resId);
    SoundPoolのときとほぼ同じ。
  2:再生、一時停止、停止
    再生
mMediaPlayer.start();
    読み込んだファイルを再生する。
    一時停止
mMediaPlayer.pause();
    再生中の音を止める。再度再生されたとき止めた場所から再生される。
    停止
mMediaPlayer.stop();
    再生中の音を止める。再度再生するためには、prepare()をstart前に呼び出す。
  3:終了時破棄
mMediaPlayer.release();
    こちらも自前で破棄しないとメモリリークが発生するので注意。

+恒例の小話
予め読み込んでおけばすぐに使えて便利だけど、メモリに何ファイルも読み込んでると
大変なことになるので、大量の音声ファイルを扱うときは最初に全部ロードとかは避けた方がいい。
使う分だけ読み込む、あまり使わないものはメモリに残さない等の工夫をするとよい。
読み込みにも時間がかかるので、使いたい奴をまだ読み込んでないのなら裏で読み込んだりする。