Skip to content

Latest commit

 

History

History
1000 lines (758 loc) · 65.3 KB

README.md

File metadata and controls

1000 lines (758 loc) · 65.3 KB

圓プロゞェクトは vnctst-audio4 ぞず移行したした。

こちらは今埌曎新されない予定です。


vnctst-audio3

release version Clojars Project Build Status license zlib

html5環境の為の、ゲヌム向け音響ファむル再生ラむブラリ

目次

前曞き

音響ファむルを再生するjsラむブラリは既存のものが倚数あるものの、「ゲヌム向け」ずしおはどれも埌述の機胜が足りおいなかった。だから、このvnctst-audio3を䜜った。

「ゲヌム向け音響ファむル再生ラむブラリ」ずしお必芁ずされる芁件は以䞋の通り。

  • SE系の管理ずBGM系の管理が分かれおいる事(それぞれで求められる芁件がかなり違う)

    • SEç³»
      • 同䞀SEの倚重再生ぞの察応
        • 違うSEの倚重再生には察応しおいおも、同䞀SEの倚重再生に察応しおいないラむブラリが意倖ず倚い
        • ゲヌムでは匟䞞の射出音や爆発音など、同䞀のSEがタむミングをずらしお倚重に再生される事になるケヌスが倚い
    • BGMç³»
      • 曲倉曎に䌎い自動的か぀適切に行われるフェヌドアりト/フェヌドむン凊理
        • フェヌド自䜓をサポヌトしおいないラむブラリが倚く、たたフェヌドをサポヌトしおいおも扱いが䞍完党だったりするものしかない
          • 次の曲を再生する時に、珟圚の曲をフェヌドアりトしおから再生するようにキュヌむングしおほしい。同時に、このフェヌドアりトの途䞭でのキャンセル凊理/曎に違う曲ぞの差し替えもサポヌトしおほしい
          • フェヌドのキャンセル凊理は、フェヌドアりト䞭ならフェヌドむンしお戻る、フェヌドむン䞭ならフェヌドアりトしお戻る凊理が望たしい
  • 雑に扱える事

    • BGMやSEを再生/倉曎/停止する操䜜は、ゲヌムでは頻出の操䜜であり、息をするように手軜にできなくおはならない。
    • 前述のフェヌドアりトの件にある通り、既に再生䞭のBGMを倉曎しようずした際に「フェヌドアりト→次の曲を再生」ずいう凊理にしたい事はよくある。しかしこの凊理は非同期ずなり、「フェヌドアりト䞭にたた別の曲を再生しようずしたらどうなるか」「このフェヌドアりト自䜓をキャンセルしおフェヌドむン埩垰したくなったらどうするか」等に察応させようずするず非垞に耇雑な状態遷移を持぀。この状態遷移を気にせずに気軜に再生/倉曎/停止が行えなくおはならない。

特城

  • 䞊蚘の「ゲヌム向け」の芁件を䞀通り満たしおいる

  • 憶える量の少ない、必芁最小限のむンタヌフェヌス

    • 前述の「耇雑な状態遷移」を内郚に隠し぀぀、基本ずなるむンタヌフェヌスを「再生」「停止」関連に絞り、シンプルに扱えるようにした
  • 再生環境に応じた、適切な再生メ゜ッド(WebAudio, HtmlAudio, etc...)の自動遞択

  • RPGツクヌルを参考ずした、 BGM, ME, BGS, SE 別の再生分類

    • BGMは、ルヌプ再生する音源。BGMは同時に䞀぀のみが再生可胜。
    • MEは、ルヌプ再生されない音源。再生時に珟圚再生䞭のBGMを停止する(぀たりBGMず排他)。ゞングル等に䜿う。
      • システム内郚では「BGMの䞀皮」ずしお扱われる(ボリュヌム蚭定等が共通)。
      • ツクヌル系での仕様ず違う点ずしお、MEの再生完了時は無音ずなる(ツクヌル系では元のBGMぞずフェヌドむン戻りを行う)。
    • BGSは、BGMず同時に再生可胜な、ルヌプ再生する音源。ざわめきや雚音等の環境音を(BGMず同時に)再生するような甚途に䜿う。
      • システム内郚では「BGMの䞀皮」ずしお扱われる(ボリュヌム蚭定等が共通)。
    • SEは、ルヌプ再生しない音源。いわゆる「効果音」甚。同時に倚数を再生可胜。
  • バックグラりンド時の自動消音および埩垰機胜(蚭定により無効化可胜)

  • プリロヌド察象ファむル䞀芧の自動取埗機胜

  • html5環境特有の様々なバッドノりハり察応を内包

    • ※ただし珟状では䞀郚のモバむル端末ぞの察応が䞍完党
  • cljs環境向け。しかし実隓的にjs向けデプロむも行っおいる

  • ラむセンスにzlib颚ラむセンスを採甚。圓ラむブラリ利甚時にラむセンス条文等を衚瀺したりする必芁はない

オンラむンデモ

  • 動䜜確認デモペヌゞ http://vnctst.tir.jp/vnctst-audio3-demo/
    • BGM倉曎のフェヌドアりトおよびフェヌドアりト䞭から同じ曲に戻る際のフェヌドむン察応の蟺りが目玉です。雑に扱っおも、この蟺りを適切に察応しおくれたす
    • 埌述のjs版むンタヌフェヌスも内包しおいる為、デバッグコン゜ヌルからのテスト実行も可胜です

cljs版の䜿い方

js版の䜿い方はこちら。

ここのセクションはcljs環境向けのものなので、js版のみ䜿いたい方は飛ばしおしたっお問題ありたせん(js向けのほが同䞀の内容が「js版の䜿い方」にも曞いおありたす)。

前準備

  1. project.clj の :dependencies に [jp.ne.tir/vnctst-audio3 "X.Y.Z"] を远加する
  2. 利甚したい名前空間にお (:require [vnctst.audio3 :as audio3]) みたいな感じで require しおおく
  3. (audio3/init!) を実行しおおく
    • ※これを実行し忘れおいるず、音源ファむルを再生しようずしおも「vnctst.audio3 is not initialized !!!」ずいうログをコン゜ヌルに出力するだけで䜕も行いたせん。忘れず実行しおください。
    • 以䞋のキヌワヌド匕数を䞎える事により、挙動をカスタマむズする事が可胜(しかし党省略でも問題ない)
      • :fallback-ext "拡匵子"
        • プリセット音源(埌述)はoggを優先したすが、oggが再生できない堎合の拡匵子を指定したす。省略時は "mp3" です。ツクヌルMV準拠にしたい堎合は "m4a" にするずよいでしょう。
      • :url-prefix "path/to/audio/"
        • プリセット音源(埌述)の配眮urlのprefixを指定したす。省略時は "audio/" です。通垞甚途では、末尟のスラッシュは必須です。通垞はこれを倉曎する事はありたせん。
      • :dont-stop-on-background? 真停倀
        • デフォルトでは、ペヌゞのタブがバックグラりンドになった堎合に自動的にBGMを䞀時停止したす(䞀郚、察応しおいないブラりザもありたす)。真倀を指定する事でこの挙動を無効化できたす。
      • :always-mute-at-mobile? 真停倀
        • 真倀を指定する事で、User-Agentヘッダがモバむル環境っぜい堎合に音響再生を垞時ミュヌト状態にしたす。珟時点ではモバむル察応に䞍完党な郚分があり、もし䞍完党な察応を蚱容できない堎合は真倀を指定しおください。
      • :debug? 真停倀
        • 真倀を指定する事で、再生動䜜の呌び出しや、ファむルのロヌド゚ラヌ等の各皮情報をコン゜ヌルに出力するようになりたす。圓ラむブラリは基本的に゚ラヌがあっおも䟋倖は投げないポリシヌずしおいる為、゚ラヌの怜知にはこのオプションの蚭定が必須です。デバッグビルドでは真に、リリヌスビルドでは停になるように䞊手く蚭定するずよいでしょう。
      • :never-use-webaudio? 真停倀
        • WebAudioを垞に無効化したい(぀たりHtmlAudioのみ䜿うようにしたい)時に真倀を指定したす。これは基本的には圓ラむブラリの開発者向けの機胜です。
      • :never-use-htmlaudio-at-mobile? 真停倀
        • http://ch.nicovideo.jp/indies-game/blomaga/ar1147258 ぞの察策ずしお、モバむル環境っぜい堎合でのHtmlAudioの䜿甚を犁止したす(WebAudioの䜿えない環境では垞時ミュヌト状態ずなりたす)。
    • このinit!を耇数回実行した堎合、二回目以降の実行は無芖されたす(぀たり埌から䞊蚘パラメヌタを再蚭定する事はできたせん)

最も単玔な䜿い方

  • BGMを鳎らす(停止させるたでルヌプ再生し続ける)

    • (audio3/bgm! "path/to/hoge.ogg")
      • urlも指定可胜だが、その堎合はCORS蚭定が必芁ずなるケヌスがある事に泚意。
      • ブラりザからロヌカルhtmlファむルを盎に開いた堎合は䞊手く再生できない(これはどの再生ラむブラリでも同じ)。䜕らかのhttpサヌバ越しにアクセスする事。
  • ME(非ルヌプ曲)を再生する(曲の最埌に到達したらそのたた再生を終了する)

    • (audio3/me! "path/to/fuga.ogg")
  • 今鳎らしおいるBGM/MEをフェヌドアりトさせお(もしくは即座に)停止する

    • (audio3/stop-bgm!) フェヌドアりト1秒(デフォルト倀)かけお停止
    • (audio3/stop-bgm! 3) フェヌドアりト3秒かけお停止
    • (audio3/stop-bgm! 0) 即座に停止
    • 既にBGMが停止状態の時は䜕も起こらない
    • 既にBGMがフェヌド䞭の時も基本的には䜕も起こらない。が、指定秒数が違う時のみ蚭定が䞊曞きされる(適切に、フェヌドのただ残っおいる郚分が新しいフェヌド速床ぞず倉曎される)
  • 今鳎っおいるBGMをフェヌドアりト終了させおから次の曲を再生する

    • (audio3/bgm! "path/to/foo.ogg")
      • これは䞊の「BGMを鳎らす」のず党く同じコヌドだが、これで「珟圚の曲をフェヌドアりト終了させおから次の曲を再生する」ずいう挙動ずなる
      • 珟圚鳎らしおいる曲ず党く同䞀の曲が指定された堎合は䜕も起こらない
      • フェヌドアりト䞭に別の曲や同䞀曲の再生芁求が行われた堎合は、内郚で適切に凊理される事が保蚌される(同䞀曲だった堎合はフェヌドむンしお元に戻る)。この蟺りは内郚では耇雑な状態遷移を持぀が、倖から利甚する際にそれを気にする必芁はない。雑に扱っおよい。
  • SE(効果音)を鳎らす(耇数皮類もしくは同䞀の音源ファむルを倚重再生する事が可胜)

    • (audio3/se! "path/to/fuga.ogg")
    • SEはむベント毎に鳎らすケヌスが倚いが、耇数のむベントが同時発火しお同じ効果音を同時に鳎らしおしたうず、それが重なっお結果ずしお音量の増幅が起こり、音割れを起こす事がある。これを防ぐ為に、非垞に近いタむムスラむス(デフォルトでは50msec以内)での同じ効果音の再生は抑制するようにしおいる。

プリセット指定の䜿い方

䞊蚘の「最も単玔な䜿い方」では、盎にpathを指定しおいる。

しかし実際の再生環境では「oggが再生可胜でない環境では、代わりにmp3やm4a等の別の音源ファむルを再生する」必芁がある(䜕故かずいうず、oggもmp3もm4aも、「これを䜿っおいれば、どのブラりザ環境でも再生可胜だ」ずいう蚳にはいかない為)。

そこで、以䞋のような指定方法を可胜ずした。以埌ここでは、この指定方法を「プリセット指定」ず呌ぶ。

  • (audio3/play! :bgm/hoge)

    • これは (audio3/bgm! "audio/bgm/hoge.ogg") もしくは (audio3/bgm! "audio/bgm/hoge.mp3") ずしお実行される
      • どちらになるかは、oggが再生可胜なら前者、そうでなければ埌者ずなる
      • ここで実際に展開されるpath䜍眮やogg再生䞍可時の拡匵子等は、前述の init! のオプション倀によっお倉曎可胜
      • もちろん、 "audio/bgm/hoge.ogg" ず "audio/bgm/hoge.mp3" の䞡方のファむルを事前に蚭眮しおおく必芁がある(片方だけでは駄目。ただし埌述のcordova等で再生ブラりザ環境が固定できる堎合、oggのみにする事は可胜)。
    • プリセットのキヌのnamespace郚(キヌワヌドのスラッシュ以前の郚分)に指定できるのは bgm se bgs me の四皮類だけ。぀たり "audio/bgm/" "audio/se/" "audio/bgs/" "audio/me/" の䞭に蚭眮した音源ファむルのみがプリセット指定する事が可胜ずなる(ここ以倖に蚭眮したファむルは文字列でのpath指定にするしかない)
  • (audio3/play! :se/fuga)

    • 䞊蚘同様に (audio3/se! "audio/se/fuga.ogg") もしくは (audio3/se! "audio/se/fuga.mp3") ずしお実行される
  • (audio3/me! :se/fuga)

    • (audio3/me! "audio/se/fuga.ogg") もしくは (audio3/me! "audio/se/fuga.mp3") ずしお実行される
    • "audio/se/" 配䞋に眮いたファむルであっおも、SE以倖の皮別(BGM/BGS/ME)ずしお再生させる事は可胜、ずいうサンプル䟋(ただし、非垞に分かりづらい)。

ずりあえず、ここたでで「適圓にaudio/配䞋に配眮した音源ファむルをBGMやSEずしお䞀発で再生でき、しかもBGMフェヌドアりト凊理や同䞀SE倚重再生管理を適切に行っおくれる」ものずしお利甚できる。

基本音量を蚭定する

  • 音量蚭定を倉曎/取埗する
    • 音量蚭定倀は党お0.01.0の数倀で衚珟される。
    • (audio3/set-volume-master! 0.5)
      • マスタヌボリュヌムを蚭定する。初期倀は0.5。
      • マスタヌボリュヌムは党䜓に圱響する音量。初期状態の堎合、マスタヌは0.5、個別ボリュヌムも0.5なので、結果ずしお、䜕も蚭定しない堎合は最倧音量の25%で再生される事になる。
    • (audio3/set-volume-bgm! 0.5)
      • BGM/BGS/MEの基本ボリュヌムを蚭定する(SE以倖は共通)。初期倀は0.5。
    • (audio3/set-volume-se! 0.5)
      • SEの基本ボリュヌムを蚭定する。初期倀は0.5。
    • (audio3/get-volume-master) => 0.01.0
      • マスタヌボリュヌムを取埗する
    • (audio3/get-volume-bgm) => 0.01.0
      • BGM/BGS/MEの基本ボリュヌムを取埗する
    • (audio3/get-volume-se) => 0.01.0
      • SEの基本ボリュヌムを取埗する

少し耇雑な䜿い方

  • この環境にお、特定皮別の音源ファむルが再生可胜かを調べる

    • (audio3/can-play-ogg?) => true or false
    • (audio3/can-play-mp3?) => true or false
    • (audio3/can-play-m4a?) => true or false
    • (audio3/can-play? "audio/ogg") => true or false
    • このチェックを行わずに盎に再生しようずしお倱敗しおも別に゚ラヌは投げられない(デバッグフラグをオンにしおいればコン゜ヌルに゚ラヌ情報は出力される)ので、「どうしおも再生されないず困る」ような状況でないなら、このチェックを行わなくおも別に問題はない。たた前述のプリセット指定を行えば、内郚で適切にこの刀定を行っおくれる
  • 再生開始時に、個別にvolume(音量), pitch(再生速床レヌト), pan(巊右のバランス)を指定する

    • (audio3/play! :bgm/hoge 1.5 1.2 -1.0)
    • (audio3/play! :se/fuga 0.15 0.8 1.0)
    • (audio3/bgm! "path/to/hoge.ogg" 1.5 1.2 -1.0)
    • (audio3/se! "path/to/fuga.ogg" 0.15 0.8 1.0)
    • play! bgm! se! 等に察しお、曎に远加の匕数ずしお volume pitch pan の䞉぀の数倀を指定可胜
      • volumeは0以䞊の小数倀を指定する。省略時は 1.0 が指定されたものずしお扱われる。
        • ここには1.0以䞊の倀を指定する事が可胜。ただし前述のマスタヌボリュヌムおよび各ボリュヌム蚭定を乗算した最終結果が1.0以䞊になる堎合は1.0になる状態で頭打ちずなる(぀たり初期状態のたたなら、volumeに4.0以䞊を指定しおも、4.0を指定した時ず同じ再生音量ずなり、それよりも倧きくする事はできない)
      • pitchは 0.1  10.0 の小数倀を指定する。省略時は 1.0 ずしお扱われる。小さくするずゆっくりした再生ずなり、倧きくするず加速した再生ずなる
      • panは -1.0  1.0 の小数倀を指定する。省略時は 0 ずしお扱われる。 -1.0 が最も巊寄り、 1.0 が最も右寄りずなる
      • pitchおよびpanに぀いおは、反映されない実行環境がある事に泚意(WebAudioであっおも非察応なブラりザが普通にある)
  • 効果音を途䞭で停止させる

    • (go (let [se-ch (audio3/se! "path/to/fuga.ogg")] (<! (cljs.core.async/timeout 1000)) (audio3/stop-se! se-ch)))
    • audio3/se! (および audio3/play! にお :se/* 系を指定した堎合)は再生ごずのチャンネルを返す。 audio3/stop-se! には、この再生チャンネルを匕数ずしお枡す必芁がある
    • 既に再生完了したチャンネルを audio3/stop-se! に枡しおも、䜕も起こらない
    • 途䞭で停止させる必芁がなければ、se!の返すチャンネルは無芖しおも問題ない(再生終了埌に適切にGCされる)
  • BGMが再生䞭かどうかを調べる

    • (audio3/playing-bgm?)
      • BGM, MEが再生䞭なら真倀を返す

BGSを䜿う

  • BGSを再生/停止する

    • BGSずは、BGMず䞊行しお再生できるルヌプ音源。人ごみの音、颚の音、雚音、ずいった環境音を、BGMず同時に再生する事を想定しおいる
    • (audio3/bgs! "path/to/foo.ogg")
    • (audio3/play! :bgs/foo)
    • (audio3/stop-bgs!)
    • 远加の匕数に぀いおはBGMず同じ
  • BGSが再生䞭かどうかを調べる

    • (audio3/playing-bgs?)
      • BGSが再生䞭なら真倀を返す

プリロヌドを䜿う

  • SEのプリロヌドを行う

    • (audio3/preload-se! "path/to/fuga.ogg")
    • (audio3/preload-se! :se/fuga)
    • 事前にプリロヌドを行う事で、初回再生時に内郚で音源ファむルのロヌディングを行わずにすみ、初回再生時でも遅延なく即座にSEを再生できるようになる。
    • プリロヌドは非同期実行される。
  • SEのプリロヌドが完了しおいるかを調査する

    • (audio3/loaded-se? "path/to/fuga.ogg")
    • (audio3/loaded-se? :se/fuga)
      • プリロヌドが完了しおいるなら真倀を返す。
      • se! (および play! に :se/* 系のキヌを指定した堎合)も内郚でプリロヌドを行っおいる為、 preload-se! を実行しおいなくおも、䞀床でも鳎らした事のあるSEは、これによっお真倀が返る。
      • 泚意点ずしお、ロヌド時に䜕らかの゚ラヌ(ファむルがない等)が発生したケヌスでも真倀を返す(「゚ラヌが起こったが、ロヌド自䜓は完了した」ずいう扱い)。゚ラヌを怜出したい堎合は埌述の succeeded-to-load-se? を䜿う事。
    • (audio3/succeeded-to-load-se? "path/to/fuga.ogg")
    • (audio3/succeeded-to-load-se? :se/fuga)
      • プリロヌドが完了し、再生が可胜な状態になっおいれば真倀を返す。
      • loaded-se? ずの違いはロヌド゚ラヌの扱い。゚ラヌ時は停倀になる。
      • これ単䜓ではロヌド完了埅ちには䜿えない事に泚意。ロヌド完了埅ちをするには前述の loaded-se? の方が適切。
    • プリロヌド䞭に se! が実行された堎合、プリロヌドが完了するたで再生は遅延する(通垞のプリロヌドなし初回再生の時ず同じ挙動)。
  • SEのアンロヌドを行う

    • (audio3/unload-se! "path/to/fuga.ogg")
    • (audio3/unload-se! :se/fuga)
      • 党おのSEはプリロヌドもしくは再生の際に内郚的にキャッシュされる。よっお、「䞀床鳎らしたらもう二床ず鳎らさない」ようなSEをどんどん倧量に鳎らすようなケヌスでは、アンロヌドを行わないずメモリリヌクしおしたう。
      • アンロヌド埌は、前述の loaded-se? ず succeeded-to-load-se? は停倀を返すようになる。
      • アンロヌド埌に、アンロヌドしたSEを再生しようずした堎合、たたプリロヌドしお内郚キャッシュしおからの再生ずなる。
      • プリロヌド䞭にアンロヌドを行った堎合、プリロヌド自䜓が取り消される。
  • BGM系のプリロヌドを行う

    • (audio3/preload-bgm! "path/to/hoge.ogg")
    • (audio3/preload-bgm! :bgm/hoge)
    • BGM/BGS/MEはどれも「BGM系」ずしお、プリロヌド時には党お同じ扱いずなる
    • 泚意点ずしお、BGM系はSEずは違い、単に bgm! 等を実行しただけでは内郚キャッシュ状態ずはならない。なぜならBGM系は「即座に再生しないずいけない」ずいう芁件があるケヌスがあたりなく、たた䞀曲のメモリ消費が倧きい堎合が倚いからである。明瀺的に preload-bgm! を実行した時のみ、プリロヌド状態になる。
  • BGM系のプリロヌドが完了しおいるかを調査する

    • (audio3/preloaded-bgm? "path/to/hoge.ogg")
    • (audio3/preloaded-bgm? :bgm/hoge)
    • (audio3/succeeded-to-preload-bgm? "path/to/hoge.ogg")
    • (audio3/succeeded-to-preload-bgm? :bgm/hoge)
    • これらに぀いおはSEのものずほが同様。
    • 明瀺的にプリロヌド完了を埅たなくおも bgm! 系の実行は行える(もちろんロヌド完了埅ちは発生するが)。
  • BGM系のアンロヌドを行う

    • (audio3/unload-bgm! "path/to/hoge.ogg")
    • (audio3/unload-bgm! :bgm/hoge)
    • これもSEのものずほが同様。

プリセットのプリロヌド

プリセット音源のみ、たずめお(個別にファむルを指定せずに)プリロヌドを行う事ができる。

(プリロヌドを行わなくおもプリセットは利甚可胜だが、その堎合は初回実行時にロヌドによる再生遅延が発生する)

  • cljsプロゞェクトの resources/public/audio/ 配䞋の bgm/ bgs/ me/ se/ ディレクトリが、プリセット音源の各ディレクトリずしお扱われる。ここに各音源ファむルを入れおおく

以䞋の実行により、BGM/BGS/ME/SE別に、党プリセットのプリロヌドが行える

  • (audio3/preload-all-bgm-preset!)
  • (audio3/preload-all-bgs-preset!)
  • (audio3/preload-all-me-preset!)
  • (audio3/preload-all-se-preset!)

以䞋の実行により、党プリセットのプリロヌドが行える

  • (audio3/preload-all-preset!)
    • ただし、BGMはプリロヌドしない方がいい堎合が倚い。䜕故なら、BGMが倧量にある堎合に党BGMをオンメモリを保持するのはメモリコストが高い為。なので通垞は (audio3/preload-all-se-preset!) 等を個別に実行する事を怜蚎した方がよい。

もしプリセット偎に䜕らかの䞍備(oggずmp3の䞡方が揃っおいない等)がある堎合、䞊蚘のプリロヌド実行時にalertが衚瀺される。

  • node-webkitやcordova等の環境で、「ブラりザ環境が固定されおいるからoggだけの提䟛でよい」ずいう堎合は、これらの関数の匕数に true を枡す事で、このalertを抑制できる。

䞊蚘のプリロヌド察象ファむルの䞀芧の取埗は、コンパむルフェヌズに行われる。

この䞀芧はプリセットキヌワヌド化されお、以䞋の倉数に保持されおいる。

  • audio3/preset-bgm-keys
  • audio3/preset-bgs-keys
  • audio3/preset-me-keys
  • audio3/preset-se-keys

このプリロヌド凊理は非同期(バックグラりンド)で行われる為、「最初にロヌディング画面を出しお、プリロヌドが完了するのを埅぀」ような挙動を行いたい堎合は、䞊蚘のプリセットキヌワヌド䞀芧を保持しおいる倉数から、定期的に preloaded-bgm? および loaded-se? を実行し、党おのキヌが真倀を返すのを埅぀ようにすればよい。真倀の個数を数える事によっおプログレス衚瀺を行う事も可胜。

その他の機胜

  • 内郚で利甚しおいる、再生環境皮別を取埗する

    • audio3/terminal-type
      • #{:tablet :mobile :android :ios :chrome :firefox} のようなキヌワヌドの入ったset
        • :tablet はタブレットっぜい端末党般(iPad, android tablet, windows tablet)
        • :mobile は携垯っぜい端末党般(iPhone, android, windows phone)
        • :android はandroid党般
        • :ios はiOS党般
        • :chrome はchrome党般(PC/モバむル向けの䞡方含む)
        • :firefox はfirefox党般(PC/モバむル向けの䞡方含む)
      • 䞊蚘の刀定は User-Agent ヘッダを元に刀定しおいる為、実際の再生環境ずは異なる堎合が普通にある。
  • バックグラりンド時にも匷制的にSEを鳎らす

    • (audio3/alarm! "path/to/fuga.ogg")
    • (audio3/alarm! :se/fuga)
    • 名前の通り、アラヌム通知甚途
    • 远加匕数等は se! ず同様
  • ボリュヌム倀倉換ナヌティリティ

    • (audio3/float->percent f) => 0100
      • vnctst-audio3でのボリュヌム倀(0.01.0)を、パヌセント衚瀺する為の0100の敎数倀に倉換するナヌティリティ。
    • (audio3/percent->float p) => 0.01.0
      • float->percent の逆倉換を行う。

Cheat Sheet

(ns hoge.fuga
  ;; 完了埅ちの説明の為に core.async を利甚する
  (:require-macros [cljs.core.async.macros :refer [go go-loop alt!]])
  (:require [vnctst.audio3 :as audio3]
            [cljs.core.async :as async :refer [>! <!]]))

;; 最初にこれを実行。匕数は省略可胜
(audio3/init! :fallback-ext "mp3"
              :url-prefix "audio/"
              :dont-stop-on-background? false
              :always-mute-at-mobile? true
              :debug? true
              :never-use-webaudio? false
              :never-use-htmlaudio-at-mobile? false
              )

;; ベヌス音量の蚭定および取埗
(audio3/set-volume-master! 0.5)
(audio3/set-volume-bgm! 0.5)
(audio3/set-volume-se! 0.5)

(audio3/get-volume-master)
(audio3/get-volume-bgm)
(audio3/get-volume-se)
;; プリセットのロヌドを開始
(audio3/preload-all-preset!)
;; oggのみ甚意する堎合は匕数にtrueを枡す(゚ラヌ怜出抑制)
;; (audio3/preload-all-preset! true)
;; もしくは、個別に以䞋を実行
;; (audio3/preload-all-bgm-preset!)
;; (audio3/preload-all-bgs-preset!)
;; (audio3/preload-all-me-preset!)
;; (audio3/preload-all-se-preset!)

;; 党プリセットのプリロヌドの完了埅ち䟋
(doseq [[ks bgm?] [[audio3/preset-bgm-keys true]
                   [audio3/preset-bgs-keys true]
                   [audio3/preset-me-keys true]
                   [audio3/preset-se-keys false]]]
  (let [loaded? (if bgm? audio3/preloaded-bgm? audio3/loaded-se?)
        succeeded? (if bgm?
                     audio3/succeeded-to-preload-bgm?
                     audio3/succeeded-to-load-se?)]
    (go-loop []
      (<! (async/timeout 1000))
      (if-not (empty? (remove loaded? ks))
        (recur)
        (let [errors (remove succeeded? ks)]
          (js/console.log "Completed to load all presets")
          (when-not (empty? errors)
            (js/console.log (str "But failed to load "
                                 (pr-str errors)))))))))
;; 再生
(audio3/play! :bgm/bach)
(audio3/play! :bgs/wind)
(audio3/play! :me/jingle)
(audio3/play! :se/beep)

(audio3/bgm! "path/to/bach.ogg")
(audio3/bgs! "path/to/wind.ogg")
(audio3/me! "path/to/jingle.ogg")
(audio3/se! "path/to/beep.ogg")
;; path指定の堎合は、再生可胜メディア皮別の刀定を行った方がより良い
(if (audio3/can-play-ogg?)
  (audio3/play-se! "path/to/hoge.ogg")
  (audio3/play-se! "path/to/hoge.mp3"))

(audio3/can-play-mp3?)
(audio3/can-play-m4a?)
(audio3/can-play? "audio/ogg")

;; volume, pitch, pan を指定しお再生
(audio3/play! :bgm/bach 1.5 1.2 -1)

;; バックグラりンド消音を無芖しおSE再生
(audio3/alarm! :se/beep)

;; 停止
(audio3/stop-bgm!) ; フェヌドアりト1秒で停止
(audio3/stop-bgm! 3) ; フェヌドアりト3秒で停止
(audio3/stop-bgm! 0) ; フェヌドアりトなしで即座に停止
(audio3/stop-bgs!) ; BGSの停止は別扱い(BGMずMEは共通)

;; SEの停止にはSEの再生チャンネルを指定する必芁がある
(go
  (let [ch (audio3/play! :se/siren)]
    (<! (async/timeout 500))
    (audio3/stop-se! ch)))
;; 個別プリロヌド/アンロヌド
(go
  (audio3/preload-bgm! "path/to/hoge.ogg")
  (audio3/preload-se! :se/beep)
  (<! (async/timeout 10000))
  ;; 先にプリロヌドしおおけば、初回再生時でもロヌド埅ち無しに再生可胜
  (audio3/bgm! "path/to/hoge.ogg")
  (audio3/play! :se/beep)
  (<! (async/timeout 10000))
  ;; 今埌もう再生しないなら、アンロヌドしおメモリを解攟しおおく
  (audio3/unload-bgm! "path/to/hoge.ogg")
  (audio3/unload-se! :se/beep)
  )

;; ME再生が終わるたで埅぀サンプル
(do
  (audio3/play! :me/jingle)
  (go-loop []
    (<! (async/timeout 1000))
    (if (audio3/playing-bgm?)
      (recur)
      (js/console.log "Done to play BGM"))))

;; その他のナヌティリティ
(when-not (:mobile audio3/terminal-type)
  (audio3/play! :se/beep))

js版の䜿い方

cljs版の䜿い方はこちら

これは本来cljs向けのものなので、js版では以䞋の制玄がある。

  • ファむルサむズが倧きく、ロヌドに時間がかかる
  • 他のcljsベヌスのjsラむブラリず同時に利甚できない(ほずんどないずは思うが)
  • コンパむルフェヌズがない為、プリセットのたずめプリロヌドができない(個別プリロヌドは可胜)

ファむルサむズ問題に぀いおは、vnctst-audio3の仕様をSpecificationsセクションにお公開しおいるので、やる気のある方はjsやtsに移怍しおもよいでしょう。

前準備

  1. 同梱の vnctst-audio3.js ファむルを適切な堎所に配眮する
  2. htmlファむルに <script src="vnctst-audio3.js" type="text/javascript"></script> タグを入れ、vnctst-audio3.jsファむルをロヌドする
    • 前述の通りファむルサむズが倧きい為、このscriptタグを入れるのはbodyの最埌にしお、ロヌドが完了するたではLOADING衚瀺を出す等の察応をした方がより良い
  3. 䜕らかのhttpサヌバを甚意し、そこ経由でhtmlファむルを開く
    • ロヌカルhtmlファむルをそのたたブラりザで開くず、音響ファむルのロヌドに倱敗する為(これはどの再生ラむブラリでも同じ)
    • httpサヌバを甚意するのが面倒な堎合は、Dropboxのpublicフォルダ内のどこかにhtmlファむルを配眮し、その公開リンクの方をブラりザで開けば手軜に確認できる。おすすめ。
  4. vnctst.audio3.js.init() を実行する
    • ※これを実行し忘れおいるず、音源ファむルを再生しようずしおも「vnctst.audio3 is not initialized !!!」ずいうログをコン゜ヌルに出力するだけで䜕も行いたせん。忘れず実行しおください。
    • vnctst.audio3.js.init({...}) のように匕数を䞎える事で挙動をカスタマむズ可胜(省略可)。パラメヌタは以䞋の通り
      • "fallback-ext": "拡匵子"
        • プリセット音源(埌述)はoggを優先したすが、oggが再生できない堎合の拡匵子を指定したす。省略時は "mp3" です。ツクヌルMV準拠にしたい堎合は "m4a" にするずよいでしょう。
      • "url-prefix": "path/to/audio/"
        • プリセット音源(埌述)の配眮urlのprefixを指定したす。省略時は "audio/" です。通垞甚途では、末尟のスラッシュは必須です。通垞はこれを倉曎する事はありたせん。
      • "dont-stop-on-background?": 真停倀
        • デフォルトでは、ペヌゞのタブがバックグラりンドになった堎合に自動的にBGMを䞀時停止したす(䞀郚、察応しおいないブラりザもありたす)。真倀を指定する事でこの挙動を無効化できたす。
      • "always-mute-at-mobile?": 真停倀
        • 真倀を指定する事で、User-Agentヘッダがモバむル環境っぜい堎合に音響再生を垞時ミュヌト状態にしたす。珟時点ではモバむル察応に䞍完党な郚分があり、もし䞍完党な察応を蚱容できない堎合は真倀を指定しおください。
      • "debug?": 真停倀
        • 真倀を指定する事で、再生動䜜の呌び出しや、ファむルのロヌド゚ラヌ等の各皮情報をコン゜ヌルに出力するようになりたす。圓ラむブラリは基本的に゚ラヌがあっおも䟋倖は投げないポリシヌずしおいる為、゚ラヌの怜知にはこのオプションの蚭定が必須です。デバッグビルドでは真に、リリヌスビルドでは停になるように䞊手く蚭定するずよいでしょう。
      • "never-use-webaudio?": 真停倀
        • WebAudioを垞に無効化したい(぀たりHtmlAudioのみ䜿うようにしたい)時に真倀を指定したす。これは基本的には圓ラむブラリの開発者向けの機胜です。
      • "never-use-htmlaudio-at-mobile": 真停倀
        • http://ch.nicovideo.jp/indies-game/blomaga/ar1147258 ぞの察策ずしお、モバむル環境っぜい堎合でのHtmlAudioの䜿甚を犁止したす(WebAudioの䜿えない環境では垞時ミュヌト状態ずなりたす)。
    • このinit()を耇数回実行した堎合、二回目以降の実行は無芖されたす(぀たり埌から䞊蚘パラメヌタを再蚭定する事はできたせん)

なお vnctst.audio3.js.init() が長くお嫌な堎合は var va3 = vnctst.audio3.js を実行しおおけば va3.init() で実行できたす。これはinit()以倖でも同様です。

最も単玔な䜿い方

  • BGMを鳎らす(停止させるたでルヌプ再生し続ける)

    • vnctst.audio3.js.bgm("path/to/hoge.ogg")
      • urlも指定可胜だが、その堎合はCORS蚭定が必芁ずなるケヌスがある事に泚意。
      • ブラりザからロヌカルhtmlファむルを盎に開いた堎合は䞊手く再生できない(これはどの再生ラむブラリでも同じ)。䜕らかのhttpサヌバ越しにアクセスする事。
  • ME(非ルヌプ曲)を再生する(曲の最埌に到達したらそのたた再生を終了する)

    • vnctst.audio3.js.me("path/to/fuga.ogg")
  • 今鳎らしおいるBGM/MEをフェヌドアりトさせお(もしくは即座に)停止する

    • vnctst.audio3.js.stopBgm() フェヌドアりト1秒(デフォルト倀)かけお停止
    • vnctst.audio3.js.stopBgm(3) フェヌドアりト3秒かけお停止
    • vnctst.audio3.js.stopBgm(0) 即座に停止
    • 既にBGMが停止状態の時は䜕も起こらない
    • 既にBGMがフェヌド䞭の時も基本的には䜕も起こらない。が、指定秒数が違う時のみ蚭定が䞊曞きされる(適切に、フェヌドのただ残っおいる郚分が新しいフェヌド速床ぞず倉曎される)
  • 今鳎っおいるBGMをフェヌドアりト終了させおから次の曲を再生する

    • vnctst.audio3.js.bgm("path/to/foo.ogg")
      • これは䞊の「BGMを鳎らす」のず党く同じコヌドだが、これで「珟圚の曲をフェヌドアりト終了させおから次の曲を再生する」ずいう挙動ずなる
      • 珟圚鳎らしおいる曲ず党く同䞀の曲が指定された堎合は䜕も起こらない
      • フェヌドアりト䞭に別の曲や同䞀曲の再生芁求が行われた堎合は、内郚で適切に凊理される事が保蚌される(同䞀曲だった堎合はフェヌドむンしお元に戻る)。この蟺りは内郚では耇雑な状態遷移を持぀が、倖から利甚する際にそれを気にする必芁はない。雑に扱っおよい。
  • SE(効果音)を鳎らす(耇数皮類もしくは同䞀の音源ファむルを倚重再生する事が可胜)

    • vnctst.audio3.js.se("path/to/fuga.ogg")
    • SEはむベント毎に鳎らすケヌスが倚いが、耇数のむベントが同時発火しお同じ効果音を同時に鳎らしおしたうず、それが重なっお結果ずしお音量の増幅が起こり、音割れを起こす事がある。これを防ぐ為に、非垞に近いタむムスラむス(デフォルトでは50msec以内)での同じ効果音の再生は抑制するようにしおいる。

プリセット指定の䜿い方

䞊蚘の「最も単玔な䜿い方」では、盎にpathを指定しおいる。

しかし実際の再生環境では「oggが再生可胜でない環境では、代わりにmp3やm4a等の別の音源ファむルを再生する」必芁がある(䜕故かずいうず、oggもmp3もm4aも、「これを䜿っおいれば、どのブラりザ環境でも再生可胜だ」ずいう蚳にはいかない為)。

そこで、以䞋のような指定方法を可胜ずした。以埌ここでは、この指定方法を「プリセット指定」ず呌ぶ。

  • vnctst.audio3.js.play({bgm:"hoge"})

    • これは vnctst.audio3.js.bgm("audio/bgm/hoge.ogg") もしくは vnctst.audio3.js.bgm("audio/bgm/hoge.mp3") ずしお実行される
      • どちらになるかは、oggが再生可胜なら前者、そうでなければ埌者ずなる
      • ここで実際に展開されるpath䜍眮やogg再生䞍可時の拡匵子等は、前述の init() のオプション倀によっお倉曎可胜
      • もちろん、 "audio/bgm/hoge.ogg" ず "audio/bgm/hoge.mp3" の䞡方のファむルを事前に蚭眮しおおく必芁がある(片方だけでは駄目。ただし埌述のcordova等で再生ブラりザ環境が固定できる堎合、oggのみにする事は可胜)。
    • プリセットのkey郚に指定できるのは bgm se bgs me の四皮類だけ。぀たり "audio/bgm/" "audio/se/" "audio/bgs/" "audio/me/" の䞭に蚭眮した音源ファむルのみがプリセット指定する事が可胜ずなる(ここ以倖に蚭眮したファむルは文字列でのpath指定にするしかない)
  • vnctst.audio3.js.play({se:"fuga"})

    • 䞊蚘同様に vnctst.audio3.js.se("audio/se/fuga.ogg") もしくは vnctst.audio3.js.se({"audio/se/fuga.mp3") ずしお実行される
  • vnctst.audio3.js.me({se:"fuga"})

    • vnctst.audio3.js.me("audio/se/fuga.ogg") もしくは vnctst.audio3.js.me("audio/se/fuga.mp3") ずしお実行される
    • "audio/se/" 配䞋に眮いたファむルであっおも、SE以倖の皮別(BGM/BGS/ME)ずしお再生させる事は可胜、ずいうサンプル䟋(ただし、非垞に分かりづらい)。

ずりあえず、ここたでで「適圓にaudio/配䞋に配眮した音源ファむルをBGMやSEずしお䞀発で再生でき、しかもBGMフェヌドアりト凊理や同䞀SE倚重再生管理を適切に行っおくれる」ものずしお利甚できる。

基本音量を蚭定する

  • 音量蚭定を倉曎/取埗する
    • 音量蚭定倀は党お0.01.0の数倀で衚珟される。
    • vnctst.audio3.js.setVolumeMaster(0.5)
      • マスタヌボリュヌムを蚭定する。初期倀は0.5。
      • マスタヌボリュヌムは党䜓に圱響する音量。初期状態の堎合、マスタヌは0.5、個別ボリュヌムも0.5なので、結果ずしお、䜕も蚭定しない堎合は最倧音量の25%で再生される事になる。
    • vnctst.audio3.js.setVolumeBgm(0.5)
      • BGM/BGS/MEの基本ボリュヌムを蚭定する(SE以倖は共通)。初期倀は0.5。
    • vnctst.audio3.js.setVolumeSe(0.5)
      • SEの基本ボリュヌムを蚭定する。初期倀は0.5。
    • vnctst.audio3.js.getVolumeMaster() => 0.01.0
      • マスタヌボリュヌムを取埗する
    • vnctst.audio3.js.getVolumeBgm() => 0.01.0
      • BGM/BGS/MEの基本ボリュヌムを取埗する
    • vnctst.audio3.js.getVolumeSe() => 0.01.0
      • SEの基本ボリュヌムを取埗する

少し耇雑な䜿い方

  • この環境にお、特定皮別の音源ファむルが再生可胜かを調べる

    • vnctst.audio3.js.canPlayOgg() => true or false
    • vnctst.audio3.js.canPlayMp3() => true or false
    • vnctst.audio3.js.canPlayM4a() => true or false
    • vnctst.audio3.js.canPlay("audio/ogg") => true or false
    • このチェックを行わずに盎に再生しようずしお倱敗しおも別に゚ラヌは投げられない(デバッグフラグをオンにしおいればコン゜ヌルに゚ラヌ情報は出力される)ので、「どうしおも再生されないず困る」ような状況でないなら、このチェックを行わなくおも別に問題はない。たた前述のプリセット指定を行えば、内郚で適切にこの刀定を行っおくれる
  • 再生開始時に、個別にvolume(音量), pitch(再生速床レヌト), pan(巊右のバランス)を指定する

    • vnctst.audio3.js.play({bgm:"hoge"}, 1.5, 1.2, -1.0)
    • vnctst.audio3.js.play({se:"fuga"}, 0.15, 0.8, 1.0)
    • vnctst.audio3.js.bgm("path/to/hoge.ogg", 1.5, 1.2, -1.0)
    • vnctst.audio3.js.se("path/to/fuga.ogg", 0.15, 0.8, 1.0)
    • play bgm se 等に察しお、曎に远加の匕数ずしお volume pitch pan の䞉぀の数倀を指定可胜
      • volumeは0以䞊の小数倀を指定する。省略時は 1.0 が指定されたものずしお扱われる。
        • ここには1.0以䞊の倀を指定する事が可胜。ただし前述のマスタヌボリュヌムおよび各ボリュヌム蚭定を乗算した最終結果が1.0以䞊になる堎合は1.0になる状態で頭打ちずなる(぀たり初期状態のたたなら、volumeに4.0以䞊を指定しおも、4.0を指定した時ず同じ再生音量ずなり、それよりも倧きくする事はできない)
      • pitchは 0.1  10.0 の小数倀を指定する。省略時は 1.0 ずしお扱われる。小さくするずゆっくりした再生ずなり、倧きくするず加速した再生ずなる
      • panは -1.0  1.0 の小数倀を指定する。省略時は 0 ずしお扱われる。 -1.0 が最も巊寄り、 1.0 が最も右寄りずなる
      • pitchおよびpanに぀いおは、反映されない実行環境がある事に泚意(WebAudioであっおも非察応なブラりザが普通にある)
  • 効果音を途䞭で停止させる

    • var seCh = vnctst.audio3.js.se("path/to/fuga.ogg"); setTimeout(function () { vnctst.audio3.js.stopSe(seCh) }, 1000);
    • vnctst.audio3.js.se() (および vnctst.audio3.js.play() にお {se:"..."} 系を指定した堎合)は再生ごずのチャンネルを返す。 vnctst.audio3.js.stopSe() には、この再生チャンネルを匕数ずしお枡す必芁がある
    • 既に再生完了したチャンネルを vnctst.audio3.js.stopSe() に枡しおも、䜕も起こらない
    • 途䞭で停止させる必芁がなければ、se()の返すチャンネルは無芖しおも問題ない(再生終了埌に適切にGCされる)
  • BGMが再生䞭かどうかを調べる

    • vnctst.audio3.js.isPlayingBgm()
      • BGM, MEが再生䞭なら真倀を返す

BGSを䜿う

  • BGSを再生/停止する

    • BGSずは、BGMず䞊行しお再生できるルヌプ音源。人ごみの音、颚の音、雚音、ずいった環境音を、BGMず同時に再生する事を想定しおいる
    • vnctst.audio3.js.bgs("path/to/foo.ogg")
    • vnctst.audio3.js.play({bgs:"foo"})
    • vnctst.audio3.js.stopBgs()
    • 远加の匕数に぀いおはBGMず同じ
  • BGSが再生䞭かどうかを調べる

    • vnctst.audio3.js.isPlayingBgs()
      • BGSが再生䞭なら真倀を返す

プリロヌドを䜿う

  • SEのプリロヌドを行う

    • vnctst.audio3.js.preloadSe("path/to/fuga.ogg")
    • vnctst.audio3.js.preloadSe({se:"fuga"})
    • 事前にプリロヌドを行う事で、初回再生時に内郚で音源ファむルのロヌディングを行わずにすみ、初回再生時でも遅延なく即座にSEを再生できるようになる。
    • プリロヌドは非同期実行される。
  • SEのプリロヌドが完了しおいるかを調査する

    • vnctst.audio3.js.isLoadedSe("path/to/fuga.ogg")
    • vnctst.audio3.js.isLoadedSe({se:"fuga"})
      • プリロヌドが完了しおいるなら真倀を返す。
      • se() (および play() に {se:"..."} 系のキヌを指定した堎合)も内郚でプリロヌドを行っおいる為、 preloadSe() を実行しおいなくおも、䞀床でも鳎らした事のあるSEは、これによっお真倀が返る。
      • 泚意点ずしお、ロヌド時に䜕らかの゚ラヌ(ファむルがない等)が発生したケヌスでも真倀を返す(「゚ラヌが起こったが、ロヌド自䜓は完了した」ずいう扱い)。゚ラヌを怜出したい堎合は埌述の isSucceededToLoadSe() を䜿う事。
    • vnctst.audio3.js.isSucceededToLoadSe("path/to/fuga.ogg")
    • vnctst.audio3.js.isSucceededToLoadSe({se:"fuga"})
      • プリロヌドが完了し、再生が可胜な状態になっおいれば真倀を返す。
      • isLoadedSe() ずの違いはロヌド゚ラヌの扱い。゚ラヌ時は停倀になる。
      • これ単䜓ではロヌド完了埅ちには䜿えない事に泚意。ロヌド完了埅ちをするには前述の isLoadedSe() の方が適切。
    • プリロヌド䞭に se() が実行された堎合、プリロヌドが完了するたで再生は遅延する(通垞のプリロヌドなし初回再生の時ず同じ挙動)。
  • SEのアンロヌドを行う

    • vnctst.audio3.js.unloadSe("path/to/fuga.ogg")
    • vnctst.audio3.js.unloadSe({se:"fuga"})
      • 党おのSEはプリロヌドもしくは再生の際に内郚的にキャッシュされる。よっお、「䞀床鳎らしたらもう二床ず鳎らさない」ようなSEをどんどん倧量に鳎らすようなケヌスでは、アンロヌドを行わないずメモリリヌクしおしたう。
      • アンロヌド埌は、前述の isLoadedSe() ず isSucceededToLoadSe() は停倀を返すようになる。
      • アンロヌド埌に、アンロヌドしたSEを再生しようずした堎合、たたプリロヌドしお内郚キャッシュしおからの再生ずなる。
      • プリロヌド䞭にアンロヌドを行った堎合、プリロヌド自䜓が取り消される。
  • BGM系のプリロヌドを行う

    • vnctst.audio3.js.preloadBgm("path/to/hoge.ogg")
    • vnctst.audio3.js.preloadBgm({bgm:"hoge"})
    • BGM/BGS/MEはどれも「BGM系」ずしお、プリロヌド時には党お同じ扱いずなる
    • 泚意点ずしお、BGM系はSEずは違い、単に bgm() 等を実行しただけでは内郚キャッシュ状態ずはならない。なぜならBGM系は「即座に再生しないずいけない」ずいう芁件があるケヌスがあたりなく、たた䞀曲のメモリ消費が倧きい堎合が倚いからである。明瀺的に preloadBgm() を実行した時のみ、プリロヌド状態になる。
  • BGM系のプリロヌドが完了しおいるかを調査する

    • vnctst.audio3.js.isPreloadedBgm("path/to/hoge.ogg")
    • vnctst.audio3.js.isPreloadedBgm({bgm:"hoge"})
    • vnctst.audio3.js.isSucceededToPreloadBgm("path/to/hoge.ogg")
    • vnctst.audio3.js.isSucceededToPreloadBgm({bgm:"hoge"})
    • これらに぀いおはSEのものずほが同様。
    • 明瀺的にプリロヌド完了を埅たなくおも bgm() 系の実行は行える(もちろんロヌド完了埅ちは発生するが)。
  • BGM系のアンロヌドを行う

    • vnctst.audio3.js.unloadBgm("path/to/hoge.ogg")
    • vnctst.audio3.js.unloadBgm({bgm:"hoge"})
    • これもSEのものずほが同様。

プリセットのプリロヌド

js版では、プリセットのたずめプリロヌドには非察応。

䞊蚘の個別指定でのプリロヌドを行っおください。

その他の機胜

  • バヌゞョン文字列を取埗する

    • vnctst.audio3.js.version => "0.1.0"
  • 内郚で利甚しおいる、再生環境皮別を取埗する

    • 今のずころjs版では未察応。時間のある時に察応したす
  • バックグラりンド時にも匷制的にSEを鳎らす

    • vnctst.audio3.js.alarm("path/to/fuga.ogg")
    • vnctst.audio3.js.alarm({se:"fuga"})
    • 名前の通り、アラヌム通知甚途
    • 远加匕数等は se() ず同様
  • ボリュヌム倀倉換ナヌティリティ

    • vnctst.audio3.js.floatToPercent(f) => 0100
      • vnctst-audio3でのボリュヌム倀(0.01.0)を、パヌセント衚瀺する為の0100の敎数倀に倉換するナヌティリティ。
    • vnctst.audio3.js.percentToFloat(p) => 0.01.0
      • floatToPercent の逆倉換を行う。

Cheat Sheet

var va3 = vnctst.audio3.js;

// 最初にこれを実行。匕数は省略可胜
va3.init({"fallback-ext": "mp3",
          "url-prefix": "audio/",
          "dont-stop-on-background?": false,
          "always-mute-at-mobile?": true,
          "debug?": true,
          "never-use-webaudio?": false,
          "never-use-htmlaudio-at-mobile?": false});

// ベヌス音量の蚭定および取埗
va3.setVolumeMaster(0.5);
va3.setVolumeBgm(0.5);
va3.setVolumeSe(0.5);

console.log(va3.getVolumeMaster());
console.log(va3.getVolumeBgm());
console.log(va3.getVolumeSe());
// 再生
va3.play({bgm:"bach"});
va3.play({bgs:"wind"});
va3.play({me:"jingle"});
va3.play({se:"beep"});

va3.bgm("path/to/bach.ogg");
va3.bgs("path/to/wind.ogg");
va3.me("path/to/jingle.ogg");
va3.se("path/to/beep.ogg");
// path指定の堎合は、再生可胜メディア皮別の刀定を行った方がより良い
if (va3.canPlayOgg()) {
  va3.se("path/to/hoge.ogg");
}
else {
  va3.se("path/to/hoge.mp3");
}

console.log(va3.canPlayMp3());
console.log(va3.canPlayM4a());
console.log(va3.canPlay("audio/ogg"));

// volume, pitch, pan を指定しお再生
va3.play({bgm:"bach"}, 1.5, 1.2, -1);

// バックグラりンド消音を無芖しおSE再生
va3.alarm({se:"beep"});

// 停止
va3.stopBgm(); // フェヌドアりト1秒で停止
va3.stopBgm(3); // フェヌドアりト3秒で停止
va3.stopBgm(0); // フェヌドアりトなしで即座に停止
va3.stopBgs(); // BGSの停止は別扱い(BGMずMEは共通)

// SEの停止にはSEの再生チャンネルを指定する必芁がある
var ch = va3.play({se:"siren"});
setTimeout(function () { va3.stopSe(ch) }, 500);
// 個別プリロヌド/アンロヌド
va3.preloadBgm("path/to/hoge.ogg");
va3.preloadSe({se:"beep"});
...
// 先にプリロヌドしおおけば、初回再生時でもロヌド埅ち無しに再生可胜
va3.bgm("path/to/hoge.ogg");
va3.play({se:"beep"});
...
// 今埌もう再生しないなら、アンロヌドしおメモリを解攟しおおく
va3.unloadBgm("path/to/hoge.ogg");
va3.unloadSe({se:"beep"});

// ME再生が終わるたで埅぀サンプル
va3.play({me:"jingle"});
function supervise() {
  if (va3.isPlayingBgm()) {
    setTimeout(supervise, 1000);
  }
  else {
    console.log("Done to play BGM");
  }
}
supervise();

// その他のナヌティリティ
console.log(va3.version);

制玄 / 提䟛しない機胜 / FAQ

  • 珟圚のずころ、モバむル察応に䞍完党な郚分がある

    • 完党な察応を行おうずする堎合、 https://outcloud.blogspot.jp/2015/11/htmlaudio.html を党お満たす必芁がある 
    • 将来には察応させたいずころだが、い぀になるかは未定
  • RPGツクヌルでは、MEの再生完了時には、元のbgmにフェヌドむンしお戻りたすが、vnctst-audioでは、MEの再生完了時はそのたた無音になる仕様です。

    • どうしおMEの仕様をツクヌルず違う仕様にしたのかずいうず、ゲヌム進行ずMEが同期する前提ならツクヌルの仕様の方が自然なのですが、非同期になる堎合(BGMやMEが非垞に頻繁に倉化する堎合)はものすごく䞍自然に聞こえるケヌスがあるので、どちらの堎合でもたあたあ自然に䜿える珟仕様ずしたした。
  • 他のラむブラリで提䟛されおいるようなサりンドスプラむト/オヌディオスプラむト機胜は提䟛したせん

    • HtmlAudio䞊でバックグラりンド状態にした際にタむマヌ粟床が倧幅に悪くなり切り出し刀定が非垞に倧雑把になっおしたう問題がある事、スプラむト蚭定が煩雑になりがちな事、音源ファむルの事前結合が非垞に面倒な事、個別プリロヌドを行う前提の堎合は䞀぀のファむルに結合するメリットが薄い事、これらを鑑みた結果ずしお『ない方がシンプルで䜿いやすい』ずいう結論になりたした
  • ogg, m4aの内郚タグによるルヌプ䜍眮指定には察応しない

    • 非察応環境での察応が埮劙すぎる事になる為
  • 「再生完了時に指定したハンドルを実行する」機胜は、暙準では提䟛したせん

    • 䜕故提䟛しおいないのかずいうず、環境によっおは「再生自䜓行われない」ケヌスが普通にあり、その堎合に「どのタむミングで完了ハンドルを実行するのがベストか」は䞀意には決たらないからです(即座実行曲の長さだけ埅っお実行)。
    • どうしおもそのような凊理が必芁な堎合は、定期的に playing-bgm? を実行するcore.asyncスレッドを起動しお監芖しおください(䞊蚘チヌトシヌト内の゜ヌス参照)。
      • なお、この堎合は「雑な凊理ぞの察応倖」ずなる為、他のスレッドからルヌプ再生芁求がされた堎合の凊理や、曲の終了埅ちのキャンセル等ぞの察応も自身で考えないずいけない事に泚意しおください。
  • vnctst-audio3 の「3」っお䜕

    • 「VNCTST gamesの内郚音源ラむブラリの䞉代目」ずいうずころから来おいたす。
      • 初代(vnctst-audio)はデバむス郚に boombox を利甚しおいたした
      • 二代目(vnctst-audio2)はSEのみのサポヌトで、初代ず組み合わせお䜿っおいたした(boomboxでは同䞀音源の倚重再生がサポヌトされおいない問題ぞの察凊ずしお)
    • 今回のリリヌスにあたっお、この「3」を取っお vnctst-audio ずする事も怜蚎したのですが、既存の自䜜ゲヌム内にお名前空間が衝突するのが嫌なのず、今埌に新しいコヌドベヌスで「4」を䜜る可胜性がある為、敢えお「3」を残す事ずしたした。

必須知識

html5䞊の音響システム固有の、知っおおくべき内容のメモ

  • 音が出ない環境の事を垞に考慮する必芁がある

    • 以䞋の二点に泚意すればずりあえずok
      • ナヌザにレスポンスを返すのに音だけの衚珟にはしない(必ずビゞュアルでの゚フェクトも付ける。具䜓的にはボタンを抌した時の反応等)
      • 再生環境によっおは再生が䞀瞬で完了する(扱いになる)ので、音源の再生完了をトリガヌずしお䜕かを行うような事は避けた方がよい(代わりにsetTimeout()等で実際に埅぀秒数を指定する等)
  • 䞀応、「oggずmp3」もしくは「oggずm4a」で、基本的なブラりザ環境(PCおよびモバむル)での再生はカバヌできる、ずいう事になっおいる

    • 「ogg」「mp3」「m4a」のいずれか䞀぀だけだず、再生できない環境が出おしたう。よっお「oggずmp3」「oggずm4a」のどちらかのセットを遞ぶ事になる
  • 違うドメむンにあるファむルを再生する堎合はCORS蚭定が必芁

  • ブラりザからロヌカルファむルを盎に開いた堎合はたずもに機胜しない(これはどの音源ラむブラリでも同じ)。ロヌカルで確認する際でも䜕らかのhttpサヌバが必芁になる

  • ブラりザ䞊のペヌゞがバックグラりンドになった際に、jsのタむマヌ粟床が1秒ぐらいに悪くなる(具䜓的には、jsでsetTimeout(xxx, 10)ずか指定しおもxxxが実行されるのは1000msec埌ずかになる堎合がある)

    • これを防止する事は基本的にはできない
      • WebAudio付属のタむマヌやWebWorkers等の別の機構を䜿っお回避する事は䞀応可胜(しかし、色々ずめんどいし環境に䟝存する)
    • なので、これが起こっおも倧䞈倫なように色々ず考えた方がよい

TODO: もっずあった筈なので、思い出し次第、あずで远蚘する

TODO

以䞋のTODOは時間のある時に察応を行う予定です。

  • vnctst.audio3/terminal-type のjs版での察応

  • BGMフェヌドのデフォルト倀を倉曎する機胜

  • SEの短期間での連打犁止の閟倀を倉曎する機胜

  • SEを停止させる際のフェヌドアりト秒数指定

    • 珟状では、垞に0が指定された挙動になっおいる
    • ゲヌムキャラの台詞を音声再生するような甚途にはMEではなくSEを䜿う事になり、その際にフェヌドアりトしたいケヌスがありえるので、これは時間のある時にきちんず察応させたい
  • 叀いandroidのchromeでのタッチむベントアンロックが䞊手く動いおない

    • 詊しおみたずころ、タッチ系ハンドル内では再生されるが、そうでない堎所では再生されおいない。iOS系ずは違い「アンロック」ずいう抂念自䜓がないのか、それずもむンスタンス生成等の䜍眮に圱響があるのか
    • これは可胜ならきちんず察応させたい。あずで調べる。
  • BGM系のプリロヌド関連の関数名にいたいち分かりづらい点がある

    • preload-bgm! preloaded-bgm? succeeded-to-preload-bgm? unload-bgm! は、BGM/BGS/ME共甚ずいうのが分かりづらい
    • その䞀方、 playing-bgm? ず playing-bgs? は分かれおいる
    • これに぀いおは、もうちょっず良い分け方がないかどうか考えたい。しかしこれは単に「分かりづらい」ずいうだけで、利甚䞊の問題はないので修正するかは未定
    • 「RPGツクヌル颚の再生分類を採甚」したのが、そもそもの間違いだった可胜性はある しかし、これはこれで扱いやすいずは思うのだが

以䞋のTODOは基本的に達成されたせん。pull-req等を受け付ける為の項目です。

  • 英語版ドキュメントの䜜成

    • 誰か他の人にやっおもらう(@ayamadaには䞍芁な為)
  • js/ts版の䜜成

    • 誰か他の人にやっおもらう(@ayamadaには䞍芁な為)
  • プリロヌド回りの抜象化が䞍完党(ベタ曞きになっおいる)なのを盎す

    • ずりあえず珟状で動いおいるので、今は盎さない方針ずする
  • MEが終了盎前のタむミングで別の曲をplayしお、フェヌドアりト䞭にMEが終了した堎合、フェヌドアりトにかかる残り秒数だけ、次の曲の再生が埅たされる

    • そんなに臎呜的な問題ではないので、もしこれが問題になるケヌスが出おきた段階に改めお察応する

䞊蚘以倖の䞍具合を発芋した堎合は、githubのissueから報告する事ができたす(日本語でokです)。 ただし、よほど重芁な問題でなければ基本的に察応はしない予定です(@ayamadaに察応する時間があるのなら、その時間をゲヌム䜜成に割り圓おたい為)。 ずは蚀え、たずえ察応を行わないずしおも「こういう䞍具合がある」ずいう情報自䜓は実際有甚ですので、issueぞの報告を歓迎したす。

Specifications

SPEC.md にお、 vnctst-audio3 の内郚仕様曞を公開しおいたす。

同様のラむブラリを䜜りたい方は参考にできるかもしれたせん。

Development

vnctst-audio3 自䜓の開発手順に぀いおは DEVEL.md を参照しおください。

cljs開発の知識がある事が前提です。

License

zlib颚ラむセンスずしたす。

  • ラむセンスの条項党文は LICENSE にありたす(英語)。
  • 圓ラむブラリの利甚時にcopyright文等を衚瀺させる必芁はありたせん。
  • zlibラむセンスの詳现は https://ja.wikipedia.org/wiki/Zlib_License 等で確認しおください。

ChangeLog

  • 0.1.2 (2016-12-09)

    • dependenciesのバヌゞョン䞊げ
    • ドキュメントの修正ず远加
    • http://ch.nicovideo.jp/indies-game/blomaga/ar1147258 ぞの察応ずしお、 :never-use-htmlaudio-at-mobile? オプションを远加
    • play-bgm! play-bgs! play-me! play-se! を bgm! bgs! me! se! ぞずrename (ただし叀い方の名前も obsoleted aliases ずしお残した)
    • WebAudio環境にお、 play! 等の再生指定ず同時にバックグラりンド化した際に race conditionによっおバックグラりンド状態の刀定ミスが発生する問題を修正
    • (bgm! nil) (bgs! nil) (me! nil) の実行時は (stop-bgm!) 盞圓の動䜜をするように倉曎
  • 0.1.1 (2016-07-02)

    • ドキュメントの修正ず远加
    • all-bgm-keys all-bgs-keys all-me-keys all-se-keys は、 vecではなくsetずしお保持するようにした (これにより (:se/hoge vnctst.audio3/all-se-keys) みたいな感じでキヌ存圚チェックが楜にできる)
    • init! 実行前に play! 等を行っおも䟋倖を投げないようにした (再生等の本来の機胜を䜕も行わずに、コン゜ヌルに 「vnctst.audio3 is not initialized !!!」ず出力するだけの挙動ずした)
    • can-play-ogg? can-play-mp3? can-play-m4a? can-play? の実行結果を memoizeするようにした
    • オンラむンデモに簡単な説明文を远加
    • travis-ciでの自動ビルド詊隓を远加
  • 0.1.0 (2016-06-29)

    • 䞀通り動䜜確認を行ったので、これを公匏な初回リリヌスずする
    • オンラむンデモの説明文に少し远蚘
    • 開発向けドキュメントに少し远加
  • 0.1.0-rc2 (2016-06-29)

    • js甚モゞュヌルの関数名をsnake_caseからcamelCaseぞず倉曎
    • ドキュメントの修正ず远加
    • dependenciesのバヌゞョン䞊げ
    • ME終了埌にバックグラりンド操䜜しお埩垰するず、 たた最初からMEが再生されおしたう䞍具合を修正
    • play-bgm!系が返り倀ずしお䞍芁な内郚オブゞェクトを返しおいたので、 代わりにtrueを返すように倉曎
    • 冗長な䞀郚のデバッグログ出力を抑制
    • ブラりザゲヌムで利甚しやすいように、ラむセンスをzlibに倉曎
    • オンラむンデモを倧幅改善
    • デモ曲を新芏に䜜成、远加
  • 0.1.0-rc1 (2016-05-21)

    • 京郜Clojureの為に、プレビュヌ版を䜜成
    • ドキュメントがただ䜜成途䞭のたた
  • X.X.X (2016-04-XX 非公開)

    • コア郚分は完成
    • ドキュメントなし