Skip to content

About

samplerSynth allows developers to create audio projects using sound samples. You can load different instruments. The library works with the ESP32's I2S peripheral for sound output and uses an external DAC. | samplerSynth permite a los desarrolladores crear proyectos de audio utilizando muestras de sonido. Puedes cargar diferentes instrumentos.

Topics

Resources

Stars

13 stars

Watchers

1 watching

Forks

Latest commit

 

History

91 Commits

Folders and files

Repository files navigation

ESP32 samplerSynth

Crea proyectos de audio con ESP32. Carga y reproduce muestras de audio, ofrece funciones de reproducción, duración de las notas, ajuste de volumen y mas. El objetivo ayudar a la comunidad maker interesada en crear instrumentos musicales enfocarse en sus creaciones, reproduciendo sonidos sin necesidad de hardware dedicado, Ej: módulos VS1053b, SAM2695, Wav Trigger o SmartWav 2. Siendo amigable para programadores principiantes por su facilidad de uso.

🎞️Video demo

Video

✨Características

  • Reproducción de Samples: Soporte para la carga y reproducción de archivos WAV.
  • Polifonía: Reproduce múltiples notas simultáneamente.
  • Canales: permite asociar un instrumento a un canal, y reproducir notas en un determinado canal.
  • Control de Volumen: Volumen general y Ajuste dinámico del volumen de las notas. (Velocity)
  • Salida I2S: Utiliza el periférico I2S del ESP32 y un DAC externo (ej: MAX98357).
  • Salida PWM: Usa PWM como salida de audio de 10Bit, adaptado del proyecto ESP32Synth de Danilo Gabriel.
  • Salida Bluetooth (opcional):Permite reproducir el audio en un parlante bluetooh previamente enlazado (solo ESP32 Clásico).
  • Fácil de Usar: Código simple basado en funciones.
  • Eficiente: Código refactorizado en torno a operaciones de punto fijo, para maxima eficiencia, inspirado en ESP32Synth de Danilo Gabriel.
  • Dependencias: LittleFS, librería MIDI opcional (usada en el ejemplo rtMidiIn), librería ESP32-A2DP de Phil Schatzmann.
  • Filtros: Paso bajo para mejorar la calidad de sonido de en notas altas.
  • Interpolación cubica: Interpolación cubica Hermite de 4 puntos simplificada, para mejorar la calidad del sonido sin sacrificar rendimiento.

⌨En Desarrollo

  • Efectos: Reverb, tremolo y delay. (cuando se usa noteOff y se estable un tiempo de delay significativo)

📋Requisitos

📟Hardware

  • Microcontroladores: Diseñada y optimizada para el ESP32 Clásico, también funciona en las versiones ESP32-S2, ESP32-S3 Y ESP32-C3.

💾Software

  • Arduino IDE: Versión 1.8.10 o superior (compatible con Arduino IDE 2.x).

📦Instalación

Opción 1: Desde el Gestor de Librerías de Arduino (Recomendado)

  1. Abre el Arduino IDE.
  2. Ve al menú Herramientas > Gestionar bibliotecas... (o presiona Ctrl + Shift + I / Cmd + Shift + I).
  3. En el buscador, escribe samplerSynth.
  4. Selecciona la librería y haz clic en Instalar.

Opción 2: Instalación Manual

  1. Clona o descarga este repositorio como un archivo ZIP.
  2. En el Arduino IDE, ve a Programa > Incluir Librería > Añadir biblioteca .ZIP... y selecciona el archivo descargado (o descomprímelo directamente en tu carpeta sketchbook/libraries/).

Alternativamente, puedes extraer el contenido del archivo ZIP directamente dentro de la carpeta libraries de tu directorio de trabajo de Arduino.

🎯API

  • initSynth(bck, ws, data): Inicializa el sintetizador y configura los pines para la comunicación I2S.
  • setMaxNotas(maxNotas): Establece el número máximo de notas simultáneas que pueden reproducirse. 8 por defecto maximo recomendado 16
  • setInstrumento(nroCanal,nroInstr): Carga el sample,en un determinado canal para ser reproducido.
  • setVolumen(vol): Ajusta el volumen global del sintetizador de (0-100)
  • setSustainNota(DuracionNota): configura el tiempo en milisegundos por defecto que dura una nota al llamar la funcion noteOn (0-65535) si es 0 suena indefinidamente.
  • setDelayNota(dFade): Configura el tiempo de desvanecido usado en notaOff para silenciar la nota activa (0-127) 0 inmediato 127 duración maxima.
  • notaOn(canal,nota, velocity, duracion): Activa una nota musical en el canal indicado con la frecuencia correspondiente, volumen y duración especificados.
  • notaOff(canal,nota): Desactiva una nota musical gradualmente, disminuyendo su volumen durante un tiempo determinado antes de silenciarla por completo.
  • allnotaOff(): Desactiva todas las notas musicales actualmente activas.
  • alterVolNota(velocity): Ajusta el volumen de una nota inclusive si esta activa.
  • alterPitchNota(cant): Ajusta el tono de una nota inclusive si esta activa.
  • pauseSynth(): Pausa la tarea del sintetizador y libera recursos.
  • resumeSynth(): Reanuda la tarea del sintetizador.

Samples de Instrumentos Incluidos

Los samples tienen una duración de entre 0.4 y 1.1 segundos y un tamaño de 30 a 65 KB, con una tasa de muestreo de 32 kHz y 16 bits. Gracias a su pequeño tamaño y a los aproximadamente 4 MB de memoria flash del ESP32, se pueden agregar muchos más samples (instrumentos). Lista de instrumentos con número y nombre: 0 Acordeón, 1 Bajo, 2 Banjo, 3 Cello, 4 Clarinete, 5 Flauta, 6 Guitarra, 7 Marimba, 8 Piano, 9 Saxofón, 10 Trompeta, 11 Ukulele, 12 Violín.

Conexion

Uso Basico

Carga el sketch "firstRun" de la carpeta "examples" y luego -> "Herramientas" selecciona "ESP32 Sketch Data Upload". Esto cargará los samples en la memoria flash del ESP32. Recomendacion seleccionar la opción "NO OTA (Large APP)" en "Partition Scheme".
Inicializa el sintetizador con initSynth(bck, ws, data), donde bck=17, ws=5 y data=18 son los pines por defecto usados en la placa ESP32 utilizados para la comunicación I2S.
Carga un sample setInstrumento(ch,num), (ch=canal seleccionado, num=índice del instrumento deseado).
notaOn(nota, velocity, duracion). velocity y duracion son opcionales; si duración es 0, la nota tiene un sostenido indefinido.

📝Codigo de ejemplo

#include <samplerSynth.h>

void setup() {
  Serial.begin(115200);
  initSynth();
  setVolumen(3);
  setInstrumento(0,6);
}
byte nota=60;
void loop() {
notaOn(0,nota);
delay(500);
nota++;
if(nota==72){nota=60; delay(5000);}   
}

Agradecimientos

Quiero expresar mi sincero agradecimiento a Turman por su contribución inicial en la función de reproducción de sonido que sirvió como punto de partida para el desarrollo de esta librería. Su código proporcionó una base sobre la cual construir y explorar nuevas funcionalidades Este es su Github, también agradezco a Danilo Gabriel por su proyecto ESP32Synth del cual tome algunas ideas para mejorar mi proyecto.

🤝 Contribuciones y Apoyo

¡Las contribuciones, issues y sugerencias son más que bienvenidas! Si tienes ideas para mejorar la librería o encuentras algún problema🐛, no dudes en abrir un Issue o enviar un Pull Request.

Si samplerSynth te ha sido de utilidad o simplemente te sientes generoso, considera invitarme una cerveza. ¡Salud! 🍻

Tambien podrias considerar darle una ⭐ al repositorio. Es una gran forma de apoyar el proyecto y ayuda a que otros desarrolladores de la comunidad puedan encontrarlo.

✍🏼Autor

Desarrollado y mantenido por Holman Buenaventura.

About

samplerSynth allows developers to create audio projects using sound samples. You can load different instruments. The library works with the ESP32's I2S peripheral for sound output and uses an external DAC. | samplerSynth permite a los desarrolladores crear proyectos de audio utilizando muestras de sonido. Puedes cargar diferentes instrumentos.

Topics

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages