如何使用JavaScript / Tone.js更改音高和播放速度?

4
我希望能同时完成两件事情:
1) 将音频文件的播放速度改为1/2倍速
2) 将音高降低五度
最后,我希望将其与一个音频标签连接起来,并在那里使用播放按钮,而不是使用单独的按钮来播放结果。
以下是我使用Tone.js迄今为止最接近的结果。我真的很难理解文档,但我知道Tone.Transport.bpm.value = 60;可以将bpm从120更改为60,Tone.PitchShift可以转换歌曲。我只是不知道如何将两者结合起来“堆叠”效果。
以下是我遵循的一些链接: 如何使用JavaScript改变音高?

https://tonejs.github.io/docs/r12/PitchShift

https://tonejs.github.io/docs/13.8.25/Transport

提前感谢您的帮助!

<audio id="myAudio" controls preload="none">
      <source src="my_tune.m4a" type="audio/mp4" >
</audio>

<script src="https://unpkg.com/tone@next/build/Tone.js"></script>

<script>

Tone.Transport.bpm.value = 60;  // setting the bpm like this is not working. where to put this?


var player = new Tone.Player("my_tune.m4a").sync().start(0);
// is it possible to use audio tag instead of creating this player?

var pitchShift = new Tone.PitchShift({
    pitch: -5 // this is working and lowers pitch by a fifth
}).toMaster();

player.connect(pitchShift);
window.play = function() {
    Tone.Transport.start();
}

<script>

<button onclick="setPlaySpeed()" type="button">separate button</button><br>


我认为这里可能存在误解。Transport 用于定时音乐事件。请查看 Player Example 以及它如何处理播放速度。播放速率会改变音高和速度,因此您需要通过音高移调来进行补偿。或者您可以尝试使用 Web Audio 创建自己的 相位伏特变换器 - fdcpp
有什么进展吗?我也遇到了同样的问题。 - gskema
@gskema:已更新 ;) 如果有帮助,请告诉我。 - mandmeier
1个回答

2

更新:可行的解决方案

我找到了一个可行的方法:首先设置播放速率。然后,在设置音高时,需要计算需要添加或减去多少音高变化来补偿播放速率。在我的例子中,我需要补偿+12的音高变化以适应0.5的播放速率。

player = new Tone.Player("url/to/audio.mp3");
playback_rate = 0.5 // or 1 (I only implemented these two options)
transpose_by = 7 // up 7 half steps, -7 would be down 7 half steps

// set playback rate
player.playbackRate = playback_rate
player.toDestination();


// set pitch shift
if (playback_rate == 1){
    pitch_shift = new Tone.PitchShift({
    pitch: transpose_by.toString()
    }).toDestination();
} else { //if playbackrate == 0.5 add +12 to pitch to correct
    trans = transpose_by + 12
    trans = trans.toString()
    pitch_shift = new Tone.PitchShift({
    pitch: trans
  }).toDestination();
}
player.disconnect(); // disconnect old player (get overlay of two players otherwise if you repeat this)
player.connect(pitch_shift);

player.start()

你可以在我的网站上查看它的实际应用:https://www.lickstack.com

然而,我仍然不知道如何将Tone.js播放器连接到音频元素。如果有帮助,请参见此处的文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接