API-интерфейс Web Audio использует 32-разрядные числа с плавающей точкой со знаком от -1 до 1, поэтому я собираюсь (надеюсь) показать вам, как это сделать, а не 16-разрядные, как вы упомянули в вопросе.
Предполагая, что ваш массив сэмплов называется samples
и хранится как комплимент 2 от -128 до 127, я думаю, это должно работать:
var floats = new Float32Array(samples.length);
samples.forEach(function( sample, i ) {
floats[i] = sample < 0 ? sample / 0x80 : sample / 0x7F;
});
Тогда вы можете сделать что-то вроде этого:1007 *
var ac = new webkitAudioContext()
, ab = ac.createBuffer(1, floats.length, ac.sampleRate)
, bs = ac.createBufferSource();
ab.getChannelData(0).set(floats);
bs.buffer = ab;
bs.connect(ac.destination);
bs.start(0);