soiz1 commited on
Commit
e031f30
·
1 Parent(s): da6c7b5

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +59 -57
index.html CHANGED
@@ -697,63 +697,65 @@
697
  });
698
  }
699
 
700
- // 音声を再生
701
- function playAudio(file, startTime) {
702
- if (!audioBuffers[file]) return;
703
-
704
- // 既存のソースがあれば停止
705
- if (audioSources[file]) {
706
- try {
707
- audioSources[file].stop();
708
- } catch(e) {
709
- console.log("Audio source already stopped");
710
- }
711
- }
712
-
713
- // SoundTouchプロセッサーを作成
714
- const source = audioContext.createBufferSource();
715
- source.buffer = audioBuffers[file];
716
-
717
- const soundTouchProcessor = new soundtouch.SimpleFilter(audioContext, source, soundTouchNodes[file]);
718
-
719
- // ボリュームスライダーの値を取得
720
- const volumeSlider = document.querySelector(`.audio-slider[data-audio="${file}"]`);
721
- const volume = parseFloat(volumeSlider.value) * parseFloat(globalVolumeSlider.value);
722
-
723
- // ゲインノードを設定
724
- gainNodes[file].gain.value = volume;
725
-
726
- // 接続
727
- soundTouchProcessor.connect(gainNodes[file]);
728
- gainNodes[file].connect(audioContext.destination);
729
-
730
- // 再生
731
- const duration = video.duration || videoDuration;
732
- const endTime = parseFloat(endTimeInput.value) || duration;
733
- const loop = loopCheckbox.checked;
734
-
735
- // 再生範囲を計算
736
- const playStartTime = Math.max(startTime, parseFloat(startTimeInput.value) || 0);
737
- const playEndTime = Math.min(endTime, duration);
738
- const playDuration = playEndTime - playStartTime;
739
-
740
- // 再生時間が正の場合のみ再生
741
- if (playDuration > 0) {
742
- source.start(0, playStartTime, playDuration);
743
- }
744
-
745
- // ループ設定
746
- if (loop) {
747
- source.loop = true;
748
- source.loopStart = parseFloat(startTimeInput.value) || 0;
749
- source.loopEnd = endTime;
750
- }
751
-
752
- // 再生速度を同期
753
- soundTouchNodes[file].tempo = currentPlaybackRate;
754
-
755
- audioSources[file] = source;
756
- }
 
 
757
 
758
  // 再生関数
759
  function playMedia() {
 
697
  });
698
  }
699
 
700
+ function playAudio(file, startTime) {
701
+ if (!audioBuffers[file]) return;
702
+
703
+ // 既存のソースがあれば停止
704
+ if (audioSources[file]) {
705
+ try {
706
+ audioSources[file].stop();
707
+ } catch(e) {
708
+ console.log("Audio source already stopped");
709
+ }
710
+ }
711
+
712
+ const source = audioContext.createBufferSource();
713
+ source.buffer = audioBuffers[file];
714
+
715
+ // SoundTouch プロセッサーを作成
716
+ soundTouchNodes[file] = new soundtouch.SoundTouch(audioBuffers[file].sampleRate);
717
+ soundTouchNodes[file].tempo = currentPlaybackRate;
718
+ soundTouchNodes[file].pitch = 1; // ピッチ変更なし
719
+
720
+ // SimpleFilter を作成し、Web Audio Node を取得
721
+ const soundTouchProcessor = new soundtouch.SimpleFilter(audioContext, source, soundTouchNodes[file]);
722
+ const soundTouchNode = soundTouchProcessor.getWebAudioNode();
723
+
724
+ // ボリュームスライダーの値を取得
725
+ const volumeSlider = document.querySelector(`.audio-slider[data-audio="${file}"]`);
726
+ const volume = parseFloat(volumeSlider.value) * parseFloat(globalVolumeSlider.value);
727
+
728
+ // ゲインノードを設定
729
+ gainNodes[file].gain.value = volume;
730
+
731
+ // 接続
732
+ soundTouchNode.connect(gainNodes[file]);
733
+ gainNodes[file].connect(audioContext.destination);
734
+
735
+ // 再生
736
+ const duration = video.duration || videoDuration;
737
+ const endTime = parseFloat(endTimeInput.value) || duration;
738
+ const loop = loopCheckbox.checked;
739
+
740
+ // 再生範囲を計算
741
+ const playStartTime = Math.max(startTime, parseFloat(startTimeInput.value) || 0);
742
+ const playEndTime = Math.min(endTime, duration);
743
+ const playDuration = playEndTime - playStartTime;
744
+
745
+ // 再生時間が正の場合のみ再生
746
+ if (playDuration > 0) {
747
+ source.start(0, playStartTime, playDuration);
748
+ }
749
+
750
+ // ループ設定
751
+ if (loop) {
752
+ source.loop = true;
753
+ source.loopStart = parseFloat(startTimeInput.value) || 0;
754
+ source.loopEnd = endTime;
755
+ }
756
+
757
+ audioSources[file] = source;
758
+ }
759
 
760
  // 再生関数
761
  function playMedia() {