◆PROCESSING 逆引きリファレンス
カテゴリー:音楽・演奏
サポート機能を判定する(minim編)
【解説】
minimは、PROCESSINGで手軽に音楽を演奏できるライブラリです。
minimについて、より詳しく知りたい方は下記公式サイト 様を参照して下さい。
minimには音楽の再生だけでなく、音量(ボリューム、ゲイン)や位相、消音(ミュート)、バランスなどをコントロールする機能が搭載されています。
しかしこれらの制御機能は、残念ながらすべてのPCで同じように動作するわけではないようです。あなたのPC環境や利用する音楽データによってはサポートされない事があるのです。
例えば私のPCでは、minimで音量(ボリューム)をコントロールする機能がサポートされていません(泣)。
あなたが利用する環境で、minimがサポートしている制御機能を知るには、AudioPlayerクラスが提供している hasControl() メソッドを利用します。
しかし・・・1つ落とし穴があり、このメソッドは非推奨となっているのです。コーディングすると動作はしますが、警告MSGが表示されてしまいます・・・。
まぁ、かなり残念な感じですが、・・・このあたりがタダで利用可能なソフトの欠点なのかもしれません・・・(汗)。
【構文】
boolean player.hasControl( type ) ;
player は AudioPlayerクラスのインスタンス変数です。
type で指定した機能がサポートされている場合 Trueが、未サポートなら False が戻されます。
void player.printControls( );
player は AudioPlayerクラスのインスタンス変数です。
標準出力に、各制御機能のサポート状況を表示します。
【パラメータ】
type は javax.sound.sampled.FloatControl.Type と javax.sound.sampled.BooleanControl.Type で定義している定数です。
以下の名前で、minimのControllerクラスの定数として再定義されています。
BALANCE
GAIN
PAN
SAMPLE_RATE
VOLUME
MUTE
【注意】
先にも述べましたが、hasControl() メソッドは非推奨となっており、動作はしますがコーディングすると警告MSGが表示されます。
頑張って minim のプログラムソースを拝見しましたが、(独自に JavaのSOUND APIを利用すれば別ですが)minimでhasControl() メソッドに代わる制御機能の確認方法は無さそうでした。
minim のプログラムソースでは、各get()メソッド(例えば、getGain( ) やgetVolume( ) メソッド)で0が戻されたら、「サポートしていない可能性がある」作りにはなっていました。
しかし厳密には、サポートしている場合でも0が戻る事があるため、get( ) メソッドで判定する方法は正確性を欠きます。
その一方で、AudioPlayerクラスが提供している printControls( ) メソッドを実行すると、サポート状況を標準出力(コンソール領域)に表示してくれます。
例えば printControls( ) メソッドを実行すると、こんな感じの出力がコンソール領域に表示されます(クリックすると拡大します)。
情報の出力先が標準出力(コンソール領域)なので使い勝手が悪いです。
また(少なくとも私の環境では) shifting機能のサポート状況については、正確な表示を行ってくれませんでした(汗)。
例えば上記表示では Gain(ゲイン)機能の shifting は未サポート(doesn’t support shifting.)と表示されています。しかし実際に minimのshiftGain() メソッドを実行すると、それっぽく動作するのです・・・。
というわけでminimの制御機能のサポート状況調査関連メソッドは、現在のところ(Ver2.2.2現在)あまり信用できないというのが実情のようです。そのうち改善されると良いですね・・・。
【関連記事】
- 音楽の再生準備を行う(minim編)
- BGMの再生・停止を行う(minim編)
- BGMのボリュームを制御する(minim編)
- BGMの再生位置を制御する(minim編)
- BGMの消音を制御する(minim編)
- BGMのバランスを制御する(minim編)
- 音楽ファイルのメタ情報を取得する(minim編)
- BGMの周波数を分析する(minim編)
サンプルプログラム
hasControlで調査する例:
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 |
//外部ライブラリの定義 import ddf.minim.*; Minim minim; AudioPlayer player; String fileName; void setup() { fileName = "bgm_maoudamashii_orchestra15.mp3"; //再生用オブジェクト生成 minim = new Minim( this ); //音楽ファイルを読み込む player = minim.loadFile( fileName ); if( player == null ){ //読み込み失敗時 println( fileName + "の読み込み失敗" ); exit(); } //サポート状態をコンソールに表示 dispSupported(); } void dispSupported(){ println( "BALANCE = " + player.hasControl( Controller.BALANCE ) ); println( "GAIN = " + player.hasControl( Controller.GAIN ) ); println( "MUTE = " + player.hasControl( Controller.MUTE ) ); println( "PAN = " + player.hasControl( Controller.PAN ) ); println( "SAMPLE_RATE = " + player.hasControl( Controller.SAMPLE_RATE ) ); println( "VOLUME = " + player.hasControl( Controller.VOLUME ) ); } void draw() { } |
dataフォルダ配下に 適当な音楽ファイルがある事が前提です。
上記を実行するとコンソール領域にサポート状況を表示します。
printControlsで調査する例:
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 69 70 71 72 73 74 |
//外部ライブラリの定義 import ddf.minim.*; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.PrintStream; Minim minim; AudioPlayer player; String fileName; void setup() { fileName = "bgm_maoudamashii_orchestra15.mp3"; //再生用オブジェクト生成 minim = new Minim( this ); //音楽ファイルを読み込む player = minim.loadFile( fileName ); if( player == null ){ //読み込み失敗時 println( fileName + "の読み込み失敗" ); exit(); } ///サポート状態をコンソールに表示 dispSupported( player ); } void dispSupported( AudioPlayer audio ){ println( "BALANCE = " + myHasControl( audio, "Balance" ) ); println( "GAIN = " + myHasControl( audio, "Gain" ) ); println( "MUTE = " + myHasControl( audio, "Mute" ) ); println( "PAN = " + myHasControl( audio, "Pan" ) ); println( "VOLUME = " + myHasControl( audio, "Volume") ); } //--------------------------------------- // keyWord で与えた機能のサポート状況を返却する //--------------------------------------- // keyWord : Gain ... ゲイン値 // : Balance..バランス値 // : Mute.....消音 // : Pan......パン値 // : Volume...ボリューム値 // boolean myHasControl( AudioPlayer audio, String keyWord ){ //現在の標準出力を退避 PrintStream nativeOut = null; nativeOut = System.out; //確保したバッファを新しい標準出力先にする ByteArrayOutputStream snatchedOut = new ByteArrayOutputStream(); System.setOut(new PrintStream(new BufferedOutputStream(snatchedOut))); //サポート状態を出力させる audio.printControls(); //バッファを文字列に変換する System.out.flush(); String s = snatchedOut.toString(); //標準出力を元に戻す System.setOut( nativeOut ); //キーワードを探す if ( s.indexOf( keyWord ) > 0 ){ return( true ); //サポートしている } else { return( false ); //サポートしていない } } void draw() { } |
※上記の標準出力関連の制御プログラムは Quita 様:「Java コンソール出力(標準出力・標準エラー出力)内容をString文字列として取り出す」 記事を参考にさせて頂きました。ありがとうございます。
hasControl() メソッド利用時の警告MSGが気持ち悪いので、苦肉の策として printControls( ) メソッドの出力文字列から、サポート状況を判断する関数を作成しました。
正確性には欠けますが、コーディング時に警告MSGが表示されることはありません(笑)。
・・・かなり強引ですけどね(汗)。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。