2つの音のボリューム制御

このQ&Aのポイント
  • Flashで2つの音を鳴らす方法について質問です。タイムラインとスクリプト制御で音を別々に鳴らしたいのですが、setVolumeでのボリューム制御がうまくいきません。
  • タイムライン用の音のボリュームを30に、スクリプト制御用の音のボリュームを80に設定したいのですが、最後に指定したsetVolumeのボリュームが2つの音に適用されてしまいます。
  • Flash MX 2004とWindows XPを使用しています。解決方法をご存知の方がいらっしゃいましたら、教えていただけると助かります。
回答を見る
  • ベストアンサー

2つの音のボリューム制御

質問させてください。 Flashで2つの音を鳴らしたいと考えています。 一つはタイムラインにおいて、画面と同期させて います。二つ目は常に鳴るようにサウンドオブジェクト で鳴らしています。 問題は、setVolumeで音のボリュームを制御したいの ですが、下記のように2つのサウンドオブジェクトを 作成しても、最後に設定したsetVolumeに2つの音が ボリューム指定されてしまって、別々にボリューム 制御ができません。 (下記のように、タイムラインの音は30、スクリプト 制御の音は80で設定したい。) ●タイムラインの1フレーム目のフレームアクション _root.snd = new Sound(); _root.bgmsnd = new Sound(); //タイムライン用のボリューム指定 _root.snd.attachSound("menu1"); _root.snd.setVolume(30); //スクリプト制御用のボリューム指定 _root.bgmsnd.attachSound("bgm"); _root.bgmsnd.setVolume(80); _root.bgmsnd.start(0,99999); 解決方法、おわかりの方おられますでしょうか? Flash MX 2004 Windows XP

  • Flash
  • 回答数2
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

タイムラインに挿入したサウンドの「同期」を「イベント」か「スタート」にした場合、例えば挿入したのがフレーム1であれば、フレーム1に”○○というサウンドを再生する”という命令だけが書き込まれます。 そのため、フレーム2から再生すると、再生の命令が実行されず、また、それぞれのフレームで再生すべきサウンドのデータも何もないので、音は鳴りません。 また、何らかの理由で描画が遅れたり、サウンドの読み込みが失敗・遅れた場合などは、画面と音がズレることもありえます。 しかし、サウンドを何度もループさせたり、他のフレームで再利用する場合でも、書き出すサウンドのデータは1ループ分で済み、特に、容量を小さくしなければならないネットでの公開では有利になります。 一方「ストリーミング」は、各フレームで再生するべきサウンドのデータが逐一書き出されます。 「ストリーミング」では、マシンの能力不足などの理由で描画が間に合わない時は、描画を間引いてでも、音と画面との同期を最優先にします。再生するマシンの能力がない場合は、コマ落ち・引きつり等の、いわゆる”処理落ち”が発生することがありますが、画面と音との同期は保たれます。 こんな芸当ができるのは、各フレームに、そのフレームで再生するべきサウンドのデータが全て書き込まれているおかげです。 「イベント」または「スタート」にした場合、編集画面でタイムラインの再生ヘッドを動かしても音は出ませんが、「ストリーミング」では音が出ますので、各フレームで鳴る音を確認しながらムービーを編集できます。 ただし、「ストリーミング」サウンドを繰り返しまたはループさせると、ループした分だけサウンドのデータが書き出されることになり、ファイルが大きくなります。 ファイルが大きいということは、それだけメモリを占有し、再生するマシンにも多大な負担をかけることになります。 なお、「ストリーミング」サウンドを繰り返し・ループにしていても、タイムラインには1ループ分の波形しか表示されません。 しかし、ループの場合、例えばサウンドを置いたレイヤーのフレーム10で波形が終わっていても、その先にまだフレームが存在している場合は、その分、ストリーミング再生は続行されます。 「ストリーミング」サウンドは繰り返し・ループさせないことがベストですが、どうしても繰り返さなければならない場合は、「繰り返し」を「1」にし、1ループごとにキーフレームを作り、波形を確認しながら画像を配置してはいかがでしょう。 「ストリーミング」サウンドにして、音を確認しながら画像を配置していれば、普通はズレたりはしないはずです。 しかし、フレームレートが極端に大きい・画像やサウンドデータが多く、ムービーの容量や処理が重い場合は、画面の動きが遅くなったり、画面と音がズレる・ビットマップ画像が赤い四角で表示されるといった、予期せぬ現象が起こることもあるようです。 Flash でも動画形式に書き出したり、プロジェクタ形式で書き出してCDで配布することはできますが、Flash の本業は、ネットでも公開できるアニメ・商業用コンテンツの作成です。容量の軽さと、その少ない容量の割に高度な作品を作れることをセールスポイントにしています。 本格的な動画の編集や、処理の重さとファイルの容量に糸目を付けず、とにかく質の高さを追求する作品の作成には不向きです。 容量や処理が重い場合は、  ・フレームレートを下げる(標準は 12 、多少細かい作品を作る場合でも 15 ~ 18 を限度とする)  ・ビットマップ系画像とサウンドデータを少なくする  ・ムービーを分割し、必要に応じて loadMovie などで読み込む  ・2回以上使うものはシンボルにする  ・トゥイーンを利用し、キーフレームを少なくする などで、ムービーのスリム化を図ってみてください。 タイムラインの波形と画像が合っていないことと、ムービーが重過ぎる以外の原因でズレるようでしたら、あとはちょっと心当たりがありませんが、、、

hide_momiji
質問者

お礼

ありがとうございます。 目的がCD-ROM配布で、動画もふんだんに使用している、 コンテンツで、当初は1ムービーで200MBこえていました。 しかもフレームレートが20でしたので、ずれるのは当然 ということですね。 フレームレートは落とせなかったので、loadMovieで読み 込む形で同期をとりました。 すべて解決しました。本当にありがとうございました。

その他の回答 (1)

  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

同時に鳴らす2つの音を個別に制御するには、別々のムービークリップで鳴らし、それぞれを違う Sound オブジェクトで管理する必要があります。 Sound オブジェクトを生成する際、new Sound の引数にターゲット名を渡すと、そのムービークリップの音を管理するオブジェクトが生成されます。省略した場合は、ムービー全体の音を管理するオブジェクトになります。 ご質問文のスクリプトですと、snd も bgmsnd も、ともにムービー全体の音を管理するオブジェクトになっているようです。 そのため、最後に実行される _root.bgmsnd.setVolume(80); だけが有効になり、ムービー全体の音量が 80 に統一されているのだと思われます。 bgmsnd で鳴らしている音は、おそらくBGMだと思います。 これは、ダミーのムービークリップを作り、そちらで鳴らすようにしてはいかがでしょう。 ダミーのムービークリップは、ムービークリップを何か1つ、非表示にしてステージに配置しておいてもいいのですが、空のムービークリップを作る createEmptyMovieClip を使うと、タイムラインを使うことなくダミーのムービークリップを配置できます。 タイムラインのフレーム1に、次のようなスクリプトを設定してみてください。  //BGM用のダミーのムービークリップを作る  _root.createEmptyMovieClip( "bgm_clip" , 0 );  //BGM用サウンドオブジェクトの生成  bgmsnd = new Sound( bgm_clip );  //BGMの設定と再生  bgmsnd.attachSound( "bgm" );  bgmsnd.setVolume( 80 );  bgmsnd.start();  bgmsnd.onSoundComplete = function()  {   //再生終了時、自動的にループ   this.start();  }; (↑このスクリプトをコピーして利用する場合は、各行頭の全角のスペースを、全て半角のタブかスペースに置き換えてください。このまま使うとシンタックスエラーになります) createEmptyMovieClip で、” bgm_clip ”というインスタンス名を持つ、空のムービークリップを作ります。 Sound オブジェクト bgmsnd では、このムービークリップの音を制御します。 onSoundComplete はサウンドの再生終了時に発生するイベントで、イベント発生時に呼び出す関数を定義できます。 よって、onSoundComplete イベント発生時にサウンドの最初から再生するように定義しておくと、無限ループ再生になります。 タイムラインに挿入しているのは効果音で、おそらくですが、効果音の再生終了を待って次のフレームに進みたい、といった処理ではないでしょうか。 タイムラインに挿入した音は、ムービー全体の音を管理する Sound オブジェクトでなければ制御できません。となると、せっかくムービークリップを作って鳴らしているBGMも、効果音と同じボリュームに設定されてしまいます。 効果音もダミーのムービークリップで鳴らすと、BGMとは別のボリュームに設定できます。 フレーム1のスクリプトに、次のようなスクリプトを追加してください。  //効果音の再生終了フラグ  //再生終了時true、それ以外はfalse  se_flg = false;  //効果音用のダミーのムービークリップを作る  _root.createEmptyMovieClip( "se_clip" , 1 );  //効果音用サウンドオブジェクトの生成  snd = new Sound( se_clip );  //効果音の設定  snd.attachSound( "menu1" );  snd.setVolume( 30 );  snd.onSoundComplete = function()  {   //再生終了を知らせる   _root.se_flg = true;  }; BGMの時と同様に、ダミーのムービークリップを作り、これで鳴らす音を snd で管理します。 1度 attachSound で挿入したサウンドは、start メソッドで何度でも再生できます。 あとは、効果音を鳴らしたいフレームで  snd.start(); を実行すれば、効果音が鳴ります。 しかし、タイムラインの方では、効果音の再生が終わったかどうかは分かりません。 そこで、変数と先の onSoundComplete を利用して、再生終了を検出することにします。 se_flg という変数は、最初は false が入っています。効果音の再生終了後、この変数の中身は true に変わります。 タイムラインではフレーム間をループして、この変数を監視し、true になるのを待つ、つまり効果音の再生が終わるまで待ってから先に進むようにしてください。 ちなみに、attachSound と start で鳴らす音は「イベント」サウンドです。 「イベント」サウンドでは、画面との同期は保証されません。 もし、音に合わせて画面を動かしたいとのご希望でしたら、タイムラインにサウンドを挿入し、「プロパティ」の同期のリストから「ストリーミング」を選択してください。 ただし、メインのタイムラインを使って鳴らす音にすると、先述の通り、BGMと別のボリュームを設定することはできなくなります。 この場合は、メインのタイムラインに組んである内容をムービークリップにし、ムービークリップのタイムラインで「ストリーミング」サウンドを利用する、などの工夫が必要になるかと思います。 長くなってすみませんでした。 不明な点がありましたら、補足してください。

hide_momiji
質問者

補足

すばらしい回答でした。 ボリュームの問題だけでなく、 無限ループ再生の仕方まで解決しました。 start()メソッドでの無限ループはあきらめて いたので、助かりました。 >音に合わせて画面を動かしたいとのご希望でしたら、 >「プロパティ」の同期のリストから「ストリーミン >グ」を選択してください。 音の同期についても、大変参考になりました。 音の同期は、ストリーミングサウンドにする、と、 解説書にもあることですが、フレームのタイミング に関わらず、サウンドがストリーミングされて、ど んどん次へ次へと再生されてしまう、という現象に 悩まされています。 今回の質問とはずれてしまいますが、ストリーミング サウンドの扱いで、この現象を回避する方法はないの でしょうか?もしご存知であれば教えてください。

関連するQ&A

  • flashの音再生について

    main.swfにactionscript2.0で音のon/offしているのですが、 offになって欲しくない音までoffになってしまいます。 スクリプトで呼び出している音ならばまだわかるのですが、 flvで外部から読み込み再生しているファイルなので、 訳が分からず困っています。 ちなみに音再生スクリプトはフレーム上に以下 //BGM制御用のダミーのムービークリップを作る this.createEmptyMovieClip( "bgm_clip" , 0 ); //BGMの設定 sndbgm = new Sound( bgm_clip ); sndbgm.attachSound( "BGM01" ); sndbgm.setVolume( 100 ); sndbgm.onSoundComplete = function() { //無限ループ再生 sndbgm.start(); }; //BGMを再生 sndbgm.start(); //BGMのボリュームとフェードの速さを管理する変数 bgm_vol = 100; fade_spd = 5; //SE設定 allse = new Sound(); allse.setVolume( 100 ); S1 = new Sound(this); S1.attachSound("SE01"); S2 = new Sound(this); S2.attachSound("SE02"); S3 = new Sound(this); S3.attachSound("SE03"); on/offにはMCで以下の様にしています。 on (release) { if (this._parent.sndbgm.getVolume()>0) { this._parent.sndbgm.setVolume(0); this._parent.allse.setVolume(0); this._parent.v_on_off.gotoAndStop("soundOFF"); } else if (this._parent.sndbgm.getVolume()<=0) { this._parent.sndbgm.setVolume(100); this._parent.allse.setVolume(100); this._parent.v_on_off.gotoAndStop("soundON"); } } SE再生にはフレーム上に S1.start(); と入れています。 使用バージョンはCS4になります。 どなたか判る方、教えて下さい。

    • ベストアンサー
    • Flash
  • 音声の出だしの音量だけがsetVolumeで制御が利かない。

    SoundオブジェクトのattachSoundを利用して、フレームに音声を割り当て、再生しているのですが、 最初の出だし部分の音だけが、setVolumeで設定した音量を無視して、ライブラリに取り込んだままの音声で再生されてしまいます。 その後は、setVolumeで設定した音量にすぐにもどります。 自分的には、インスタンス化したSoundがsetVolumeで制御されるよりも先に再生されてしまう為、出だし部分だけ音量制御が利かないのでは? と思うのですが、良い解決方法がみつからず、悩んでおります。 コードは下記のようにしてます。 bgSound = new Sound(this); bgSound.attachSound("sound1"); bgSound.start(0, 1); slider.slideBar._y = -30; slider.slideBar.onEnterFrame = function() {     bgSound.setVolume(0-this._y); } slider.slideBar.onEnterFrame = function() { bgSound.setVolume(0-this._y); _global.vol = this._y }; slider.slideBar.onPress = function() { startDrag(this, false, this._x, -60, this._x, -0); }; slider.slideBar.onRelease = slider.slideBar.onReleaseOutside=function () { stopDrag(); }; 宜しくお願いします。

    • ベストアンサー
    • Flash
  • 外部読み込みムービー上の音楽制御

    ステージにムービークリップを置いて、そこに外部のムービーを読み込んでいます。 その外部のムービー上で音楽が流れており、その音楽のボリュームを変えたいと思っているのですが、どうもうまく行かないのです。 下記はボリュームオン・オフ用のムービークリップに書いたスクリプトです。(music_button) //クリックされた時にオン・オフを切り替える on(press){ music = music * (-1); //サウンドのオンオフを切り替える s1_sound.setvolume(music*100); if (music = 1){s1_sound.start();} else{s1_sound.stop();} } 外部のムービークリップ上の音楽には「BGM」という識別子をつけています。 上記のmusic_buttonの置いてあるメインタイムラインの2フレーム前で _global.s1_sound = new Sound(); s1_sound.attachsound("BGM"); という宣言をしています。 何か音楽を制御するための要素が足りないのでしょうか。あるいは、階層の指定などが間違っているのでしょうかね。。。 何か手がかりをご存知の方よろしくお願いします。

    • ベストアンサー
    • Flash
  • flashで音を消す設定について

    たびたびの質問で失礼します。 flashでクイズゲームを作成中です。 正解時と不正解時、それぞれに効果音("ok"、"ng")を設定しているのですが、音を出さないようにするためのボタンをつける方法がわかりません。 これまでに試したのは、ゲーム開始前の1フレーム目にボタンを設置して、以下のようにActionScriptを書いてみたのですが、まったく反応しません。 まったく見当違いのような気もするのですが解決方法が分かりません。 正しい方法をアドバイス、お願いいたします! -------------------------------------------- ※フレーム1に snd_1=new Sound(); snd_1.attachSound("ok"); snd_2=new Sound(); snd_2.attachSound("ng"); ※ボタンに on (release) { snd_1.stop( ); } on (release) { snd_2.stop( ); }

  • Flashでアニメーションとサウンドを違うタイミングでループさせたい

    こんばんは! Flash8を使ってHPにアップするSWFファイルを作成しています。 アニメーションもサウンドもループ再生させたいのですが、アニメーションの長さとサウンドの長さが違いうまくループさせることができません。 アニメーションは56秒、サウンドは1分48秒という感じです。 さらに、サウンドはON・OFFで音が制御できるようになっています。 下記のスクリプトで挑戦してみたのですが、ON・OFFを押すたび音が増えて輪唱のように何重にも重なって聞こえてきます。 「ON・OFFムービークリップ1フレーム目」 stop(); _root.soundA = new Sound(); _root.soundA.attachSound("00000.mp3"); _root.soundA.start(0,999); 「シーンにおいたON・OFFムービークリップ」 on (release) { if (_root.soundA.getVolume()>0) { _root.soundA.setVolume(0); _root.on_off.gotoAndStop("soundoff"); trace(_root.soundA.getVolume()); } else if (_root.soundA.getVolume()<=0) { _root.soundA.setVolume(100); _root.on_off.gotoAndStop("soundon"); } } 質問内容がわかりにくいかもしれませんが、ご回答よろしくお願いします。

  • サウンドの同期(スクリプトでタイムラインにサウンドを埋め込んだ場合)

    音がどうしてもずれて非常に困っています。 タイムラインに直接サウンドファイルを埋め込む場合は、「ストリーミング」を選択して同期をとることができますが、スクリプトによって埋め込んだ場合はどのようにして同期をとることができるのでしょうか? たとえば次のように最初のフレームに書きます。 mySound1.attachSound("001.wav"); mySound1 = new Sound(); そしてフレームのたとえば100番目でこの音を再生するために、100番目のタイムラインに次のように記述します。 mySound1.start(); このようにするとなぜか音の再生が遅れるのです。 お助けください。 環境:flash8 AS2.0 WindowsXP

    • ベストアンサー
    • Flash
  • setVolumeで設定するとフレームの音量が下がる

    質問失礼いたします。 setVolumeで下記のように設定します obaとotoは変数です。 Oba=new Sound(); Oba.attachSound("obake"); Oba.setVolume(10); Oba.start(0,999); Oto.setVolume(0); この設定をするとOtoで設定したボリュームになってしまい。 Obaの方の音量も0になってしまいます。 バラバラに設定したいのですが、どうしたらいいでしょうか。 ちなみに Oba.attachSound("obake"); のobakeはリンゲージから音の識別子につけた名前です。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • FLASH MX で「繰り返しのスクリプト」を教えてください。

    タイムラインに配置されていないサウンドを、スクリプトを使って鳴らそうと思い、スクリプトをPLAYボタンに設定しました。 on (press) { rootSound = new Sound(_root); rootSound.attachSound("xxx.mp3"); rootSound.start(); } これでボタンを押すと鳴るようにはなりましたが この「xxx.mp3」は短いので繰り返して鳴らす場合は どのようにスクリプトを付け加えたらいいのでしょうか?(たとえば、100回繰り返す) 教えてください。 よろしくお願いします。

  • 外部ムービーを読み込んだとき音が鳴らなくて困っています.

    外部のムービーにサウンドオブジェクトを作ってattachしてstartするスクリプトを書いているのですが,そのswfファイルを他のswfファイルからloadMovieしたときに読み込まれたswfファイルの音が出ないのです.助けてください;; 読み込まれるswfのスクリプトをのせておきます. s1_sound = new Sound(); s1_sound.attachSound("midi1.aif"); s1_sound.start(0,999);

    • ベストアンサー
    • Flash
  • 既に配置されているMCを外部から制御する(2)

    度々申し訳ございません。 分かったつもりだったのですが、MCを動かすしかできませんでした。 これは間違いでしょうか? onClipEvent(mouseDown){ a=a+1; my_sound2.start(0,1); Play(); } クリックがあったときに 変数のカウントをして 音を鳴らすだけの事なのですが クリップイベントでは使えないのでしょうか? 音も鳴りませんし、変数にも代入されていないようなのです。 お手数ですが、宜しくお願いします。 尚、メインタイムラインの一番最初のフレームで 変数の宣言(?) a=0; と、 音の設定 my_sound2=new Sound(); my_sound2.attachSound("gan1"); は済ませてあります。 ライブラリのリンケージ登録も完了しています。

    • ベストアンサー
    • Flash

専門家に質問してみよう