Un secuenciador euclideo con Arduino (demo en vídeo)

Guillermo Cornezuelo del Centeno
#1 por Guillermo Cornezuelo del Centeno el 12/11/2021
EDIT: Podéis ver el código aquí: https://gist.github.com/Ghillermo/753d66df96c8d02061e28cf1aca5dbbc
Tiene alguna mejora con respecto al original, usa 6 pìstas en vez de 4, corregido un bug al cambiar de pista y resalta la pista seleccionada actualmente. También he cambiado el pinout para ser compatible con Arduino UNO y he ordenado y comentado un poco el código. Idealmente debería estar en archivos separados, pero de momento es manejable el formato archivo único.

Hola, no suelo publicar aunque hace muchos años que me gusta pasarme a lurkear de vez en cuando.

Soy profe de Robótica y Programación y fan de Arduino y los sintetizadores. Me gusta la idea de poder programar el comportamiento de mis máquinas así que he fabricado un prototipo se secunciador midi un poco particular, que podéis ver en el enlace, y comparto por si surgen preguntas, ideas o críticas:

https://www.reddit.com/r/synthdiy/comments/qrz0w6/demonstrating_my_euclidean_sequencer/?utm_medium=android_app&utm_source=share

Es un secuenciador que se conecta al midi IN de cualquier sinte y genera hasta 4 patrones euclídeos en 16 pasos, asignando a cada uno una nota de la escala cromática. La explicación que viene a continuación no es muy científica e informada, las nociones que maneja son de divulgación y wikipedia, si alguien quiere matizarlas o corregirlas es más que bienvenido.

Los patrones euclídeos son formas de "distribuir homogéneamente" un número de notas entre (en este caso) 16 intervalos de tiempo iguales. Si pensamos en un secuenciador de 16 pasos, una nota estaría en el beat 1. 2 notas estarían en el 1 y el 9. 4 notas ocupan el 1, el 5, el 9 y el 14. Sin embargo cuando el número no es divisible, la secuencia se ve "forzada" a tener tiempos "cortos" y "largos", que generan síncopas de la forma más "repetitiva" posible.

La gracia está en que por lo visto, muchas músicas de todo el mundo pueden "aproximarse" a este tipo de ritmos, especialmente música que produce la sensación de "caminar" o "bailar". Desde un punto neurológico tiene un sentido, pues caminamos de forma binaria (izquierda-derecha) y nuestra percepción del ritmo se relaciona con nuestra noción de caminar. Los patrones euclídeos juegan con la sensación de "paso" y "contrapié". Se entienden rápido pero al juntar varios se consiguen cosas complejas.

El aparato consta de 8 botones (siguiente/anterior pista, más/menos notas, más/menos semitonos y rotación horaria/antihoraria) y un codificador rotativo (tempo) y un botón (actualmente play/stop, pero es una prueba de concepto, trabajando en ello). Una placa Arduino Mega, un breakout con optoacoplador y terminales DIN midi, un módulo anillo led ws2812, muchos cables, algún conector soldado, cartón pluma y mucha cinta aislante. Encima de los leds tengo una lente de unas gafas de sol de esas de ver en sepia que se me rayaron y le dan la corrección gamma y definición perfecta a los colores generados por HSV. Se ven mejor los colores en persona que en el vídeo.

Al encender la máquina empezamos con un patrón en blanco seleccionado. Los botones dedicados permiten de inmediato cambiar el número de notas en este patrón, su tono o el desfase (rota el patrón, desplazando todos los beats en cualquier sentido) también podemos cambiar a un nuevo patrón y editarlo mientras se reproduce el anterior, o volver a un patrón anterior y modificarlo. Como el Odyssey es monofónico, cada vez que coinciden dos notas, elige aleatoriamente una de ellas, aunque soportaría polifonía o canales separados.

Gracias por aguantar la chapa. Si hay preguntas, comentarios o ideas sobre qué hacer a continuación, os escucho. Si tenéis curiosidad por ver el código lo comparto pero está bastante feo y poco documentado. Si hay interés lo pongo legible.
Subir
2
OFERTASVer todas
  • -6%
    Elektron Digitakt II (B-Stock)
    939 €
    Ver oferta
  • -40%
    Roland SPD-20 Pro BK Octapad
    398 €
    Ver oferta
  • -13%
    Roland Juno-D6
    839 €
    Ver oferta
C.R.D
#2 por C.R.D el 12/11/2021
Hola, está super tu proyecto. ¿Me puedes compartir el código y esquema para replicarlo? Muchas gracias.
Subir
1
Guillermo Cornezuelo del Centeno
#3 por Guillermo Cornezuelo del Centeno el 13/11/2021
Hola, en los próximos días publicaré el código (aunque está un poco lioso). No tengo esquemático pero puedo ayudarte a montarlo si tienes dudas, todo va directo a la placa con su propia alimentación. A ver si lo documento. Puedes revisar también el link que ha puesto otro usuario en el post de Reddit de un proyecto similar, le estoy echando un ojo y viene muy completo. Por si quieres ir avanzando un montaje, estos son los pines que uso:

-Botones: van a GND y cada uno a una entrada analógica de A0 a A7. Tienen mucho ruido, así que utilizo analogRead para descartar falsos positivos, es una ñapa pero funciona. Se leen mediante polling y se debouncean sin bloquear el código. Puedes usar pines digitales si tus botones son más estables (es más eficiente), lo importante para que el código funcione es que sean consecutivos (o adaptar el código).

-Modulo anillo led: 5v y gnd van a un cargador de móviles, gnd también a Arduino. El data input lleva una resistencia de protección para bajar a 3.3V (si lo necesitas consulto el valor) y va conectado al pin 2. Creo que también valen el 9 y el 13 pero no lo he probado. Pines sin PWM no funcionan.

-Encoder: un ky0040 con botón básico. Clock y data se conectan a dos pines que puedan gestionar interrupcione(2 y 3 en Arduino Uno), la alimentación sale de Arduino 5V.

-Módulo midi: va conectado a Tx de Arduino, usa un optoacoplador para conectarlo al pin data de un conector 3DIN midi. En el peor de los casos te puedes hacer uno pelando un cable midi y añadiendo algún componente.

EDIT: Aquí el código, en un único archivo, aunque no muy legible: https://pastebin.com/0JZ5wwbE NUEVO LINK: https://gist.github.com/Ghillermo/753d66df96c8d02061e28cf1aca5dbbc Si quieres probarlo por serial debes desactivar el midi. Para ello pulsa ctrl+F en tu IDE y sustituye //Serial por Serial y MIDI por //MIDI (no ignorar case) De todas formas espero tener un código mejor presentado y documentado en los próximos días.
Subir
Hilos similares
Nuevo post

Regístrate o para poder postear en este hilo