◆PROCESSING 逆引きリファレンス
カテゴリー:音楽・演奏
BGMの再生・停止を行う(minim編)
【解説】
PROCESSINGの標準命令では、残念ながら音楽(BGM)を鳴らすことはできませんが、有志の皆様が提供してくれているライブラリを追加する事で解決できます。
ここでは予め用意された mp3 や wav 形式の音楽ファイルを、そんなライブラリの1つであるminimを使って再生する方法について紹介します。
minimライブラリの導入方法については、下記記事を参照して下さい。
またminimについて、より詳しく知りたい方は下記公式サイト 様を参照して下さい。
GitHub minimページ 様
minim公式リファレンスページ 様
minimを使って音楽ファイルを再生するには、以下の手順でプログラミングします。
インスタンス変数を作成する
まず最初にminimが提供しているMinimクラスのインスタンス変数を作成する必要があります。
通常この処理はプログラムの中で1度だけ行えば良いので、初期化関数( setup )の中で行う事になります。
音楽ファイルを読み込む
Minimクラスのインスタンス変数を作成したら、Minimクラスが提供している loadFile() メソッドを用いて音楽ファイルを読み込みます。
音楽ファイルの読み込みに成功すると、音楽の再生や停止などの制御に利用可能なAudioPlayerクラスのインスタンス変数が戻されます。
音楽を再生する
演奏の開始はAudioPlayerクラスが提供している play() メソッドを利用します。
演奏中か否かの判定は、AudioPlayerクラスが提供しているisPlaying()メソッドで可能です。
再生を停止する
演奏の一時停止はAudioPlayerクラスが提供している pause() メソッドを利用します。
後始末をする
演奏が終了し、その音楽ファイルの再生を終わる場合は AudioPlayerクラスの close() メソッドを利用します。
【構文】
●インスタンス変数を作成する
Minim minim = new Minim( Object obj ) ;
PROCESSINGでは obj に this を渡します。
●音楽ファイルを読み込む
AudioPlayer player = minim.loadFile ( String fileName ) ;
fileName で音楽ファイルの名前を指定します。
●演奏開始
void player.play( ) ;
void player.play( int millis ) ;
mills は演奏を開始する位置で、先頭からの経過ミリセカンドを指定します。
引数なしだと、前回演奏終了位置から演奏が始まります。
●演奏中の判定
boolean ret = player.isPlaying( ) ;
演奏中なら ret に True が、停止中なら False が戻されます。
●演奏停止
void player.pause( ) ;
●演奏終了
void player.close( ) ;
void minim.stop( ) ;
【注意】
minimのライブラリを利用するにはプログラムの先頭に
import ddf.minim.*;
などと記述して、ライブラリの利用宣言を行う必要があります。
インスタンス変数を作成する
PROCESSINGでMinimのインスタンス変数を作成するには、Minimクラスのコンストラクタに PROCESSINGのメインインスタンス( this ) を与えます。
PROCESSINGのメインインスタンスではない適当なもの( String とか )を与えると、コンソール領域にエラーメッセージを出力し、その後に利用する loadFile() メソッドで null が戻されます。
音楽ファイルを読み込む
音楽ファイルはMinimクラスのloadFile() メソッドで読み込みます。
Minimクラスには、短い効果音専用の loadSample() メソッドも用意されていますが、こちらは普通の音楽ファイルには不向きです。
loadFile() メソッドにファイル名だけを指定した場合は、該当ファイルがスケッチファイル格納フォルダの data フォルダ配下にある前提で動作します。
mp3 形式の音楽ファイルを読み込ませた際、該当ファイルにID3v2形式のタグがあると、コンソール領域に以下のようなメッセージが表示される事があります。
=== JavaSound Minim Error ===
=== Don’t know the ID3 code TXXX
この警告が表示されても、とりあえず各処理は行えるようです。どうしても気になる方はFREEのタグエディターなどで、ID3v2形式のタグを削除して下さい。
ファイルが見つからない場合や、minimがサポートしていない形式の音楽ファイルを与えた場合は、コンソール領域にエラーメッセージを出力し、戻り値に null が返ります。
演奏開始
引数を与えないでAudioPlayerクラスの play() メソッドを実行すると、前回演奏した最後の位置から終端までの演奏を行い、自動停止します。
最初の1回目の演奏では、前回演奏した最後の位置はありませんから(笑)、必然的に音楽ファイルの先頭から再生される事になります。
引数にint型の値を与えると、int型で指定したポジションから再生を行います。例えば6秒(6000ms)の再生時間がある音楽ファイルに対して5000を指定すると、最後の1秒部分だけが演奏されることになります。
音楽ファイルの再生が終了すると、再生位置は該当ファイルの終端に位置づけられます。ですので、この状態から再度引数なしでplay() メソッドを実行しても、音は鳴りません。
もう一度最初から演奏したい場合は、play() メソッドを発行する前に再生位置を先頭に巻き戻す必要があります。
AudioPlayerクラスには再生位置をコントロールする便利な命令がありますが、単純に先頭から再生し直したいのであれば、play( 0 ) ; とするのが簡単です。
演奏中か否かの判定にはisPlaying()メソッドを利用します。演奏中であれば Trueが、演奏停止中なら False が戻されます。
演奏停止
再生の一時停止にはAudioPlayerクラスのpause( )メソッドを利用します。命令を発行すると、その場で演奏を一時停止します。
一時停止状態から演奏を再開(停止した直後から演奏する)には、引数なしで再び play() メソッドを実行します。
演奏終了
ある音楽ファイルの演奏を終了するには、AudioPlayerクラスの close()メソッドを利用します。
close() すると、その後に play() メソッドを発行しても再び演奏が行われることはありません。
ある音楽ファイルの演奏後(演奏途中)に別の音楽ファイルを演奏したい場合は、AudioPlayerクラスを一度 close() してから、 loadFile() メソッドを用いて新しい音楽ファイルを読み直す必要があります。
player = minim.loadFile ( “hoge.mp3” ) ;
player.play() ;
…
…
player.close( ) ;
player = minim.loadFile ( “uho.mp3” ) ;
こんな感じです。
close() せずに新しい音楽ファイルをloadFile()すると、play() 時に音楽が混ざり合って再生されてしまいます。
minimを紹介している各サイト様では、PROCESSINGのアプリケーション終了時( stop() イベントハンドラ)に、AudioPlayerクラスの close() と、Minimクラスの stop() を実行するように書かれているものがあります。
しかしPROCESSING3.x では、アプリケーション終了時にstop() イベントハンドラは動作しません。
minimのソース・ファイルや公式サンプル、公式リファレンスなどを参照する限り、(少なくともPROCESSING3.xでは)アプリケーション終了時にAudioPlayerクラスの close() やMinimクラスの stop()を実行する必要はなさそうです。
【関連記事】
- 音楽の再生準備を行う(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 |
//外部ライブラリの定義 import ddf.minim.*; Minim minim; AudioPlayer player; String fileName; PImage img; int ix, iy; void setup() { fileName = "bgm_maoudamashii_orchestra15.mp3"; //再生用オブジェクト生成 minim = new Minim( this ); //音楽ファイルを読み込む player = minim.loadFile( fileName ); if( player == null ){ //読み込み失敗時 println( fileName + "の読み込み失敗" ); exit(); } //再生ボタン画像読み込み img = loadImage( "play.png" ); ix = (width - img.width)/2; iy = (height - img.height)/2; textAlign( LEFT, TOP ); } void draw() { background( 255 ); //再生ボタンイメージ描画 image( img, ix, iy ); fill( 0 ); if( player.isPlaying() == false ){ //停止中なら STOP と表示する text( "stop", 0, 0 ); } else { //再生中なら PLAY と表示する text( "play", 0, 0 ); } } void mousePressed(){ if( mouseX > ix && mouseX < ix + img.width && mouseY > iy && mouseY < iy + img.height ){ //再生ボタンがクリックされた if( player.isPlaying() == false ){ //再生中でなければ、演奏開始 player.play( 0 ); } else { //再生中なら一時停止 player.pause(); } } } |
dataフォルダ配下に bgm_maoudamashii_orchestra15.mp3 という名前の音楽ファイルがある事が前提です。
再生ボタン画像の上でマウスをクリックすると、音楽の再生を行います。再生中にもう一度クリックすると演奏を一時停止します。
<出力結果>
(画像URL:illust-AC 様:Layu さん)
下記はサンプルプログラムと同じ動きになるように、 P5.js+P5.sound で書き直したものです。動作イメージを確認できます。※
※ブラウザーによっては下記サンプルが表示されない事があります。IE11はNGでした。動作イメージを確認したい方は、FireFox、Chrome、Edgeなどでお試しください。
演奏される音楽は、魔王魂 様から拝借しました。物凄くカッコイイ音楽です。ありがとうございます。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。