Manejo del Cambio de Tono en Tone.js con Múltiples Articulaciones y Dinámicas
Estoy creando un Espacio de Trabajo de Audio Digital (DAW) en Next.js. Tengo muestras de audio para cada tercera nota de cada instrumento, y afortunadamente Tone.js maneja esto automáticamente. Tone.Sampler permite combinar múltiples muestras en un instrumento, lo que significa que si solo tengo muestras de cada tercera nota en un piano, puedo convertir eso en una muestra de piano completa.
Sin embargo, el problema radica en que también tengo diferentes articulaciones y dinámicas para cada nota. Por ejemplo, en el violín hay múltiples articulaciones, y cada una de ellas tiene un nivel dinámico diferente. Si quiero aprovechar el cambio de tono automático, las teclas deben tener nombres de nota exactos como C3 o A4, pero cada nombre solo puede mapearse a un archivo de sonido, y yo tengo múltiples archivos por articulación y dinámica.
He considerado utilizar Tone.PitchShift para realizar el cambio manualmente, pero parece que eso solo sirve para cambiar el tono de un canal de audio entero. Yo necesito que diferentes notas sean afinadas de manera diferente y simultáneamente. Mis opciones actuales parecen ser decenas de samplers, decenas de canales de cambio de tono, o acelerar/desacelerar el audio, lo cual tampoco deseo hacer. Así que me pregunto, ¿hay una solución eficiente para este problema?
Ejemplo de Problema:
// si se toca a#3, la muestra g3 debería sonar elevada por 3 semitonos
0: {lowkey: 'g3', highkey: 'a#3', key: 'g3', file: 'instrumentSounds/Samples/1st Violins/1st-violins-col-g3-p.mp3', dynamic: 'p'}
// aquí está lo mismo pero en un nivel dinámico diferente. Si quiero utilizar el cambio de tono automático, solo puede haber un g3. Además, esto es solo para una articulación (col legno) y hay muchas combinaciones.
1: {lowkey: 'g3', highkey: 'a#3', key: 'g3', file: 'instrumentSounds/Samples/1st Violins/1st-violins-col-g3-pp.mp3', dynamic: 'pp'}
Solución Propuesta:
Para resolver este problema, sugiero adoptar un enfoque que combine el uso de un sistema organizado de muestras junto con un método para gestionar las articulaciones y dinámicas.
-
Organización de Muestras: Crea un objeto que contenga todas las combinaciones de articulaciones y dinámicas para cada nota. Esto permitirá que el sampler seleccione la combinación correcta dependiendo de la interacción del usuario.
-
Carga Dinámica de Muestras: Utiliza Tone.js para cargar las muestras requeridas según la articulación y dinámica, de tal forma que se limite la cantidad de archivos de sonido cargados en la memoria al instante.
- Manejo de Claves: Implementa un sistema que asocie las notas con los nombres exactos y sus respectivas muestras. Esto implicaría tener funciones que interpretaran las solicitudes de notas y seleccionaran las muestras adecuadas basándose en las condiciones establecidas.
Este enfoque debería optimizar tanto el rendimiento como la flexibilidad al gestionar múltiples articulaciones y dinámicas, permitiendo un enriquecimiento sonoro sin la necesidad de una sobrecarga en la cantidad de samplers o canales de cambio de tono.