examples javascript signal-processing web-audio synthesizer

javascript - examples - web audio api download



Cómo utilizar createPeriodicWave en lugar de createScriptProcessor y getChannelData (1)

Esto no es una respuesta, solo algunas reflexiones y notas sobre el tema.

La pregunta en sí es interesante para mí, estoy tocando la guitarra, pero nunca tuve la oportunidad (hasta ahora) de tocar la música en código. Leí un poco de teoría y toqué con musical.js y siento que todavía estoy lejos de la solución.

Aquí algunas notas, espero que puedan ser útiles:

1) web-audio-test.js el ejemplo reducido de código extraído de musicial.js , vea web-audio-test.js y web-audio.html .

La configuración de los nodos de audio para musicial.js, si no me equivoco, es la siguiente:

hay una parte de "cola", que es común para todos los nodos y permanece de forma permanente y "cabeza": el conjunto de nodos creados para tocar cada nota

| ------ HEAD (for each note)------ | --- TAIL (for all notes)----------- | | | | [ |Oscillator|->|Biquad|->|Gain|-> ] [|Gain|->|Dynamics |->|Destination| ] | Periodic | |Filter| |ADSR| |Compressor| | Wave |

Nota: El primer oscilador puede ser duplicado por otro para tocar la frecuencia de la nota + la desintonización del timbre.

Así que creamos un oscilador (o dos) + filtro + ganancia ADSR para tocar cada nota. De esta manera creamos muchos nodos de audio. Musicial.js maneja esto creando una cola de notas y pasa solo un conjunto limitado de notas a la API de audio web.

La configuración del sintetizador de guitarra parece mucho más sencilla y es solo un |Script Processor| -> | Output | |Script Processor| -> | Output | . La muestra de sonido de la guitarra se genera a partir del código y se envía al nodo ScriptProcessor, que actúa como una fuente de sonido (como si cargaras una muestra del archivo). No estoy seguro, pero quizás musical.js también podría usar este enfoque para simplificar el código.

2) Jugué con diferentes parámetros en musicial.js, pero aún así todo suena como un piano.

Cuando aplico los coeficientes de bajo o guitarra de los ejemplos de tablas de ondas , suena diferente, pero sigue siendo como un piano (especialmente notas más altas).

La configuración de ADSR no cambia este sonido de "piano", pero creo que en realidad no pueden convertir el sonido de un instrumento en el sonido de otro.

Las matrices mult y freq que se utilizan para interpolar los armónicos en real / imag a una frecuencia más alta son probablemente más importantes, pero si los mantenemos vacíos (sin interpolación), el instrumento todavía suena como el piano.

Lo que realmente se necesita cambiar para sintonizar el sonido sigue siendo un rompecabezas para mí.

Vi el problema que publicaste en github , espero que el autor de musicial.js pueda al menos dar algunos consejos.

3) Enlaces / herramientas útiles

Las muestras de audio de Google no incluyen nada de lo que necesitamos aquí. El más cercano es un ejemplo de sintetizador de tabla de ondas donde puede cambiar entre diferentes tablas de ondas.

Firefox tiene un "Editor de audio web" donde puede ver un gráfico de nodos de audio, muy conveniente para aprender la configuración de audio.

4) Solución práctica.

Probablemente ya hayas pensado en esto, en este momento yo usaría tanto musicial.js como guitarra-sintetizador.

Un envoltorio simple puede unificar interfaces y proporcionar instrumentos de piano y guitarra.

Encontré algunas bibliotecas que sintetizan instrumentos con la API de audio web.

Uno de ellos (Band.js) utiliza createOscillator() , en combinación con el tipo de oscilador (seno, cuadrado, ...) ver fuente .

Pero suena demasiado sintético ( ejemplo para escuchar ). Quiero algo que parezca más realista, pero no quiero usar ninguna fuente de sonido precompilada , por lo que debería sintetizarse. También debería funcionar en un dispositivo móvil.

Así que encontré otra biblioteca (musical.js) que usa los primeros 32 armónicos como una matriz en combinación con la fuente de visualización createPeriodicWave . El timbre es impresionante, puedes escucharlo.

Como está escrito en el comentario del código fuente, los armónicos se toman de este archivo de muestra de piano . Hay muchos más archivos de muestra de otros instrumentos. Intenté reemplazar los armónicos, incluso todos los 2000, pero siempre suena como un piano.

También hay algunos valores para ajustar e interpolar los armónicos y los valores ADSR. ¿Quizás solo están optimizados para un sonido de piano?

Luego encontré otra biblioteca (guitarra-sintetizador) que tiene un timbre muy bueno para una guitarra, escúchala . Pero esta biblioteca no utiliza ninguna API createPeriodicWave . En su lugar, utiliza createScriptProcessor y getChannelData en combinación con algunos cálculos "simples", pero nada como los armónicos en la otra biblioteca, consulte la fuente

Así que mi pregunta principal

¿Se puede portar el sintetizador de guitarra para usar la API createPeriodicWave ? Quiero usar el timbre de guitarra en musicaljs . Para que pueda cambiar entre el timbre del piano y el timbre de la guitarra.

BTW: Encontré otra biblioteca que sintetiza instrumentos de sonido. Aquí está la demo y aquí la musicaljs . El sonido también es agradable, pero la biblioteca musical.js tiene un timbre mucho más hermoso. Pero también parece que usa algo similar a getChannelData simplemente codificado como WAVE. Tampoco funciona en mi dispositivo móvil con Android.