◆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などでお試しください。
演奏される音楽は、魔王魂 様から拝借しました。物凄くカッコイイ音楽です。ありがとうございます。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。