- ベストアンサー
異なる音質のファイルを再生し、聞き比べたいです・・・
こんにちは、 FLASHで 高音質と低音質の2種類の音(同じメロディで音質だけ違う) を同時に再生し、 再生しながら(曲中に)その2種を切り替える事が可能で、 聞き比べることができるようにしたいのですが、 私には今までそんな仕事をした経験がないもので どうすればいいのか検討もつきません。 どなたかアドバイスをいただけると嬉しいです。 具体的ではなくても、ヒントだけでもいただければ、 そこからは自分でなんとか調べてみたいと思います。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
2種類以上の音を同時に鳴らし、個別に制御する方法はあります。 しかし、同じメロディで音質だけ違う曲を同時に鳴らすと、音が混ざってしまい聞き取りにくくなると思うのですが、どのような意味でしょうか? ボタン操作などで高音質の曲と低音質の曲を切り替えたいだけなら、2種類のサウンドファイルを用意して、再生する音を取り替えることで実現できます。 この手の作例はこのサイトでも何度か話題になっていますので、よろしければご参照ください。 最近のものですと、このあたりです。 ・Flashの音楽ループ http://okweb.jp/kotaeru.php3?q=1546909 ↑この例では、ボタンを押すと単純に曲が切り替わり、各曲はどんな場合でも最初から再生されるようになっています。 言うなれば、CDプレイヤーで再生するトラック番号を切り替えているようなものです。 例えば、最初は高音質の音が鳴り、ボタンを操作すると音質が下がるが演奏は続くといった、切り替わるのは音質だけでメロディは途切れることなく持続するものですと、もう少し工夫が必要になります。 ------------------------------------------------------ お使いの Flash のバージョンが書かれていませんが、とりあえず Flash MX 以降として話を進めます。 以下のスクリプトは、Flash Player 5 (作成ツールは Flash 5 )以前のバージョンでは動作しません。 音は、ActionScript では Sound クラス( Flash MX 以前はオブジェクト)を使って制御します。 Sound クラスには様々な機能がありますが、そのうちの1つに position というプロパティがあります。 position には、現在再生しているサウンドの位置情報(先頭から何ミリ秒の位置が再生されているのか)が記録されています。 音を鳴らす命令である Sound.start は、正式にはパラメータ(引数といいます)を2つ渡すことになっています。 Sound.start( オフセット , ループ回数 ); オフセットとはサウンドシンボルのどのポジション(秒数)から再生を始めるかの指定で、例えば 10 を指定すると 10 秒の位置から再生が始まります。 position の値と Sound.start のオフセットを組み合わせると、CDプレイヤー等にある一時停止ボタンのようなものが作れます。 今回もこの2点を利用して、メロディを途切れさせることなく音質だけを切り替えます。 Sound クラスで音を鳴らすには、リンケージという設定が必要です。 リンケージの設定方法や Sound クラスの基本的な使い方については先述の質問の#1で説明しておりますので、そちらをご参考になさってください。 仮に、リンケージの識別子に” HIGH ”と” LOW ”と付けたサウンドシンボルがあるとします。 この2つは、同じサウンドファイルを読み込み、サウンドシンボルの「プロパティ」で圧縮率だけを変えたもので、” HIGH ”が高音質です。 元は同じサウンドファイルですから、曲の長さは全く同じになります。 スクリプトは次のように考えます。 音を制御するための Sound オブジェクトのほかに、変数を2つ用意します。 1つは音質を切り替える時のサウンドポジションを記録するためのもので、仮に pause_pos という名前だとします。 もう1つには、現在再生中の音質がどちらであるかを記録します。変数の名前を quality とし、高音質の音を再生中の時は0、低音質の時は1を入れます。 音質を切り替える前に position の値を見て、これを変数 pause_posに保存しておきます。 変数 quality が0の時は低音質に切り替えるので、attachSound で低音質の音(リンケージ識別子は” LOW ”)を挿入します。 quality が1の時は逆に、高音質の音を挿入することになります。 Sound.start を実行すれば音が鳴るのですが、メロディを途切れさせないようにするには、先ほど pause_pos に記録した値を使ってオフセットを指定し、中断した位置から再生されるようにします。 ” HIGH ”と” LOW ”は同じ長さの曲です。切り替えた時に position に記録されていた位置から再生させるようにすると、サウンドシンボルは変わってもその続きから再生されることになり、つまりは、メロディはそのままで音質だけが切り替わるというわけです。 ステージにボタンシンボルのインスタンスがあり、これを押すたびに音質が切り替わるものとしますと、スクリプトは大体、次のようになります。 スクリプトはフレームとボタンの、2箇所に設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) ●フレームに設定するスクリプト //Soundオブジェクトの生成と設定 //最初は高音質の音を鳴らす snd = new Sound(); snd.attachSound( "HIGH" ); snd.onSoundComplete = function() { //再生終了時、自動的にループ this.start(); }; snd.start(); //音質を切り替える時のサウンドポジションを保持 pause_pos = 0; //再生中の音質を管理 //0:高音質 1:低音質 quality = 0; ●音質を切り替えるボタンに設定するスクリプト on(release) { //現在のポジションを記録 pause_pos = snd.position; //今、鳴っている音を止める snd.stop(); //音質を切り替える if( quality == 0 ) { //低音質に切り替え、中断したポジションから再生 snd.attachSound( "LOW" ); snd.start( pause_pos / 1000 ); //再生中の音質を記録する quality = 1; } else { //高音質に切り替え、中断したポジションから再生 snd.attachSound( "HIGH" ); snd.start( pause_pos / 1000 ); //再生中の音質を記録する quality = 0; } } 音質を切り替えて再生する箇所ですが、オフセットの単位が秒であるのに対し position に入っているのはミリ秒なので、1000 で除算してから渡します。 この違いのため、再生位置がほんのわずかにズレることがありますが、あまり気にならない程度です。 ここではとりあえず、曲は1つで音質が違う2つのサウンドシンボル、という例を考えました。 曲が何曲かあってそれぞれに高音質/低音質の2種類がある場合は、今鳴っている曲が何であるかといった情報の管理や、リンケージ識別子を通し番号で付けるといった工夫も必要になるかと思います。