私は HTML5 オーディオ API にかなり慣れていません。HTML5 Rocksで関連記事をいくつか読んだことがありますが、Javascript と Dart を切り替えるのは少し難しい場合があります。
いずれにせよ、私は Dart で HTML5 Audio を試してきました。単純なゲームの効果音を生成するために、次のようなクラスを作成しました。AudioContext を作成し、サウンド データを SoundBuffers にロードしました。サウンドを再生する必要がある場合は、AudioBufferSourceNode を作成して、バッファに格納されたデータを再生します。
class Sfx {
AudioContext audioContext;
List<Map> soundList;
int soundFiles;
Sfx() {
audioContext = new AudioContext();
soundList = new List<Map>();
var soundsToLoad = [
{"name": "MISSILE", "url": "SFX/missile.wav"},
{"name": "EXPLOSION", "url": "SFX/explosion.wav"}
];
soundFiles = soundsToLoad.length;
for (Map sound in soundsToLoad) {
initSound(sound);
}
}
bool allSoundsLoaded() => (soundFiles == 0);
void initSound(Map soundMap) {
HttpRequest req = new HttpRequest();
req.open('GET', soundMap["url"], true);
req.responseType = 'arraybuffer';
req.on.load.add((Event e) {
audioContext.decodeAudioData(
req.response,
(var buffer) {
// successful decode
print("...${soundMap["name"]} loaded...");
soundList.add({"name": soundMap["name"], "buffer": buffer});
soundFiles--;
},
(var error) {
print("error loading ${soundMap["name"]}");
}
);
});
req.send();
}
void sfx(AudioBuffer buffer) {
AudioBufferSourceNode source = audioContext.createBufferSource();
source.connect(audioContext.destination, 0, 0);
source.buffer = buffer;
source.start(0);
}
void playSound(String sound) {
for (Map m in soundList) {
print(m);
if (m["name"] == sound) {
sfx(m["buffer"]);
break;
}
}
}
}
(効果音は「SFX」フォルダにあります。コードを見てみると、データを整理するためのより良い方法がおそらく 100 万ありますが、それは今のポイントではありません。) Sfx のインスタンスとメソッド playSound の呼び出し。
例えば
#import('dart:html');
#source('sfx.dart');
Sfx sfx;
void main() {
sfx = new Sfx();
window.on.keyUp.add((KeyboardEvent keX) {
sfx.playSound("MISSILE");
});
}
(編集: キーを押したときにサウンドを再生するコードを追加しました。)
問題は、dart2js Javascript を使用すると、効果音は Safari では期待どおりに再生されますが、Dartium または (dart2js Javascript を使用して) Chrome で再生すると、効果音が歪むことです。(Firefox では、さらに悪い問題があります!)
私が怠ってきた、または考慮しなければならない明らかなことはありますか? それ以外の場合、できれば Dart のコンテキストで役立つ参考文献やチュートリアルはありますか?