Une beat box LoFi avec l'Arduino
Voici un petit projet de beat-box 8 bits avec séquenceur intégré qui ne nécessite aucun montage externe. Ce projet est basé sur le code de little-scale : Arduino Beats et sur l'article de mouro : Signal generator using Arduino and DDS.
Caractéristiques
Cette beat-box possède deux sections : une section rythmique, et une section mélodique permettant de jouer une ligne de basse. La partie rythmique est issue du code de little-scale. Elle est basée sur la reproduction de samples définis dans le code par l'intermédiaire des sorties PWM de l'Arduino. Il s'agit donc de samples codés sur 8-bits. La vitesse de reproduction peut être ajustée dans le code (ligne 30), ce qui modifie le timbre et la hauteur de l'instrument. La lecture des échantillons est gérée par la boucle principale.
La partie mélodique provient du code de mouro. Elle est basée sur la synthèse digitale directe. Une forme d'onde en sinus est échantillonnée sur une période et est décrite sur 8 bits dans le tableau sineTable. Les échantillons sont envoyés sur une sortie PWM de l'Arduino à une cadence dépendant de la note désirée. Je ne rentre pas ici dans le détail de l'algorithme utilisé, allez voir la page de mouro pour ça. Ce qui nous intéresse spécialement, c'est que la génération de la note est gérée par les interruptions de l'Arduino, à une cadence élevée. Cela permet d'obtenir une note juste, et de ne pas interférer avec la lecture des samples de la partie rythmique.
Les deux sections peuvent être jouées simultanément (partie rythmique et basse), mais chacune des sections est monophonique. Ce qui veut dire qu'on ne peut jouer qu'un sample rythmique à la fois, et qu'une note à la fois, mais qu'on peut avoir sur un même beat un sample rythmique et une note (suis-je clair ?..)
Séquenceur intégré
Comme je l'ai dit au début, la beat-box inclut un petit séquenceur. La programmation des séquences se fait dans le code directement. Le code doit donc être recompilé et chargé dans l'Arduino à chaque fois que l'on modifie la séquence.
Les patterns rythmiques sont définis dans le tableau beatPatterns. Chaque pattern contient 16 pas, qui peuvent être mis à 0 (silence), 1 (bass drum), 2 (snare), 3 (hit hat) ou 4 (crash). La partie rythmique du morceau est ensuite définie par le tableau beatSong, ou chaque valeur représente le numéro du pattern, numérotés de 0 à (nb de patterns - 1).
De même pour la ligne de basse, chaque pattern est défini sur 16 pas dans le tableau synthPatterns, dont chaque valeur représente la fréquence de la note jouée (en Hertz). Oui je sais, pas très pratique, mais un coup de Google vous donne rapidement la correspondance note/fréquence. Le tableau synthSong permet d'enchainer les patterns de ligne de basse dans le morceau.
Pour bien faire, les tableaux beatSong et synthSong doivent avoir la même taille...
Mise en oeuvre
Une fois le code compilé et chargé dans votre Arduino, récupérez la sortie de la partie rythmique sur la broche 10 et la ligne de basse sur la broche 9, et envoyez les vers votre ampli ou table de mixage (attention au volume..), sans oublier de reprendre la masse de l'Arduino.
Dès qu'il est mis sous tension ou reseté, l'Arduino va commencer la lecture des séquences programmées.
Pour aller plus loin
Beaucoup d'améliorations sont possibles. Sans modifier le principe, on peut définir d'autres samples pour la partie rythmique, ou une autre définition de forme d'onde pour la ligne de basse. D'ailleurs le code possède une fonction "cachée" : on peut en fait spécifier une forme d'onde "sinus", "carrée" ou "triangle" en mettant à la masse les entrées 2 et/ou 3 de l'Arduino.
On pourrait également améliorer la lecture des samples qui est basée sur la fonction delayMicroseconds relativement imprécise, et qui bloque l'Arduino tant que le sample n'est pas lu jusqu'au bout. De même il est sans doute possible de rendre la partie mélodique polyphonique en mixant les différentes notes.
Enfin une interface permettant de gérer le séquenceur pourrait être développée : définition des séquences, lecture/stop, etc.. On peut aussi penser à la gestion par MIDI, à la synchro externe, etc, etc...
Téléchargez le code Arduino ici.
Caractéristiques
Cette beat-box possède deux sections : une section rythmique, et une section mélodique permettant de jouer une ligne de basse. La partie rythmique est issue du code de little-scale. Elle est basée sur la reproduction de samples définis dans le code par l'intermédiaire des sorties PWM de l'Arduino. Il s'agit donc de samples codés sur 8-bits. La vitesse de reproduction peut être ajustée dans le code (ligne 30), ce qui modifie le timbre et la hauteur de l'instrument. La lecture des échantillons est gérée par la boucle principale.
La partie mélodique provient du code de mouro. Elle est basée sur la synthèse digitale directe. Une forme d'onde en sinus est échantillonnée sur une période et est décrite sur 8 bits dans le tableau sineTable. Les échantillons sont envoyés sur une sortie PWM de l'Arduino à une cadence dépendant de la note désirée. Je ne rentre pas ici dans le détail de l'algorithme utilisé, allez voir la page de mouro pour ça. Ce qui nous intéresse spécialement, c'est que la génération de la note est gérée par les interruptions de l'Arduino, à une cadence élevée. Cela permet d'obtenir une note juste, et de ne pas interférer avec la lecture des samples de la partie rythmique.
Les deux sections peuvent être jouées simultanément (partie rythmique et basse), mais chacune des sections est monophonique. Ce qui veut dire qu'on ne peut jouer qu'un sample rythmique à la fois, et qu'une note à la fois, mais qu'on peut avoir sur un même beat un sample rythmique et une note (suis-je clair ?..)
Séquenceur intégré
Comme je l'ai dit au début, la beat-box inclut un petit séquenceur. La programmation des séquences se fait dans le code directement. Le code doit donc être recompilé et chargé dans l'Arduino à chaque fois que l'on modifie la séquence.
Les patterns rythmiques sont définis dans le tableau beatPatterns. Chaque pattern contient 16 pas, qui peuvent être mis à 0 (silence), 1 (bass drum), 2 (snare), 3 (hit hat) ou 4 (crash). La partie rythmique du morceau est ensuite définie par le tableau beatSong, ou chaque valeur représente le numéro du pattern, numérotés de 0 à (nb de patterns - 1).
De même pour la ligne de basse, chaque pattern est défini sur 16 pas dans le tableau synthPatterns, dont chaque valeur représente la fréquence de la note jouée (en Hertz). Oui je sais, pas très pratique, mais un coup de Google vous donne rapidement la correspondance note/fréquence. Le tableau synthSong permet d'enchainer les patterns de ligne de basse dans le morceau.
Pour bien faire, les tableaux beatSong et synthSong doivent avoir la même taille...
Mise en oeuvre
Une fois le code compilé et chargé dans votre Arduino, récupérez la sortie de la partie rythmique sur la broche 10 et la ligne de basse sur la broche 9, et envoyez les vers votre ampli ou table de mixage (attention au volume..), sans oublier de reprendre la masse de l'Arduino.
Dès qu'il est mis sous tension ou reseté, l'Arduino va commencer la lecture des séquences programmées.
Pour aller plus loin
Beaucoup d'améliorations sont possibles. Sans modifier le principe, on peut définir d'autres samples pour la partie rythmique, ou une autre définition de forme d'onde pour la ligne de basse. D'ailleurs le code possède une fonction "cachée" : on peut en fait spécifier une forme d'onde "sinus", "carrée" ou "triangle" en mettant à la masse les entrées 2 et/ou 3 de l'Arduino.
On pourrait également améliorer la lecture des samples qui est basée sur la fonction delayMicroseconds relativement imprécise, et qui bloque l'Arduino tant que le sample n'est pas lu jusqu'au bout. De même il est sans doute possible de rendre la partie mélodique polyphonique en mixant les différentes notes.
Enfin une interface permettant de gérer le séquenceur pourrait être développée : définition des séquences, lecture/stop, etc.. On peut aussi penser à la gestion par MIDI, à la synchro externe, etc, etc...
Téléchargez le code Arduino ici.
Retour aux articles de la catégorie Arduino -