12

我是学习javascript的初学者。我的网站上有一个与微音频率和行星频率相关的交互式页面,我想到了各种项目。我需要能够循环播放我的音频样本.wav文件,但音频样本的时间会随着音调的相应变化而延长。

我尝试myAudio.playbackRate = 0.5;了慢速 0.5 的音频播放,但音高保持不变。我研究并发现了一些东西。但是我如何设置preservesPitch为假或真?我认为这只适用于“谷歌浏览器”,所以我发现的其他程序在这里:
https ://github.com/janesconference/KievII/blob/master/dsp/pitchshift.js

似乎无法让它工作,我不知道我应该如何修改它,我在哪里将我的音频 .wav 文件 URL 粘贴到程序中?与此相关的任何其他提示将不胜感激。提前感谢您的时间和帮助。

4

4 回答 4

3

我也想转换音频,经过多年我发现了这个
我还重新格式化了代码以使其更易于自己使用(您需要将“decode-audio-data/viper.ogg”替换为您自己的 WAV 或 OGG 文件名。):

<script>
function playSound(file, speed=1, pitchShift=1, loop=false, autoplay=true) {
    /*
    Use the play() method to start the audio. if pitchShift is true
    use the stop() method to stop the audio and destroy the object.
    If pitchShift is false use the pause() method to pause and set
    the attribute currentTime to 0 to reset the time.
    */
    if(pitchShift) {
        /*
        After weeks of searching, I have finally found a way to pitch shift audio.
        Thank you Mozilla.
        2018/03/31:
            https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode/playbackRate
            https://github.com/mdn/webaudio-examples/tree/master/decode-audio-data
            https://www.w3schools.com/jsref/prop_audio_loop.asp
        Original comments:
            use XHR to load an audio track, and
            decodeAudioData to decode it and stick it in a buffer.
            Then we put the buffer into the source
        */
        audioCtx = new (window.AudioContext || window.webkitAudioContext)();
        source = audioCtx.createBufferSource();
        request = new XMLHttpRequest();

        request.open('GET', file, true);

        request.responseType = 'arraybuffer';


        request.onload = function() {
            var audioData = request.response;

        audioCtx.decodeAudioData(audioData, function(buffer) {
            myBuffer = buffer;
            songLength = buffer.duration;
            source.buffer = myBuffer;
            source.playbackRate.value = speed;
            source.connect(audioCtx.destination);
            source.loop = loop;
        },

        function(e){"Error with decoding audio data" + e.error});

        }

        request.send();
        source.play=source.start
    } else {
        source=new Audio(file)
        source.playbackRate=speed
        source.loop=loop
    }
    if(autoplay) {
        source.play()
    }
    return source
}
var source
function play() {
    source=playSound('decode-audio-data/viper.ogg', pitch=2);
}

function stop() {
    source.stop(0);
    document.getElementById('play').href=''
    document.getElementById('play').innerHTML='Refresh to play again'
}
</script>
<a id="play" href="#" onclick="play()">Play</a> | <a href="#" onclick="stop()">Stop</a>
于 2018-04-10T09:18:46.913 回答
3

您可以将该mozPreservesPitch属性设置为 false 以使用 Firefox 更改元素或声音文件的音高。 webkitPreservesPitch应该适用于 webkit 浏览器,但请注意“这个 API 尚未标准化”......

https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement

这对我有用:

var soundPlayer = new Audio();

function playLowerNote() {
    soundPlayer.src = "piano.mp3";
    soundPlayer.mozPreservesPitch = false;
    soundPlayer.playbackRate = 0.5;
    soundPlayer.play();
}

playLowerNote();

仍在寻找更好的循环方式。

于 2017-02-02T13:35:39.680 回答
1

有些点,当你说I tried myAudio.playbackRate = 0.5;我们在谈论Web Audio API

如果是,请再听一遍音高以及样本的持续时间会受到影响。

如果不是,可能是您使用的是本机 html5 功能,如果您想保持原始速度并改变音高,一种方法是在改变速度后应用某种类型的插值,尝试使用用于拉伸音频的相同因子的线性插值。如果您需要改变速度和音高,只需应用插值而不改变速度(原始声音),这相当于以不同的采样率播放音频,Web Audio API可以做到。

该代码pitchshift.js是从Stephan Bernsee到的代码的一个端口javascript(这会改变音高并保持速度不可触及),您需要在每个音频块中调用此函数,因此首先您需要执行一个函数来解码您的音频文件 int 或漂浮。

于 2014-08-06T12:27:23.583 回答
0

嘿,您的网络音频 API 现在似乎至少适用于正弦波,将很快学会如何使用示例https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Using_Web_Audio_API来自这里的信息

于 2014-09-02T07:00:07.367 回答