En un proyecto de Blazor, genero señales de sonido/ruido como el ejemplo de ruido rosa de @DanW, que genera un double[] con valores entre -1.0 y 1.0. ¿Es posible reproducir esta matriz directamente como audio en el navegador? Todo lo que he encontrado sobre sonido/audio y navegadores hasta ahora ha sido reproducir audio de un archivo existente.
EDITAR: estoy filtrando usando algunos dll nativos en C # y me siento más cómodo en C # que en javascript, por lo tanto, trato de hacer la mayor parte del trabajo en C # y no en javascript.
Así que me las arreglé con la API de WebAudio para descubrir cómo:
JavaScript:
// for cross browser compatibility const AudioContext = window.AudioContext || window.webkitAudioContext; audioCtx = {}; function initAudio() { // creation of audio context cannot not be done on loading file, must be done afterwards audioCtx = new AudioContext(); return audioCtx.sampleRate; } // floats is a 1-D array with channel data after each other: // ch1 = floats.slice(0,nSamples) // ch2 = floats.slice(nSamples,nSamples*2) function playNoise(floats, nChannels) { const bufferSize = floats.length / nChannels; let arrayBuffer = audioCtx.createBuffer(nChannels, bufferSize, audioCtx.sampleRate); for (var i = 0; i < nChannels; i++) { let f32arr = new Float32Array(floats.slice(i * bufferSize, (i + 1) * bufferSize)); arrayBuffer.copyToChannel(f32arr, i, 0); } // Creating AudioBufferSourceNode let noise = audioCtx.createBufferSource(); noise.buffer = arrayBuffer; noise.connect(audioCtx.destination); noise.start(); return true; } Página de Blazor (yo uso Blazorise ( Button )):
@page "/Tests" @inject IJSRuntime js <h3>Test</h3> <Button Clicked="@(async () => await TestJS())" Color="Color.Primary">Test JS</Button> @code { double fs; protected override async Task OnInitializedAsync() { fs = await js.InvokeAsync<double>("initAudio"); await base.OnInitializedAsync(); } private async Task TestJS() { var nChannels = 2; var nSecs = 5; var nSampels = (int)fs * nSecs * nChannels; var floats = new float[nSampels]; var freq = 440; for (int i = 0; i < nSampels / nChannels; i++) { floats[i] = (float)Math.Sin(i * freq * 2 * Math.PI / fs); floats[i + nSampels / 2] = (float)Math.Sin(i * freq * 2 * 2 * Math.PI / fs); } var ok = await js.InvokeAsync<bool>("playNoise", floats, nChannels); } }El botón reproduce un tono de 440 Hz en el canal izquierdo (canal 1) y un tono de 880 Hz en el canal derecho (canal 2).
EDITAR: la frecuencia de muestreo no tiene que ser la misma que en AudioContext . Consulta aquí las especificaciones.
No tuve problemas para generar archivos usando Java (Spring Framework) y descargar el PCM sin procesar a las variables de Javascript en el html a través de Thymeleaf y reproducirlos a través de la API de audio web, por ejemplo, usando un objeto AudioBuffer . ¿Hay algún aspecto de Blazor que impida o inhiba el uso de objetos de audio web? IDK cómo funciona HTML cuando hay etiquetas de script que designan diferentes idiomas, si hay una forma de comunicarse entre ellos.
Blazor no viene preempaquetado con capacidades de edición de sonido, pero ahora cuenta con aislamiento JS, lo que significa que los componentes pueden cargar los módulos JS necesarios.
Mi consejo es hacer todo el material de audio directamente en JavaScript utilizando la API de WebAudio, etc. en una colección de componentes personalizados.
Puede usar C# para generar formas de onda, etc., pero no estoy seguro de que haya alguna ventaja al hacerlo, a menos que quiera usar una biblioteca de C# existente.