◆PROCESSING 逆引きリファレンス
 カテゴリー:音楽・演奏
BGMのボリュームを制御する(minim編)
【解説】
minimは、PROCESSINGで手軽に音楽を演奏できるライブラリです。
minimについて、より詳しく知りたい方は下記公式サイト 様を参照して下さい。
minimには音楽の再生だけでなく、音量(ボリューム、ゲイン)をコントロールする機能が搭載されています。
ボリュームは良く聞く言葉です。音の大きさですよね。では、ゲインとは何でしょうか?・・・(汗)。
minimがサポートする音量の制御にはボリューム制御とゲイン制御がありますが、音楽関係に詳しくない私などには、「ゲイン」は聞き慣れない言葉です。
このあたりはスタジオラグへおこしやす 様のブログに解りやすく解説されていますので、興味がある方は参照してみて下さい。
ざっくりと理解できた範囲で書くと、ゲインとは「ある装置へ入力する音の大きさ(入力音量)」の事、ボリュームとは「ある装置から出力する音の大きさ(出力音量)」の事です(たぶん:汗)。
(画像URL:illust-AC 様:オリビア さん、acworks さん)
minim ではこれを別々の命令でコントロールする事ができる・・・筈なのですが、私のPCでは(何故か)ボリュームをコントロールする命令が動作しません(泣)。
このようにminimの制御命令は、PCの環境によって動作しない事があります。minimがサポートしている制御命令の利用可否を調べるには「サポート機能を判定する(minim編)」記事を参照してください。
私のようにボリューム(出力音量)が制御できない環境の人は、ゲイン(入力音量)を制御する事で、実際の音の大きさを調整する事になります。
現在のゲイン値を取得するには、AudioPlayerクラスが提供している getGain( ) メソッドを利用します。また任意のゲイン値を設定するには setGain( ) メソッドを利用します。
段階的にGain値を変更するには、shiftGain( ) メソッドが便利です。
【構文】
float  value  =  player . getGain( ) ;
void  player . setGain( float  value ) ;
void  player . shiftGain( float  from,  float  to,  int  millis ) ;
player は AudioPlayerクラスのインスタンス変数です。
【パラメータ】
value : 設定(あるいは取得)するゲイン値
from  : 変更開始ゲイン値
to        : 変更終了ゲイン値
millis : 変化する時間(ミリセカンド)
【注意】
ゲイン値がどの範囲でコントロールできるのかは、あなたのPC環境に依存します。私のPCでは+6から-80の範囲(マイナスほど音が小さくなる)で制御可能でした。
AudioPlayerクラスが提供しているprintControls( ) メソッドを実行すると、サポート範囲をコンソール領域に表示してくれます。
ただしゲイン値を大きくすると、その特性上、音が歪むことになるので注意が必要です。
setGain()メソッドに、サポートされる最大値以上のゲイン値を与えても、ゲイン値は最大値までしか大きくなりません。
同様にsetGain()メソッドに、サポートされる最小値以下のゲイン値を与えても、最小値までしか小さくなりません。
段階的にゲイン値を変化させるには、何度もsetGain()メソッドを使うよりは、shiftGain()メソッドを利用するほうが便利です。たとえばゲームなどで、徐々に音量を変化させたい場合に使えるのではないでしょうか?。
setGain()メソッドも、 From と To にサポートされている範囲外の値を与えても、サポート範囲内の数値でしかゲイン値が変化しません。
shiftGain()メソッドは、FromからToに向かって、指定したmillis ミリセカンド内で徐々にゲイン値を変化させます。
shiftGain( -80, 6, 5000 ); なら一旦ゲイン値を-80(最小)にした後、5秒間(5000ミリセカンド)かけて6(最大)まで徐々に音が大きくなります。
shiftGain( 6, -80, 5000 ); なら一旦ゲイン値を6(最大)にした後、5秒間(5000ミリセカンド)かけて-80(最小)まで徐々に音が小さくなります。
【関連記事】
- 音楽の再生準備を行う(minim編)
 - サポート機能を判定する(minim編)
 - BGMの再生・停止を行う(minim編)
 - BGMの再生位置を制御する(minim編)
 - BGMの消音を制御する(minim編)
 - BGMのバランスを制御する(minim編)
 - 音楽ファイルのメタ情報を取得する(minim編)
 - BGMの周波数を分析する(minim編)
 
サンプルプログラム
ゲイン値を制御する例:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68  | 
						import ddf.minim.*;  //宣言 Minim        mini;    //Minimオブジェクト変数 AudioPlayer  player;  //音楽制御用インスタンス void setup(){   boolean breakFlg = false;  //初期処理エラーFLG   size(200,200);   //Minimインスタンスを作成する   mini = new Minim( this );   //音楽ファイルを読み込む   player = mini.loadFile("bgm.mp3");   if( player == null ){     println( "loadFile() error" );     breakFlg = true;   }   //ゲイン制御可能か調べる   if( breakFlg == false &&        player.hasControl( Controller.GAIN ) == false ){     println( "gain is not supported" );     breakFlg = true;             }   if( breakFlg == false ){       //表示文字色、サイズ、位置を設定       fill(0);       textSize(16);       textAlign( LEFT, TOP );       //繰り返し再生開始       player.loop();   } else {     //エラーなら終了     noLoop();     exit();   } } void draw(){   background(255);   //現在のゲイン値を表示する   text( "Gain : " + player.getGain(), 0, 0 ); } void keyPressed(){   float  myGain;   //現在のゲイン値を取得する   myGain = player.getGain();   if( key == 'u' ){     if(  myGain <= 5.0 ){       //MAXまでゲインを上げる       myGain = myGain +1;      }   } else if( key == 'd' ){     if( myGain >= -79.0 ){       //MINまでゲインを下げる       myGain = myGain -1;     }   }   player.setGain( myGain ); }  | 
					
dataフォルダ配下に音楽ファイル(”bgm.mp3″)がある前提です。
実行すると指定した音楽ファイルが繰り返し再生されます。この時キーボードのuを押すとゲイン値(音)が大きくなります。dなら小さくなります。
ゲイン値を段階的に制御する例:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62  | 
						import ddf.minim.*;  //宣言 Minim        mini;    //Minimオブジェクト変数 AudioPlayer  player;  //音楽制御用インスタンス void setup(){   boolean breakFlg = false;   size(200,200);   //Minimインスタンスを作成する   mini = new Minim( this );   //音楽ファイルを読み込む   player = mini.loadFile("bgm.mp3");   if( player == null ){     println( "loadFile() error" );     breakFlg = true;   }   //ゲイン制御可能か調べる   if( breakFlg == false &&        player.hasControl( Controller.GAIN ) == false ){     println( "gain is not supported" );     breakFlg = true;             }   if( breakFlg == false ){       //表示文字色、サイズ、位置を設定       fill(0);       textSize(16);       textAlign( LEFT, TOP );       //繰り返し再生開始       player.loop();   } else {     //エラーなら終了     noLoop();     exit();   } } void draw(){   background(255);   //現在のゲイン値を表示する   text( "Gain : " + player.getGain(), 0, 0 ); } void keyPressed(){   float        myGain;  //現在のゲイン値   myGain = player.getGain();    if( key == 'u' ){      //MAXまでゲインを上げる     player.shiftGain( myGain, 6,  10000 );   } else if( key == 'd' ){     //MINまでゲインを下げる     player.shiftGain( myGain, -80, 10000 );   }  }  | 
					
dataフォルダ配下に音楽ファイル(”bgm.mp3″)がある前提です。
実行すると指定した音楽ファイルが繰り返し再生されます。この時キーボードのuを押すとゲイン値(音)が10秒かけて徐々に大きくなります。dなら徐々に小さくなります。
下記はサンプルプログラムと同じ動きになるように、 P5.js+P5.sound で書き直したものです。動作イメージを確認できます。※
なおブラウザーのSOUND API ( P5.sound )とminim の仕様の違いにより、上記サンプルプログラムと下記動作例は、いろいろと異なっています。
- 音量はゲインではなくボリュームで制御
 - 制御幅は、P5.soundでは 0 から 1 の範囲
 - マウスクリックで再生を開始・停止するように変更
 - 再生中か停止中かを表示
 
※ブラウザーによっては下記サンプルが表示されない事があります。IE11はNGでした。動作イメージを確認したい方は、FireFox、Chrome、Edgeなどでお試しください。
演奏される音楽は、魔王魂 様から拝借しました。物凄くカッコイイ音楽です。ありがとうございます。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。

