chiro-canto/public/scripts/wavesurfer/example/stretcher/app.js

78 lines
2.3 KiB
JavaScript

'use strict';
// Create an instance
let wavesurfer = {};
// Init & load
document.addEventListener('DOMContentLoaded', function() {
// Init wavesurfer
wavesurfer = WaveSurfer.create({
container: '#waveform',
waveColor: 'violet',
progressColor: 'purple',
loaderColor: 'purple',
cursorColor: 'navy'
});
wavesurfer.load('../../example/media/demo.wav');
// Time stretcher
wavesurfer.on('ready', function() {
let st = new window.soundtouch.SoundTouch(
wavesurfer.backend.ac.sampleRate
);
let buffer = wavesurfer.backend.buffer;
let channels = buffer.numberOfChannels;
let l = buffer.getChannelData(0);
let r = channels > 1 ? buffer.getChannelData(1) : l;
let length = buffer.length;
let seekingPos = null;
let seekingDiff = 0;
let source = {
extract: function(target, numFrames, position) {
if (seekingPos != null) {
seekingDiff = seekingPos - position;
seekingPos = null;
}
position += seekingDiff;
for (let i = 0; i < numFrames; i++) {
target[i * 2] = l[i + position];
target[i * 2 + 1] = r[i + position];
}
return Math.min(numFrames, length - position);
}
};
let soundtouchNode;
wavesurfer.on('play', function() {
seekingPos = ~~(wavesurfer.backend.getPlayedPercents() * length);
st.tempo = wavesurfer.getPlaybackRate();
if (st.tempo === 1) {
wavesurfer.backend.disconnectFilters();
} else {
if (!soundtouchNode) {
let filter = new window.soundtouch.SimpleFilter(source, st);
soundtouchNode = window.soundtouch.getWebAudioNode(
wavesurfer.backend.ac,
filter
);
}
wavesurfer.backend.setFilter(soundtouchNode);
}
});
wavesurfer.on('pause', function() {
soundtouchNode && soundtouchNode.disconnect();
});
wavesurfer.on('seek', function() {
seekingPos = ~~(wavesurfer.backend.getPlayedPercents() * length);
});
});
});