Я пытаюсь переписать некоторый (очень простой) код Android, который я нашел написанным на Java, в статическое приложение HTML5 (мне не нужен сервер, чтобы что-то делать, я хотел бы сохранить его таким образом). У меня есть обширный опыт в области веб-разработки, но базовое понимание Java и даже меньше знаний в разработке Android.
Единственная функция приложения - взять некоторые цифры и преобразовать их в звуковой чирп из байтов. У меня нет абсолютно никакой проблемы перевода математической логики в JS. Там, где у меня возникают проблемы, это когда на самом деле получается звук. Это соответствующие части исходного кода:
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
// later in the code:
AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STATIC);
// some math, and then:
track.write(sound, 0, sound.length); // sound is an array of bytes
Как это сделать в JS? Я могу использовать dataURI для создания звука из байтов, но позволяет ли я контролировать другую информацию здесь (например, частоту дискретизации и т.д.)? Другими словами: Какой самый простой, наиболее точный способ сделать это в JS?
Обновление
Я пытаюсь воспроизвести то, что я нашел в этом ответе. Это важная часть моего кода:
window.onload = init;
var context; // Audio context
var buf; // Audio buffer
function init() {
if (!window.AudioContext) {
if (!window.webkitAudioContext) {
alert("Your browser does not support any AudioContext and cannot play back this audio.");
return;
}
window.AudioContext = window.webkitAudioContext;
}
context = new AudioContext();
}
function playByteArray( bytes ) {
var buffer = new Uint8Array( bytes.length );
buffer.set( new Uint8Array(bytes), 0 );
context.decodeAudioData(buffer.buffer, play);
}
function play( audioBuffer ) {
var source = context.createBufferSource();
source.buffer = audioBuffer;
source.connect( context.destination );
source.start(0);
}
Однако, когда я запускаю это, я получаю эту ошибку:
Uncaught (in promise) DOMException: Unable to decode audio data
Который я нахожу довольно необычным, так как это такая общая ошибка, что ему удается красиво сказать мне точно приседать о том, что не так. Еще более удивительно, когда я отлаживал это шаг за шагом, хотя цепочка ошибок начинается (предположительно) с линией context.decodeAudioData(buffer.buffer, play);
, она на самом деле пробегает еще несколько строк в файле jQuery (3.2.1, несжатый), проходя через строки 5208, 5195, 5191, 5219, 5223 и, наконец, 5015 перед ошибкой. Я не знаю, почему jQuery имеет к этому какое-то отношение, и ошибка не дает мне понять, что попробовать. Любые идеи?