曲のテンポと同時に英単語を切り替えていきたいのですが、音ズレがあったらダメなので、音ズレを防ぐ方法を教えてください
曲と単語、ボタンを押して再生です。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
AudioオブジェクトのcurrentTimeプロパティを利用してはどうですか?
単語の区切りがテンポに合っているのであれば、
setIntervalなどでcurrentTimeを取得して、
そのタイミングに合う単語に切り替えるといった方法です。
JavaScript
1 2var audio = new Audio('sound.mp3'); 3var tempo = 60000 / 120; 4var words = ['this', 'is', 'a', 'pen']; 5 6setInterval( 7 function(){ 8 var frame = Math.floor(audio.currentTime / tempo); //再生位置を小節に変換する 9 var current_word = words[frame]; //現在の単語を取得 10 11 console.log(frame, current_word); //ここで単語を使った処理をする 12 13 }, 14 tempo 15); 16 17audio.play(); 18
音声の再生開始時にsetIntervalを開始しても、
バッファされるまでは再生が開始されないので、
ブラウザや環境によっては再生開始のタイミングが遅れる場合があります。
なので、音声と処理を同期させるには、
音声の再生位置を取得してそれに合わせる方法がベターかと思います。
ただし、音声がバッファされないうちはにcurrentTimeが正常に取得できない場合もあるので、
Audioオブジェクトのbufferedプロパティやseekableプロパティをチェックして、
再生が開始されたタイミングでsetIntervalを起動するのがより確実です。
投稿2015/11/17 22:05
総合スコア52
0
質問の意味がよくわかりませんが、曲の再生と同時にsetIntervel()とか使ってみたらどうですか?
曲のテンポ(BPM)を調べて、BPM120だったら1分間に120拍=1秒に2拍=1拍が500ミリ秒ですから、
javascript
1BPM = 120; 2w = 60000 / BPM; 3haku = 0; 4shousetu = 0; 5voice1 = new Audio("voice1.mp3"); 6voice2 = new Audio("voice2.mp3"); 7 8setInterval(function(){ 9 if(shousetu == 4 && haku == 0) voice1.play(); 10 else if(shousetu == 8 && haku == 4) voice2.play(); 11 12 haku ++; 13 if(haku == 5){ 14 haku = 0; 15 shousetu ++; 16 } 17}, w);
とか。
投稿2015/11/13 05:04
総合スコア476
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/17 06:13
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。