vendredi 19 avril 2019

Synthèse sonore avec Mozzi et Arduino (3)

Pour cette troisième exploration des possibilités de la bibliothèque Mozzi, nous allons faire jouer par l'Arduino un échantillon ("sample") sonore que nous aurons nous-mêmes produit. Cet échantillon peut être n'importe quel son de courte durée: une note jouée par un instrument de musique, un cri d'animal, un mot que vous aurez vous-même prononcé... Ce son, toutefois, devra être très court (1 seconde ou 2), à cause du peu de mémoire disponible dans l'Arduino Uno.

Trouver un son

Vous pouvez enregistrer le son vous-même, ou encore trouver un son dans une des nombreuses banques d'effets sonores libres de droits disponibles sur internet comme La Sonothèque, par exemple. Puisque je suis enrhumé aujourd'hui, j'ai choisi un son d'éternuement.

Préparation d'un fichier .raw avec Audacity

Le fichier audio de type .wav doit d'abord être épuré au moyen de l'indispensable logiciel (gratuit) Audacity.  Après avoir ouvert votre fichier .wav dans Audacity et, au besoin, effacé toute partie que vous ne désirez pas conserver, réglez la valeur du "Taux du projet (Hz)", dans le coin inférieur gauche de la fenêtre, à 16384.


On choisit ensuite le menu Exporter / Exporter l'audio...


Il faut ensuite modifier les options d'enregistrement: "Autres formats non-compressés", entête "RAW (header-less)" et encodage "Signed 8-bit PCM".



Transformation du fichier .raw en fichier d'entête pour Mozzi avec char2mozzi.py

Le fichier de type ".raw" que nous venons tout juste de produire au moyen d'Audacity doit ensuite être analysé par le script "char2mozzi.py", qui est fourni avec Mozzi dans le répertoire libraries/Mozzi/extra/python.

Vous placez le fichier sonore ".raw" dans le même répertoire que le script "char2mozzi.py". Avec le terminal, vous naviguez jusqu'à ce répertoire, et vous écrivez la commande suivante:

python char2mozzi.py "atchoum.raw" "atchoum.h" "echantillon" "16384"

Dans mon cas, "atchoum.raw" était le nom de mon fichier source, "atchoum.h" est le nom que je désirais donner à mon fichier texte utilisable par mozzi, "echantillon" est le nom que je désirais donner à la variable contenant les données (à l'intérieur du fichier atchoum.h), et 16384 est la fréquence d'échantillonnage.


Tel que prévu, le fichier "atchoum.h" est créé dans le même répertoire que "char2mozzi.py".


Voici le contenu du fichier "atchoum.h":

#ifndef echantillon_H_
#define echantillon_H_
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <avr/pgmspace.h>
#define echantillon_NUM_CELLS 9512
#define echantillon_SAMPLERATE 16384
const int8_t __attribute__((section(".progmem.data"))) echantillon_DATA [] = {0,
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 2, 2, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1,
1, 1, 1, 1, 1, 1, 0, 1, 1, 0, -1, -1, 0, 0, 0, 0, 1, 2, 3, 3, 2, 1, 1, 1, 0, 0,
0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,
0, 0, 1, 1, 2, 2, 2, 2, 1, 0, -1, -1, -1, -1, -1, 0, 1, 2, 2, 1, 1, 2, 2, 2, 1,
2, 3, 3, 3, 1, -1, -2, -2, -2, -3, -2, 0, 2, 3, 3, 3, 3, 3, 1, -1, -1, 0, 1, 1,
0, 0, 1, 2, 1, 1, 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, -1, 0,
1, 1, 2, 2, 3, 4, 4, 2, -1, -2, -3, -2, 0, 1, 2, 3, 2, 1, 0, 0, 0, -1, -1, -1,
0, 1, 3, 3, 3, 3, 4, 4, 2, -1, -3, -2, -1, 1, 2, 2, 1, 2, 2, 1, 0, 0, 1, 1, 0,
-1, -2, -2, -1, 0, 1, 2, 3, 4, 3, 1, 0, 0, 1, 2, 1, 0, 0, 1, 1, 0, -1, -1, 0, 1,
1, 1, 1, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 0, -1, -2, -1, 1, 4, 4, 3, 2, 1, 1, 0,
-1, -2, -3, -2, -1, 0, 0, 1, 2, 4, 6, 7, 6, 2, -1, -2, -2, -2, -1, -1, 0, 1, 2,
2, 0, -2, -2, -2, -2, -2, -2, 0, 3, 5, 4, 2, 2, 5, 7, 6, 4, 2, 2, 1, -3, -8, -8,
-5, -1, 0, 0, 2, 6, 7, 3, -2, -5, -3, -1, 0, 1, 2, 5, 6, 6, 5, 2, -1, -3, -1, 1,
3, 3, 1, 0, 1, 3, 2, -2, -6, -5, -2, 1, 2, 2, 2, 3, 4, 3, 0, -2, 0, 2, 3, 3, 5,
9, 9, 5, 0, -4, -5, -5, -8, -10, -7, -3, 1, 3, 4, 6, 7, 5, 0, -3, -3, -2, -1, 2,
9, 17, 18, 10, 0, -5, -8, -11, -14, -13, -6, 4, 12, 14, 12, 11, 9, 2, -8, -16,
-16, -9, -1, 4, 8, 12, 12, 7, 1, -4, -5, -4, -6, -10, -9, -1, 9, 15, 11, 7, 7,
7, 3, -3, -6, -3, -1, -5, -10, -9, -1, 7, 7, 2, 4, 10, 8, -3, -10, -4, 4, 2, -7,
-15, -15, -8, -5, -3, 1, 11, 17, 13, 5, 6, 12, 11, 0, -10, -6, 6, 9, 3, -3, 0,
7, 10, 7, 5, 5, 6, 1, -11, -19, -16, -10, -11, -12, -3, 12, 17, 11, 6, 1, -5,
-13, -21, -28, -32, -29, -13, 4, 12, 21, 29, 31, 25, 13, 2, -9, -22, -27, -15,
5, 22, 31, 35, 33, 20, 2, -9, -17, -24, -26, -21, -9, 2, 10, 17, 16, 5, -2, -3,
-6, -16, -27, -25, -14, -5, -6, -7, 1, 16, 19, 8, -5, -12, -12, -11, -10, 0, 16,
26, 24, 8, -11, -14, -5, -3, -10, -12, 4, 29, 35, 20, 8, 9, 6, -10, -23, -17,
-1, 8, 6, 4, 4, -1, -6, -9, -12, -13, -6, 0, -6, -15, -8, 12, 22, 14, 7, 9, 4,
-10, -14, -2, 7, -3, -15, -11, 3, 9, 5, 7, 15, 18, 14, 6, -5, -14, -18, -20,
-28, -33, -19, 10, 29, 31, 31, 37, 32, 2, -33, -42, -29, -15, -10, -9, 1, 20,
30, 32, 31, 23, 14, 4, -9, -18, -22, -20, -14, -9, -10, -5, 7, 14, 17, 16, 14,
11, 6, -1, -9, -19, -26, -23, -9, 1, -3, -4, 11, 25, 21, -5, -29, -31, -29, -32,
-26, -8, 17, 37, 38, 25, 14, 10, 8, -5, -26, -28, -8, 10, 11, 6, 17, 42, 50, 36,
20, 7, -4, -16, -30, -33, -26, -16, 2, 19, 27, 31, 27, 10, -13, -28, -30, -29,
-31, -25, -11, -1, 0, -1, 5, 5, -9, -18, -9, 0, -6, -29, -49, -40, -10, 18, 37,
40, 37, 41, 36, 17, 4, 7, 21, 26, 12, 10, 34, 50, 35, 6, -8, -1, 2, -10, -22,
-18, -4, 4, -7, -24, -30, -23, -17, -24, -37, -42, -34, -27, -27, -21, 2, 27,
29, 11, -1, 0, -2, -16, -29, -25, -5, 13, 19, 20, 26, 33, 31, 20, 9, 6, 14, 23,
25, 28, 37, 48, 50, 40, 29, 29, 24, -3, -39, -63, -66, -61, -65, -67, -50, -24,
-3, 8, 5, -7, -9, -4, -11, -28, -37, -25, -5, 1, -3, 7, 22, 12, -18, -35, -21,
8, 33, 43, 42, 43, 51, 68, 78, 71, 62, 62, 45, 0, -38, -45, -32, -31, -48, -59,
-47, -28, -20, -23, -28, -30, -31, -34, -33, -19, 14, 48, 57, 45, 31, 17, -1,
-28, -58, -68, -49, -24, -11, -12, -14, 2, 21, 26, 30, 42, 50, 55, 56, 54, 57,
55, 39, 18, 3, 0, 4, 3, -9, -31, -41, -33, -33, -44, -50, -46, -28, -10, 2, 12,
14, 9, 7, -5, -23, -30, -38, -47, -49, -42, -18, 8, 20, 24, 27, 40, 64, 73, 63,
57, 57, 55, 43, 22, 6, -2, -11, -22, -29, -27, -20, -13, -12, -25, -44, -53,
-49, -35, -13, 16, 41, 48, 34, 14, 8, 4, -10, -35, -60, -67, -57, -40, -21, -1,
21, 50, 73, 84, 87, 66, 22, -15, -29, -21, -8, -5, 1, 9, 10, 22, 44, 39, 11,
-18, -39, -50, -50, -37, -14, 7, 13, 12, 15, 14, 1, -13, -21, -27, -37, -49,
-53, -42, -17, 16, 45, 48, 30, 14, 6, 3, 8, 18, 24, 20, 20, 27, 31, 40, 54, 51,
28, -1, -22, -27, -27, -33, -38, -40, -48, -55, -44, -16, 14, 30, 24, 9, 2, 2,
6, -2, -31, -65, -77, -63, -33, -1, 21, 27, 21, 22, 42, 71, 92, 81, 43, 11, -1,
2, 7, -1, -17, -23, -25, -26, -25, -24, -30, -46, -58, -48, -18, 20, 47, 52, 46,
37, 25, 9, -16, -47, -68, -76, -71, -51, -12, 42, 78, 72, 44, 17, 0, -12, -18,
-12, -8, -4, 19, 46, 60, 70, 74, 60, 29, -10, -36, -47, -63, -82, -77, -47, -17,
-9, -14, -14, -10, -8, -1, -3, -24, -45, -46, -33, -15, 1, 15, 22, 22, 38, 80,
121, 127, 124, 85, 28, -5, -26, -39, -44, -30, -12, -8, -29, -60, -84, -104,
-117, -96, -42, 13, 54, 77, 77, 59, 31, 13, 7, -8, -21, -18, -16, -21, -22, -5,
31, 55, 58, 61, 58, 45, 32, 9, -19, -36, -38, -21, 2, 11, 13, 6, -20, -43, -43,
-27, -14, -5, 3, 5, 0, -6, -23, -55, -84, -84, -50, -12, 7, 18, 38, 73, 109,
127, 121, 88, 33, -17, -42, -39, -10, 20, 30, 22, 11, 8, 2, -32, -75, -94, -86,
-52, 6, 63, 89, 81, 40, -22, -74, -92, -76, -45, -23, -11, 5, 33, 66, 95, 105,
93, 58, 10, -24, -28, -13, -8, -23, -40, -42, -30, -20, -25, -36, -38, -34, -24,
-2, 25, 34, 18, -8, -21, -21, -11, 3, 12, 19, 32, 54, 80, 91, 75, 47, 24, 6,
-11, -25, -31, -31, -34, -49, -67, -70, -65, -64, -67, -67, -53, -27, 3, 30, 42,
44, 46, 44, 35, 20, 17, 43, 80, 97, 90, 62, 31, 11, -18, -51, -64, -58, -43,
-36, -38, -32, -19, -20, -47, -79, -82, -59, -32, -7, 9, 20, 33, 42, 45, 42, 42,
62, 83, 73, 44, 29, 36, 46, 34, 4, -23, -35, -38, -45, -51, -55, -65, -76, -79,
-69, -46, -23, -7, 2, 8, 27, 52, 57, 47, 36, 42, 72, 97, 94, 72, 35, -6, -32,
-36, -24, -22, -45, -73, -88, -94, -92, -73, -38, -5, 8, 6, 0, -1, 4, 11, 15,
17, 25, 57, 106, 127, 119, 85, 49, 12, -31, -59, -59, -39, -39, -61, -75, -64,
-55, -63, -71, -57, -28, -1, 14, 22, 27, 31, 43, 66, 82, 88, 95, 98, 83, 44, -6,
-42, -53, -50, -44, -38, -41, -52, -63, -68, -73, -75, -72, -55, -28, -2, 24,
52, 70, 76, 76, 71, 69, 76, 80, 73, 64, 53, 36, 3, -41, -69, -67, -58, -59, -67,
-70, -63, -56, -64, -72, -61, -40, -14, 18, 40, 46, 40, 34, 52, 90, 121, 124,
102, 72, 50, 32, 11, -10, -31, -49, -63, -74, -79, -70, -57, -63, -87, -101,
-77, -34, -5, 15, 37, 53, 56, 46, 46, 76, 113, 127, 112, 70, 25, -1, -10, -15,
-26, -37, -37, -43, -72, -100, -96, -72, -65, -71, -61, -29, 13, 44, 51, 55, 51,
38, 50, 83, 106, 106, 78, 51, 44, 27, 5, -12, -49, -93, -114, -101, -56, -20,
-19, -28, -23, -7, 10, 13, 7, 2, 5, 35, 81, 113, 110, 83, 50, 24, 6, -9, -28,
-48, -60, -60, -56, -61, -74, -91, -97, -75, -41, -15, 5, 16, 20, 26, 37, 61,
97, 118, 115, 89, 55, 34, 15, -13, -32, -37, -43, -59, -74, -74, -68, -76, -92,
-93, -67, -27, 4, 24, 33, 33, 30, 30, 38, 53, 67, 82, 96, 93, 70, 39, 11, -12,
-26, -36, -51, -67, -75, -64, -43, -39, -61, -76, -61, -37, -26, -16, 2, 18, 27,
39, 62, 88, 104, 101, 71, 28, 5, 10, 12, -1, -23, -36, -32, -40, -79, -106, -81,
-32, -10, -21, -27, -6, 19, 30, 31, 30, 36, 58, 88, 97, 79, 53, 37, 33, 21, -16,
-66, -97, -103, -90, -58, -10, 25, 15, -28, -55, -46, -20, -4, -2, -4, 9, 42,
84, 113, 112, 84, 50, 28, 8, -16, -35, -44, -49, -58, -78, -91, -70, -21, 13,
11, -9, -21, -11, 12, 33, 44, 42, 44, 70, 100, 102, 72, 34, 11, -4, -28, -49,
-56, -51, -53, -72, -81, -68, -52, -48, -55, -55, -34, -1, 28, 41, 42, 49, 67,
76, 61, 31, 26, 62, 96, 87, 44, 4, -11, -12, -23, -60, -99, -86, -43, -20, -16,
-29, -57, -65, -46, -22, -6, 11, 29, 25, 9, 31, 83, 106, 84, 34, -19, -39, -14,
29, 47, 24, -11, -26, -27, -39, -67, -89, -79, -34, 12, 35, 39, 32, 18, 6, -5,
-17, -23, -2, 42, 68, 67, 73, 72, 25, -57, -117, -102, -22, 48, 59, 34, 17, 21,
18, -17, -63, -79, -49, 4, 39, 46, 42, 23, -16, -54, -72, -69, -54, -32, 0, 48,
99, 115, 74, 6, -35, -30, -6, 15, 39, 62, 66, 55, 35, 1, -35, -58, -78, -90,
-70, -25, 5, 2, -8, -10, -24, -48, -53, -39, -19, -5, -4, 5, 48, 102, 124, 82,
-1, -57, -53, -12, 39, 75, 82, 72, 48, 10, -29, -60, -84, -102, -102, -64, -4,
35, 44, 31, -11, -57, -70, -53, -36, -18, 14, 69, 118, 127, 119, 67, -4, -48,
-57, -62, -69, -39, 19, 59, 63, 45, 4, -48, -86, -97, -92, -65, -1, 68, 96, 96,
89, 67, 35, 3, -37, -70, -84, -82, -53, 9, 67, 67, 9, -47, -59, -52, -50, -44,
-19, 26, 74, 104, 104, 72, 17, -39, -77, -87, -55, 10, 65, 81, 64, 39, 20, 3,
-14, -42, -82, -110, -113, -93, -35, 44, 77, 40, -10, -17, 3, 15, 22, 47, 81,
95, 78, 43, 24, 26, 13, -32, -83, -106, -80, -14, 40, 45, 21, -2, -21, -44, -67,
-67, -40, -11, -1, 12, 46, 81, 81, 35, -18, -37, -23, 10, 52, 76, 72, 54, 38,
25, -5, -67, -119, -128, -112, -41, 43, 76, 65, 34, -9, -39, -42, -41, -41, -31,
-10, 27, 83, 126, 108, 33, -36, -71, -87, -69, -9, 46, 66, 62, 36, 1, -25, -46,
-65, -80, -85, -49, 39, 109, 89, 12, -34, -33, -29, -44, -63, -56, 0, 78, 114,
93, 54, 34, 35, 38, 11, -55, -104, -80, -14, 26, 17, -24, -61, -68, -41, -5, 20,
32, 38, 36, 28, 18, 11, 16, 34, 57, 71, 59, 33, 15, -1, -19, -29, -44, -72, -96,
-100, -84, -37, 37, 85, 57, -13, -58, -60, -40, -16, -7, 0, 39, 95, 125, 115,
48, -41, -66, -19, 26, 41, 34, 13, -14, -32, -35, -45, -67, -77, -71, -51, -16,
10, 9, 3, 11, 28, 37, 39, 39, 40, 51, 72, 90, 89, 68, 32, -13, -48, -61, -64,
-69, -61, -46, -51, -59, -50, -46, -53, -52, -33, 4, 47, 63, 44, 16, 9, 28, 49,
60, 66, 75, 85, 77, 46, 13, -10, -24, -31, -50, -91, -120, -103, -49, -1, 5,
-22, -50, -56, -36, -3, 27, 53, 77, 104, 126, 120, 77, 16, -42, -76, -77, -49,
0, 41, 56, 50, 15, -40, -64, -51, -56, -77, -59, 7, 68, 81, 47, 5, -13, -16,
-27, -43, -51, -53, -32, 27, 73, 45, -23, -45, -16, 11, 12, 2, -4, 7, 37, 75,
104, 93, 41, 0, -4, 10, 12, -9, -27, -32, -43, -56, -60, -65, -70, -69, -64,
-55, -36, -10, 6, 9, 15, 19, 17, 24, 46, 78, 109, 125, 127, 122, 94, 55, 17,
-15, -53, -92, -98, -67, -34, -31, -52, -56, -36, -23, -33, -51, -59, -49, -22,
7, 19, 30, 68, 101, 85, 33, -16, -29, 1, 46, 69, 64, 46, 40, 41, 19, -33, -77,
-87, -93, -110, -116, -93, -28, 53, 100, 113, 99, 45, -15, -27, 13, 52, 40, -12,
-61, -61, 2, 60, 45, -12, -54, -49, -4, 31, 13, -35, -43, 19, 92, 96, 26, -41,
-42, -8, 0, -2, 7, 11, 6, 2, 13, 29, 17, -13, -23, -25, -54, -88, -75, -25, 9,
14, 7, 2, 1, -1, 5, 25, 46, 63, 84, 97, 85, 35, -26, -46, -26, -21, -45, -58,
-32, -1, -12, -53, -69, -32, 30, 55, 17, -33, -52, -45, -13, 25, 26, 12, 38, 76,
55, -15, -55, -33, 23, 53, 28, -5, 4, 35, 45, 20, -20, -40, -40, -39, -46, -45,
-10, 45, 67, 48, 13, -19, -47, -64, -65, -61, -60, -28, 35, 69, 48, 7, -16, -16,
-15, -8, 31, 78, 89, 69, 58, 60, 32, -21, -34, -6, 11, 2, -26, -56, -59, -45,
-36, -36, -53, -79, -68, -22, 1, -15, -25, 0, 38, 61, 55, 27, 13, 38, 77, 92,
76, 46, 18, -5, -4, 24, 42, 27, -19, -79, -101, -77, -47, -24, -9, -8, -31, -68,
-61, -10, 22, 24, 4, -24, -10, 43, 70, 52, 16, 6, 42, 97, 113, 44, -47, -60, -8,
44, 55, 8, -53, -65, -28, 10, -6, -61, -77, -27, 38, 50, 12, -16, -18, -29, -50,
-54, -34, -20, -13, 29, 82, 82, 39, 8, 4, -5, -21, -1, 49, 71, 59, 51, 61, 47,
-20, -62, -32, 1, -13, -34, -26, -10, -14, -25, -25, -27, -46, -60, -34, 1, -18,
-52, -39, -2, 20, 28, 36, 33, 13, 20, 79, 127, 105, 28, -19, 8, 48, 34, -7, -24,
-12, -11, -47, -92, -109, -92, -50, 2, 38, 49, 38, 9, -17, -18, -5, -9, -29,
-41, -38, -19, 21, 67, 73, 29, -22, -31, 16, 63, 48, 14, 30, 77, 89, 32, -45,
-68, -40, -5, 15, 19, 12, 4, 2, -2, -21, -43, -47, -35, -28, -38, -51, -46, -38,
-49, -59, -32, 17, 39, 35, 43, 57, 55, 45, 36, 30, 26, 41, 84, 110, 65, -14,
-47, -12, 28, 12, -32, -51, -47, -50, -60, -50, -27, -24, -39, -56, -63, -44,
-13, -9, -32, -43, -9, 46, 78, 75, 51, 29, 22, 25, 47, 73, 71, 53, 60, 80, 61,
-15, -87, -89, -36, 12, 17, -8, -31, -46, -56, -46, -29, -29, -40, -41, -20, 0,
-13, -45, -55, -35, -5, 15, 30, 48, 51, 41, 47, 70, 71, 36, 10, 37, 89, 95, 36,
-36, -60, -28, 9, 10, -13, -29, -33, -36, -48, -63, -64, -52, -50, -55, -41,
-15, -21, -52, -55, -11, 38, 49, 28, 11, 16, 31, 41, 49, 50, 35, 25, 53, 96, 94,
29, -44, -54, -3, 46, 51, 15, -25, -35, -30, -32, -42, -50, -48, -41, -40, -45,
-42, -35, -37, -50, -55, -26, 16, 26, 9, -8, -6, 18, 37, 36, 30, 30, 46, 81,
103, 81, 23, -35, -53, -27, 18, 59, 72, 51, 14, -10, -14, -19, -38, -55, -58,
-57, -58, -52, -31, -19, -43, -78, -76, -27, 28, 43, 23, -3, -18, -16, 10, 46,
70, 62, 40, 35, 44, 37, 13, 5, 22, 36, 28, 20, 42, 71, 66, 29, -6, -23, -38,
-55, -57, -41, -35, -50, -70, -71, -59, -48, -39, -24, -12, -7, -7, -9, -10, -9,
2, 25, 42, 48, 55, 62, 58, 44, 36, 45, 47, 31, 32, 65, 89, 69, 20, -11, -16,
-26, -51, -63, -59, -64, -77, -78, -61, -45, -45, -41, -12, 2, -23, -45, -35,
-1, 17, 14, 32, 73, 82, 60, 40, 35, 27, -6, -26, 20, 102, 127, 92, -1, -63, -58,
-24, -2, -11, -25, -28, -21, -10, -14, -49, -90, -103, -57, 21, 61, 44, 8, -7,
10, 24, 14, 3, 4, 8, 12, 7, -5, -15, -24, -25, -7, 20, 40, 36, 16, 16, 52, 76,
41, -24, -41, 11, 67, 66, 26, -2, -11, -27, -49, -63, -65, -66, -61, -45, -27,
-28, -41, -40, -27, -26, -31, -15, 14, 28, 17, 16, 39, 48, 29, 30, 69, 104, 90,
42, 12, 8, 3, -8, -9, -6, -17, -36, -47, -50, -60, -73, -67, -41, -19, -10, 5,
19, 14, -6, -16, -2, 4, -8, -5, 23, 45, 40, 23, 13, 6, -1, 9, 32, 33, 8, -8, 6,
21, 6, -23, -36, -32, -27, -22, -9, 7, 8, 1, 1, 7, 9, 4, 2, 1, -10, -23, -22,
-10, -6, -10, -10, -4, -5, -7, 1, 5, -8, -21, -3, 39, 69, 66, 43, 18, -2, -16,
-20, -12, -2, 9, 15, 15, 4, -17, -35, -40, -42, -44, -39, -19, 2, 4, -9, -10, 4,
15, 14, 5, -3, -2, 17, 44, 54, 37, 18, 25, 40, 29, -1, -23, -27, -22, -18, -8,
8, 11, -5, -25, -34, -35, -38, -41, -33, -13, 9, 27, 39, 29, 5, -8, 1, 14, 14,
12, 23, 39, 43, 33, 18, -3, -26, -39, -34, -17, 5, 19, 15, -1, -7, 3, 10, -2,
-17, -8, 21, 39, 35, 14, -5, -9, -6, -3, -3, -15, -32, -36, -22, -1, 1, -13,
-18, -3, 17, 22, 8, -10, -14, 2, 27, 41, 44, 43, 42, 36, 22, 9, -1, -11, -11, 0,
5, -10, -34, -49, -45, -38, -40, -45, -40, -14, 19, 36, 35, 28, 21, 15, 13, 18,
24, 19, 9, 5, 9, 14, 17, 16, 8, -6, -17, -18, -14, -8, -2, -1, -4, -9, -13, -16,
-17, -15, -10, -3, 3, 10, 17, 23, 22, 14, 2, -6, -10, -11, -4, 12, 25, 21, 5,
-5, -8, -10, -5, 7, 15, 8, -3, 0, 11, 11, 5, -2, -10, -18, -17, -6, 1, -5, -14,
-10, -1, 4, 1, -5, -4, 2, 4, 0, -9, -18, -15, 2, 23, 26, 9, -5, 3, 21, 29, 22,
10, 2, 4, 16, 25, 19, 1, -12, -14, -16, -22, -31, -36, -30, -15, -4, -4, -14,
-20, -21, -17, -9, -3, -4, -1, 15, 40, 55, 50, 35, 21, 9, 4, 4, 1, -5, -8, 1,
11, 9, -3, -16, -23, -24, -21, -18, -15, -11, -6, -4, -8, -15, -21, -23, -19,
-10, 0, 12, 23, 30, 28, 25, 21, 14, 3, -9, -16, -17, -10, 4, 14, 10, 4, 3, 3,
-2, -6, -2, 5, 8, 9, 9, 1, -10, -16, -17, -19, -25, -23, -14, -6, -4, -1, 3, 6,
6, 2, -1, -1, 3, 10, 14, 12, 5, -1, 2, 8, 8, 3, 1, 7, 13, 14, 8, -1, -9, -12,
-11, -13, -22, -31, -30, -22, -14, -9, -6, -1, 8, 17, 20, 12, 4, 2, 5, 9, 15,
17, 17, 13, 9, 1, -12, -20, -15, -7, -3, -2, -1, -1, -6, -11, -14, -15, -12, -2,
8, 11, 11, 12, 14, 13, 8, 1, -5, -7, -5, -2, -2, -6, -11, -14, -12, -7, -5, -7,
-9, -8, -4, 2, 10, 13, 10, 8, 11, 13, 11, 8, 6, 6, 8, 12, 14, 7, -4, -11, -13,
-15, -19, -19, -18, -15, -11, -8, -10, -16, -14, -4, 9, 18, 24, 26, 24, 22, 21,
17, 9, -1, -5, -4, -3, -6, -13, -19, -21, -16, -8, -3, -2, -1, 6, 14, 15, 4, -7,
-9, -2, 6, 10, 10, 6, 3, 4, 7, 7, 5, 9, 15, 13, 4, -7, -15, -19, -21, -20, -16,
-13, -8, 0, 6, 6, 2, 2, 8, 16, 24, 29, 30, 27, 21, 12, 1, -11, -19, -20, -16,
-11, -9, -10, -11, -10, -10, -11, -13, -12, -6, 3, 11, 13, 10, 7, 9, 14, 20, 25,
26, 24, 22, 19, 12, 4, -2, -3, -4, -8, -14, -19, -22, -24, -22, -20, -16, -12,
-7, -2, 1, 5, 10, 16, 21, 25, 28, 27, 24, 18, 10, 4, 1, -1, -3, -5, -6, -7, -8,
-9, -10, -13, -13, -9, 0, 10, 13, 8, 0, -4, -1, 7, 11, 11, 10, 12, 14, 11, 3,
-5, -8, -6, -3, -4, -6, -5, -1, 2, 0, -5, -7, -4, 1, 3, 4, 9, 18, 26, 28, 22,
12, 3, 0, -1, -2, -6, -8, -5, 0, 2, 1, -3, -8, -12, -14, -13, -9, -3, 4, 12, 14,
9, 0, -4, -2, 3, 9, 13, 13, 10, 8, 9, 11, 11, 6, 2, 1, 2, 4, 5, 3, -3, -9, -12,
-12, -13, -14, -15, -14, -12, -9, -3, 5, 13, 21, 26, 26, 19, 10, 5, 7, 10, 11,
9, 8, 7, 5, -1, -11, -20, -22, -12, 1, 8, 6, 1, -4, -7, -11, -17, -19, -15, -7,
1, 7, 9, 8, 10, 14, 18, 18, 15, 12, 11, 13, 15, 12, 4, -6, -11, -8, -3, -1, -3,
-5, -3, 3, 6, 4, -4, -11, -13, -11, -8, -6, -4, 0, 3, 0, -5, -10, -10, -5, 4,
14, 20, 23, 22, 19, 14, 7, 1, -1, 0, 3, 6, 6, 5, 2, -2, -8, -14, -15, -10, -3,
2, 3, 0, -5, -10, -14, -17, -17, -12, -2, 6, 10, 12, 15, 16, 12, 4, 0, 1, 5, 11,
16, 15, 10, 4, 2, 4, 4, 2, 0, -1, -1, -1, -1, -3, -6, -9, -8, -6, -7, -11, -14,
-14, -11, -5, 2, 6, 6, 3, 0, -1, -1, -2, -2, 2, 9, 15, 16, 12, 7, 3, 0, 1, 5, 9,
12, 14, 15, 13, 6, -1, -8, -13, -13, -10, -6, -6, -9, -10, -10, -9, -9, -11,
-15, -15, -9, 1, 8, 10, 10, 11, 14, 15, 12, 6, 2, 4, 10, 15, 17, 14, 8, 3, -1,
-3, -6, -9, -10, -7, -1, 2, 0, -6, -13, -16, -13, -9, -8, -8, -7, -2, 3, 4, 2,
-1, -3, -1, 9, 18, 22, 17, 12, 9, 7, 4, -2, -7, -6, 2, 9, 10, 7, 5, 4, 2, -3,
-10, -13, -11, -5, 0, 1, -1, -3, -4, -6, -10, -14, -16, -13, -4, 6, 13, 16, 19,
18, 12, 5, 0, -2, -4, -2, 2, 8, 13, 16, 15, 8, -2, -8, -8, -6, -5, -4, 0, 3, 1,
-5, -9, -15, -21, -20, -10, 2, 8, 9, 10, 9, 8, 6, 3, -1, -2, 1, 8, 14, 14, 8, 0,
-4, -2, 2, 3, 2, 1, 5, 8, 8, 3, -3, -6, -7, -5, -5, -7, -9, -7, -4, -1, -1, -2,
-4, -7, -11, -9, -3, 0, 1, 3, 7, 9, 9, 11, 12, 11, 10, 11, 12, 13, 11, 8, 3, 0,
-2, -4, -7, -9, -8, -4, -1, -1, -2, -4, -8, -12, -15, -16, -17, -14, -8, -2, 3,
9, 12, 9, 5, 6, 11, 15, 14, 11, 7, 8, 10, 8, 1, -5, -6, -2, 5, 8, 5, 1, -1, -2,
-4, -6, -9, -11, -9, -7, -8, -10, -8, -5, -5, -3, 1, 4, 5, 6, 6, 6, 4, 4, 3, 2,
1, 1, 2, 1, -2, -2, 0, 4, 8, 10, 10, 9, 8, 7, 4, 0, -2, -2, 0, -2, -4, -5, -6,
-11, -16, -15, -12, -8, -4, -1, 0, -3, -6, -4, -2, -2, 0, 6, 10, 9, 9, 12, 15,
18, 21, 18, 10, 6, 5, 3, -1, -6, -11, -13, -12, -8, -8, -13, -20, -20, -12, -2,
1, 2, 1, 0, 1, 4, 5, 3, 0, 1, 5, 8, 11, 11, 8, 5, 4, 3, 4, 4, 4, 3, 2, 0, -2,
-6, -12, -14, -11, -7, -4, -2, -2, -4, -1, 4, 4, 1, 1, 3, 3, 1, 2, 1, -5, -9,
-4, 3, 6, 7, 7, 6, 4, 3, 0, -3, -4, 0, 4, 5, 2, -4, -6, -4, -5, -8, -9, -5, -1,
3, 6, 5, 2, 2, 3, 4, 3, 0, -2, -1, 0, -1, -1, 0, 3, 3, -1, -3, -3, -1, 0, -1,
-3, -3, -1, 3, 4, 0, -4, -3, -1, 0, 0, 5, 9, 6, 5, 8, 6, 0, -3, -1, -3, -8, -8,
-3, -4, -5, -5, -4, -3, -2, -3, -1, 4, 9, 10, 10, 8, 5, 3, 4, 6, 5, 1, -2, 1, 6,
5, 0, -4, -6, -10, -12, -10, -8, -10, -8, -1, 3, 2, 1, 0, -1, 3, 8, 8, 7, 9, 13,
11, 2, -3, 0, 3, 3, 2, 6, 9, 1, -9, -8, -5, -9, -10, -3, 0, -2, -2, 1, -1, -4,
1, 6, 5, 7, 7, 4, 2, 3, 4, 2, -1, -2, -3, -2, 0, 1, 3, 6, 6, 5, 3, 0, -3, -3,
-2, 1, 3, 3, 2, 1, 0, -2, -3, 0, 2, -2, -3, 2, 7, 4, -1, -1, 1, -3, -3, 4, 5, 0,
-2, 3, 6, 3, -1, 2, 8, 9, 8, 3, -3, -5, 1, 8, 4, -2, -1, 1, -3, -5, -3, -3, -7,
-3, 7, 7, -1, 2, 9, 4, -9, -9, 1, 3, -1, 4, 6, -1, 2, 12, 10, -1, -3, 3, 7, 10,
12, 6, 0, 3, 1, -9, -13, -5, 1, -6, -12, -1, 11, 5, -5, -5, 1, 1, -1, 6, 10, 0,
-6, 0, 11, 13, 7, 3, 1, -5, -2, 11, 9, -6, -4, 12, 10, -3, -5, -7, -18, -14, 0,
0, -2, 3, 2, 1, 11, 16, 5, -5, 2, 10, 7, 3, 5, 6, 3, -5, -7, 1, -4, -19, -11,
12, 9, -9, -9, 5, 8, 2, 0, 2, -3, -5, 6, 14, 5, -4, 2, 10, 6, 2, 3, -1, -5, 3,
10, 4, -6, -6, -1, 0, -3, -9, -14, -8, 7, 12, 4, -5, -2, 12, 16, 3, -3, 2, 0, 0,
2, -2, -9, -9, -3, -3, -4, 4, 7, -5, -7, 8, 10, -2, -3, 8, 9, -5, -3, 11, 8, -6,
-6, 1, -2, -7, 5, 16, -3, -22, -6, 11, 1, -15, -12, 2, 1, -5, 6, 10, -5, -5, 9,
5, -3, 5, 16, 8, -5, 4, 17, 5, -9, -7, 0, 0, -3, -3, -3, -6, -6, -10, -13, -6,
1, 2, 5, -1, -15, -7, 18, 21, -9, -19, 11, 22, -2, -9, 2, 0, -3, -1, -2, 5, 10,
-6, -16, 3, 15, -6, -15, 10, 22, -2, -23, -11, 11, 8, -15, -16, 10, 20, -4, -19,
-1, 13, 5, -2, -4, -2, 5, -1, -9, 0, 6, -8, -9, 7, 3, -13, 1, 20, 8, -6, 2, 11,
3, -15, -13, 2, -4, -10, -1, -1, -13, -14, 2, 12, -4, -11, 7, 6, -3, 8, 14, 4,
-15, -15, 12, 19, -4, -10, 6, 9, -3, 0, 16, 7, -9, -2, -3, -9, -2, -4, -12, -6,
-2, -5, -8, -3, 4, -7, -11, 11, 15, -2, -4, 8, 14, -1, -20, -7, 14, 12, 4, 1,
-2, 0, 1, 0, 2, -3, -7, -6, 0, 5, -10, -21, -5, 1, -15, -10, 16, 23, -4, -18,
11, 23, -2, -7, 7, 8, 0, -6, 0, 7, 4, -1, -10, -16, 2, 16, 6, -10, -8, 6, 5, -6,
2, 10, -5, -17, -7, 11, 13, -1, -9, -4, -1, -4, -6, 7, 20, 7, -13, -6, 11, 0,
-17, -9, 0, -4, 2, 9, -6, -19, -4, 15, 6, 0, 12, 6, -13, -7, 16, 23, 2, -22,
-14, 12, 16, -4, -5, 15, 8, -12, -1, 11, -2, -10, -6, -4, 0, 0, -11, -12, 13,
25, -4, -23, -3, 9, -4, -9, 10, 22, 6, -11, -9, 0, 0, 1, 12, 11, -9, -7, 19, 21,
-6, -22, -7, 14, 9, -9, -7, -2, -3, 11, 16, -8, -24, -5, 14, 7, -2, 2, -3, -14,
-10, 7, 14, -3, -24, -9, 19, 8, -13, 8, 32, 9, -18, -3, 11, 0, 6, 16, -3, -20,
-3, 16, 7, -13, -12, 5, 13, 18, 16, -12, -32, -10, 21, 19, 5, 3, -5, -21, -23,
-9, 4, 10, 4, -6, -9, 0, 7, 9, 7, 3, 7, 12, 1, -2, 15, 12, -11, -12, 7, 11, 1,
-4, -9, -6, 15, 19, -9, -23, -7, 10, 7, -21, -41, -17, 15, 15, -3, -5, 3, 0, 0,
5, -1, 1, 18, 24, 15, 5, 3, 10, 12, 9, 19, 22, -4, -28, -16, 6, 6, -2, -8, -15,
-16, -12, -17, -15, 12, 28, 4, -20, -14, 0, 9, 5, -15, -20, 9, 28, 6, -15, 6,
27, 7, -18, -11, 17, 24, -3, -17, 0, 9, -5, -15, -2, 17, 8, -16, -21, -3, 22,
22, -10, -19, 4, 11, -1, -3, 8, 12, 5, -3, -5, -2, 3, 2, 3, 5, -3, -9, -3, 4, 3,
-3, -7, -6, 3, 11, -2, -16, -2, 16, 6, -7, -1, 9, 9, -1, -13, -9, 8, 8, -10,
-15, -5, 7, 6, -8, -8, 9, 8, -10, -9, 8, 7, -6, -2, 12, 14, 8, 6, 4, 2, 3, 3, 0,
3, 4, -5, -11, -19, -21, 4, 25, 5, -19, -9, 12, 6, -8, 7, 18, -5, -18, 0, 17, 7,
-11, -9, 2, 8, 13, 10, -1, -11, -12, 2, 12, 2, -3, 4, 2, -8, -15, -4, 17, 11,
-19, -27, 5, 28, 1, -24, -3, 17, 9, 4, 5, 2, 2, 10, 15, 10, -4, -12, 0, 15, 1,
-23, -12, 8, -1, -10, -3, 1, 4, 1, -16, -18, 10, 25, 10, -7, -13, -13, 2, 27,
26, 3, 0, 14, 8, -16, -27, -4, 32, 28, -9, -23, -9, 1, -1, -6, 0, 11, 3, -17,
-13, 19, 31, 0, -23, -4, 16, 10, -4, -8, 5, 16, 5, -8, -8, -3, -1, -12, -22, -9,
13, 22, 15, 12, 18, 9, -5, 1, 0, -8, 2, 7, -2, 0, 8, 2, -20, -22, 6, 22, 16, 2,
-20, -17, 15, 25, 7, -1, 4, -6, -25, -13, 20, 21, 8, 11, 5, -8, -8, 0, -2, -13,
-13, 6, 21, 19, 11, 12, 18, 0, -28, -13, 21, 14, -15, -22, -5, 12, 16, 9, 0, -4,
-1, -3, -1, 16, 29, 19, -13, -37, -26, 0, 5, 1, 2, -4, -13, 2, 27, 23, 3, 10,
20, -2, -13, 9, 20, 5, -8, 1, 15, 9, -14, -27, -12, 10, 5, -3, 14, 19, 0, -5, 4,
7, 8, 14, 4, -20, -11, 12, -4, -24, -1, 15, -12, -36, -23, 11, 34, 27, 1, -8,
17, 37, 24, 5, -1, -2, -4, -2, 5, 9, 3, -11, -25, -24, -4, 19, 29, 15, -19, -28,
3, 17, -7, -17, 2, 9, -10, -13, 20, 38, 15, -8, 4, 18, 5, -14, -19, -17, -11,
12, 42, 31, -23, -42, 0, 26, 8, -1, 19, 27, 2, -25, -25, -13, 0, 10, 4, -4, 11,
22, -4, -39, -33, 7, 24, 9, 0, 8, 10, -8, -15, 14, 34, 6, -14, 5, 17, -1, -13,
2, 12, -5, -9, 12, 14, -9, -23, -16, 4, 12, -2, -12, -5, 1, 6, 22, 33, 19, -11,
-22, 4, 25, 3, -29, -18, 7, 5, -10, -8, 3, 1, -1, 6, -3, -22, -11, 15, 18, -4,
-19, -2, 21, 12, -6, 1, 11, -4, -21, -5, 14, 1, -2, 17, 13, 3, 18, 21, -7, -27,
-4, 24, 1, -37, -27, 4, 11, 2, -1, 6, 3, -18, -14, 14, 17, -5, -15, -6, 3, 3,
-2, -2, 4, 18, 28, 15, -13, -13, 16, 29, 4, -25, -24, -6, 2, 2, 6, 0, -13, -18,
-14, -6, 4, 9, 15, 19, 5, -14, -6, 20, 11, -25, -22, 9, 2, -23, -16, 9, 19, 7,
-5, 2, 9, 0, 1, 15, 15, -2, -5, 21, 23, -16, -30, -4, 12, 11, 10, 2, -7, -7, -7,
-12, -17, -14, -6, 2, 7, 2, -7, -7, -5, 1, 16, 22, 2, -22, -20, -4, 0, -7, -3,
8, 14, 13, 6, 5, 9, -8, -28, -10, 22, 19, -7, -9, 16, 24, 5, -7, -14, -27, -23,
0, 13, 5, -13, -17, -1, 19, 25, 11, -11, -12, 1, 2, -8, -13, -6, 1, -12, -23,
-7, 10, 12, 10, 15, 17, 0, -13, 3, 11, -5, -1, 15, 13, -2, -9, -6, -13, -25, -8,
16, 5, -24, -34, -17, 11, 30, 28, 4, -21, -11, 19, 15, -19, -30, -9, 15, 20, 10,
-2, -6, -9, -12, -3, 17, 26, 10, -19, -32, -16, 7, 13, 6, 11, 27, 19, -8, -13,
-9, -19, -16, 5, 19, 12, -5, -20, -44, -64, -39, 11, 36, 36, 23, 8, -4, -14, -3,
23, 27, 15, 4, -3, -6, -11, -12, -6, -14, -14, 15, 32, 21, 9, -1, -23, -42, -28,
3, 13, 10, 9, 1, -11, -13, -5, 6, -3, -20, -8, 30, 51, 23, -16, -17, 0, -2, -12,
-22, -17, 4, 20, 27, 23, 4, -7, -4, -1, 7, 13, 5, -10, -20, -14, -1, 3, 8, 12,
11, 4, -16, -20, 10, 19, -13, -33, -11, 21, 19, -3, -2, 10, 13, 8, -7, -11, 5,
9, -7, -18, -9, 11, 17, 4, -4, -3, -4, -5, 8, 27, 22, -6, -30, -31, -8, 13, 20,
19, 7, -5, 4, 16, 4, -25, -40, -17, 20, 30, 15, -14, -33, -13, 24, 40, 26, -1,
-10, -4, -9, -18, -14, 1, 14, 8, 3, 14, 18, -2, -24, -21, 10, 21, 3, -4, -3,
-13, -12, 9, 28, 9, -33, -30, 14, 29, 10, 0, 12, 12, -17, -38, -17, 16, 22, 4,
-10, -14, -12, 5, 20, 2, -20, -9, 19, 21, -3, -9, 2, -7, -21, -13, 3, 12, 14,
22, 30, 5, -26, -13, 15, 12, -7, -5, 20, 22, -11, -32, -21, 0, 6, -3, -5, 8, 32,
53, 31, -25, -44, -19, 7, 26, 38, 26, -23, -72, -55, 5, 35, 26, 15, 13, 0, -27,
-30, -17, -22, -15, 36, 66, 30, -14, -18, -16, -29, -30, -3, 37, 58, 52, 37, 2,
-48, -62, -38, -19, 1, 36, 67, 53, -2, -37, -34, -21, -7, -3, -7, 4, 23, 38, 28,
-27, -65, -39, -6, 2, 15, 43, 38, -16, -46, -20, 12, 32, 32, 3, -9, 6, 6, -11,
-23, -6, 29, 33, 9, 1, 4, -4, -21, -25, 0, 40, 63, 49, 6, -31, -44, -39, -13,
19, 30, 28, 27, 8, -28, -50, -49, -29, 3, 29, 33, 37, 41, 10, -42, -51, -24,
-19, -24, -3, 37, 65, 50, 2, -25, -20, -7, 13, 28, 26, 16, -1, -23, -19, 8, 9,
-26, -35, 5, 33, 15, -1, 2, -8, -35, -48, -19, 32, 46, 21, 5, -8, -31, -23, 20,
35, 10, 0, 12, 8, -8, -7, 3, 12, 10, -1, -7, -7, 2, 30, 45, 14, -27, -30, -5, 5,
-1, 7, 14, -2, -22, -29, -22, -10, -2, 28, 63, 53, 18, -1, -13, -25, -28, -21,
-9, 3, 8, -3, -11, 10, 31, 28, 16, -1, -22, -26, -16, -7, 7, 16, 6, -2, 10, 14,
2, 2, 13, 14, -1, -14, -4, 14, 5, -26, -36, -20, -18, -24, 9, 54, 53, 18, -22,
-42, -17, 25, 35, 4, -27, -22, -1, -3, -25, -26, 12, 36, 18, 8, 23, 11, -36,
-62, -33, 12, 35, 37, 22, -9, -34, -33, -2, 20, 5, -7, 9, 20, 12, -9, -33, -30,
6, 45, 48, 7, -35, -49, -42, -21, 12, 39, 32, -4, -25, -5, 28, 34, 6, -21, -24,
-15, -16, -33, -37, -5, 33, 38, 18, -8, -23, -7, 30, 55, 46, -5, -57, -58, -31,
-18, -5, 30, 68, 66, 23, -24, -50, -52, -29, 8, 44, 53, 17, -28, -43, -39, -32,
-13, 20, 45, 47, 49, 50, 16, -37, -71, -62, -6, 36, 17, -20, -30, -10, 18, 36,
45, 42, 28, 10, -16, -48, -70, -80, -62, -17, 35, 74, 79, 56, 26, -20, -69, -76,
-30, 37, 55, 17, -9, -19, -32, -16, 26, 50, 40, 11, 2, 21, 29, -3, -54, -84,
-75, -28, 37, 78, 68, 28, -9, -36, -63, -63, -6, 52, 45, -4, -45, -38, 18, 79,
102, 65, -5, -42, -28, 1, 12, -8, -39, -47, -25, 1, 11, 27, 64, 75, 39, -10,
-24, 6, 25, -9, -56, -78, -70, -25, 47, 106, 115, 68, 7, -31, -46, -36, -21,
-29, -46, -40, -4, 43, 75, 84, 64, -1, -75, -86, -24, 39, 49, 27, 5, -27, -48,
-15, 47, 76, 42, -25, -41, -15, -20, -42, -38, -14, 10, 19, 29, 52, 54, 33, 1,
-42, -58, -38, -10, 28, 46, 16, -18, -13, 15, 19, -8, -20, 1, 28, 32, 1, -26,
-22, -12, 3, 24, 32, 13, -25, -46, -45, -55, -49, 9, 75, 87, 40, -21, -47, -47,
-38, -13, 21, 55, 79, 75, 33, -33, -88, -99, -58, 12, 60, 48, -1, -34, -21, 16,
39, 41, 32, 6, -38, -79, -97, -86, -46, 19, 76, 88, 64, 35, 13, -8, -37, -61,
-68, -62, -40, -1, 39, 57, 56, 61, 76, 66, 19, -37, -75, -92, -88, -63, -14, 48,
81, 64, 30, 1, -31, -65, -72, -27, 37, 57, 33, 8, -5, -24, -46, -50, -40, -35,
-18, 25, 70, 91, 81, 42, -14, -61, -81, -80, -62, -19, 34, 67, 64, 45, 43, 45,
14, -33, -61, -65, -61, -47, -13, 25, 52, 70, 74, 62, 41, -2, -61, -95, -88,
-65, -36, 17, 84, 114, 81, 13, -42, -59, -61, -63, -40, 11, 54, 70, 78, 82, 48,
-9, -17, 7, -5, -47, -73, -64, -40, -20, 8, 45, 66, 66, 40, -6, -42, -65, -75,
-54, -12, 22, 43, 67, 90, 78, 29, -25, -68, -90, -82, -52, -5, 51, 90, 92, 63,
28, -4, -45, -83, -87, -62, -28, 6, 32, 53, 62, 57, 52, 42, 3, -46, -67, -62,
-49, -31, 4, 39, 50, 48, 50, 47, 25, -4, -25, -45, -68, -74, -56, -35, -22, -8,
23, 63, 89, 88, 64, 17, -32, -60, -68, -58, -33, 1, 24, 20, 13, 30, 48, 44, 34,
28, -6, -57, -75, -62, -59, -53, -13, 45, 83, 96, 95, 59, -14, -73, -89, -85,
-68, -26, 30, 69, 68, 42, 19, -1, -21, -24, -9, 4, 2, -8, -13, -16, -19, -13,
11, 41, 55, 42, 5, -34, -48, -35, -20, -4, 21, 43, 45, 31, 18, 6, -19, -38, -27,
-5, 0, -3, 4, 11, 5, -11, -32, -46, -37, 1, 48, 74, 70, 43, 0, -44, -68, -61,
-31, 15, 52, 60, 48, 29, 5, -12, -22, -34, -52, -58, -33, 10, 33, 32, 24, 22,
20, 11, 6, 6, -3, -26, -50, -48, -13, 30, 62, 69, 48, 19, -3, -16, -12, -4, -13,
-33, -39, -22, -5, -6, 6, 37, 42, 12, -15, -11, 4, -5, -26, -35, -32, -16, 15,
43, 51, 34, 10, -2, -15, -28, -26, -5, 21, 39, 36, 4, -42, -62, -41, -22, -8,
29, 73, 79, 47, 13, -11, -30, -35, -24, -24, -31, -17, 5, 18, 24, 31, 37, 29,
12, -2, -23, -50, -61, -43, -9, 13, 17, 23, 29, 15, -3, 4, 25, 24, -1, -19, -18,
-10, 1, 4, -7, -14, -6, 1, 2, 7, 16, 19, 17, 27, 33, 12, -15, -20, -15, -21,
-35, -34, -5, 27, 36, 31, 33, 40, 36, 13, -14, -36, -50, -51, -33, -5, 16, 26,
29, 19, -3, -21, -24, -8, 10, 12, 6, 3, -3, -9, -7, -6, -14, -18, -3, 13, 6, -2,
13, 30, 26, 12, 7, 3, -9, -16, -9, 11, 23, 13, -17, -53, -65, -34, 20, 60, 73,
61, 26, -16, -37, -39, -42, -42, -30, -14, -4, 8, 38, 70, 66, 31, -6, -34, -46,
-44, -30, -7, 13, 30, 40, 35, 20, 7, -12, -33, -40, -25, -2, 16, 28, 29, 11,
-13, -16, 1, 7, -1, 5, 20, 14, -10, -21, -12, -6, -8, -5, -3, -11, -13, 5, 23,
12, -9, -15, -12, -9, -3, 6, 15, 18, 7, -7, -18, -20, -12, -1, 11, 19, 22, 24,
26, 22, 10, -10, -30, -43, -41, -19, 8, 26, 34, 38, 41, 29, 5, -3, 2, -5, -21,
-33, -31, -20, -10, -1, 7, 5, 4, 17, 40, 52, 37, 7, -20, -37, -40, -31, -23,
-21, -20, -13, 1, 22, 39, 40, 25, 11, 8, 7, -5, -18, -24, -29, -31, -24, -9, 2,
5, 11, 24, 28, 23, 11, -8, -20, -16, -6, 4, 11, 14, 8, -6, -3, 19, 22, -7, -29,
-13, 14, 21, 15, 7, -5, -15, -8, 12, 26, 20, 6, -4, -8, -5, 2, 8, 4, -13, -26,
-23, -10, 12, 23, 16, 3, -4, -4, -7, -15, -16, -5, 5, 5, 2, 4, 10, 13, 14, 10,
-6, -25, -30, -22, -6, 8, 0, -21, -17, 12, 29, 28, 20, 6, -10, -16, -11, -3, 2,
4, -5, -14, -5, 10, 15, 18, 20, 17, 7, -4, -5, 3, 6, -6, -17, -8, 7, 3, -8, 1,
18, 19, 9, 1, -2, 4, 16, 16, -5, -27, -38, -37, -23, 5, 29, 31, 24, 23, 20, 13,
2, -12, -25, -33, -34, -26, -14, -6, -2, 5, 17, 27, 22, 4, -15, -26, -32, -34,
-26, -2, 25, 36, 31, 22, 10, -7, -20, -17, 3, 20, 23, 16, 3, -14, -15, 5, 25,
21, 1, -14, -17, -9, 7, 17, 9, -3, -3, 2, 6, 10, 17, 19, 7, -13, -22, -12, 6,
17, 18, 11, -2, -13, -17, -18, -18, -20, -23, -23, -16, -4, 5, 14, 18, 7, -11,
-16, -8, -1, 2, 4, 2, -5, -11, -7, 8, 20, 21, 15, 8, 2, -1, 1, 2, -1, 3, 12, 7,
-7, -10, 1, 10, 14, 16, 17, 12, 1, -7, -6, -5, -13, -15, -1, 17, 17, 3, -6, -1,
8, 9, 4, 2, -3, -16, -28, -27, -19, -14, -13, -12, -10, -5, 3, 13, 17, 9, -4,
-9, -3, 6, 8, 1, -5, -2, 6, 10, 7, 1, -2, 3, 11, 19, 23, 16, 0, -13, -8, 2, 3,
3, 7, 2, -9, -12, -6, 3, 11, 12, 9, 8, 7, 2, 1, 5, 4, -8, -19, -23, -25, -24,
-18, -6, 9, 16, 7, -2, -2, -3, -7, -6, -5, -9, -9, 2, 17, 20, 11, 3, 4, 8, 8, 5,
6, 9, 9, 4, -2, -2, 5, 9, 5, -1, -1, 0, -2, -5, -2, 1, -5, -15, -13, -3, -2, -5,
3, 12, 12, 5, 0, -1, 1, 0, -7, -12, -4, 4, 3, 2, 7, 7, -2, -12, -15, -10, -4, 3,
13, 20, 15, 6, -2, -8, -9, -5, 1, 3, 0, -3, -1, 6, 10, 7, 2, 1, 0, -3, 1, 6, 4,
1, 1, -1, -3, 0, 7, 9, 5, 2, 4, 5, 2, -4, -7, -7, -7, -6, -3, -1, 1, 5, 6, 5, 2,
-3, -10, -14, -10, -3, 3, 6, 4, 3, 4, 7, 8, 4, 0, -1, -4, -7, -3, 3, 4, 0, 0, 5,
11, 12, 10, 6, 3, 1, -2, 1, 5, 2, -4, -4, -2, -2, -1, 4, 7, 8, 10, 9, 1, -3, -1,
-2, -6, -4, 2, 1, -2, -1, -1, -5, -5, -4, -7, -9, -2, 6, 5, -1, -3, -6, -6, 3,
10, 7, 2, 0, -3, -4, 4, 11, 10, 7, 6, 3, 0, 4, 7, 6, 7, 8, 4, 0, 0, 0, -1, 2, 6,
5, 4, 7, 7, 1, -3, -5, -6, -6, -4, -4, -5, -3, 1, 3, 2, -1, -4, -4, -1, 0, -1,
0, -1, -5, -5, 1, 6, 5, 3, 2, 1, 1, 3, 4, 4, 6, 9, 8, 8, 8, 6, 4, 3, 1, 1, 3, 4,
0, -1, 2, 5, 6, 7, 6, 1, -2, -2, -3, -4, -3, -2, -4, -5, -3, -3, -4, -3, -1, -2,
-2, 1, 1, -3, -6, -6, -3, 0, 1, -1, 0, 5, 8, 7, 8, 10, 7, 3, 4, 5, 5, 6, 8, 7,
4, 6, 8, 7, 6, 6, 6, 4, 3, 2, -2, -5, -4, -1, -1, -2, -4, -6, -7, -5, -3, 0, 3,
5, 4, 3, 0, -4, -6, -5, -2, 0, 1, 1, 0, -1, 0, 0, 1, 5, 7, 5, 3, 6, 8, 6, 4, 3,
1, 1, 4, 5, 5, 4, 2, 1, 4, 8, 6, 1, -1, -3, -6, -5, 3, 8, 7, 5, 1, -2, -1, 1,
-1, -4, -2, 1, 2, 3, 4, -1, -4, -3, 0, 1, 3, 3, 3, 3, 4, 1, 0, 2, 3, 0, -2, -1,
-2, -2, 1, 2, 2, 3, 4, 3, 2, 3, 3, 1, 0, 1, 2, 2, 2, 1, 2, 4, 4, 3, 2, 3, 4, 4,
4, 1, -2, -1, 1, 0, 1, 3, 4, 3, 2, 3, 2, 1, 0, -2, -2, -1, -1, -3, -3, -1, 0, 3,
4, 5, 3, 1, 0, -1, 0, 2, 2, 1, 2, 2, 2, 2, 3, 3, 2, 2, 1, 1, -1, -1, -1, 0, 1,
1, 1, 0, 0, 0, 0, 1, 3, 4, 4, 4, 4, 2, 0, -1, 0, 1, 3, 3, 1, -1, -1, 0, 1, 2, 1,
0, 0, 2, 4, 4, 2, 0, -2, -2, -3, -3, -1, 1, 1, 1, 2, 3, 2, 1, 0, -2, -2, -1, 0,
2, 6, 8, 7, 5, 3, 0, -3, -2, -1, 0, 1, 2, 3, 3, 1, 0, -1, 0, 1, -1, -2, -2, -1,
0, 2, 3, 2, 1, 0, -1, -1, 0, 0, 0, 0, 1, 0, -2, -2, 0, 2, 3, 3, 3, 4, 3, 2, 1,
1, 1, 2, 3, 3, 2, 1, -1, -1, 0, 1, 1, 1, 0, 0, 1, 1, 0, -1, -2, -3, -4, -3, 0,
1, 0, -1, 0, 2, 2, 1, 1, 2, 3, 2, 1, 0, 0, 1, 3, 2, -1, -2, -1, 0, 1, 1, 1, 0,
-1, -1, -1, 0, 1, 1, -1, -2, -1, 1, 3, 3, 2, 3, 2, 0, -1, -1, -1, -1, 0, 1, 1,
1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, -1, 0, 1, 2, 2, 1, 0, -2, -2, 0, 0, 0, -1,
-1, -1, -1, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 0, -2, -2, -1, 0, 0, 0, 1, 1, 1,
2, 2, 2, 2, 1, 0, 0, 0, 0, 1, 2, 2, 3, 3, 2, 0, -2, -3, -2, 0, 1, 1, 0, 1, 1, 0,
0, 0, -2, -4, -4, -2, 1, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 2, 2, 1, 0, 0, 0, -1, 0,
0, -1, 0, 2, 2, 2, 2, 1, 1, 0, 0, 1, 2, 2, 1, 0, 1, 0, 0, 0, -1, -1, 0, 1, 1, 0,
0, -1, -2, -2, 0, 1, 0, -1, -1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 2, 3, 1, 0, -1,
-1, -1, 0, 0, 1, 0, -1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, -1,
-1, 1, 2, 2, 1, 0, 0, 0, 0, 0, -1, -1, -1, -2, -2, -2, -1, 0, 2, 2, 2, 2, 1, 0,
-1, -1, -1, 1, 1, 2, 2, 1, 2, 2, 1, 0, 0, 0, -1, -1, 0, 1, 1, 1, 1, 1, 0, 0, -1,
-1, -1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1,
0, -1, -1, 0, 1, 1, 0, 1, 1, 2, 1, 0, 0, -1, -1, 0, 1, 2, 2, 3, 2, 1, 0, -1, 0,
0, 0, -1, -1, 0, 1, 2, 3, 2, 1, 0, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1, -1,
0, 1, 1, 1, 0, -1, -1, -1, -1, 0, 1, 2, 1, 1, 2, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0,
0, 0, 1, 1, 1, 0, -1, -1, -1, 0, 0, 1, 2, 3, 2, 1, 0, -1, -1, 0, 1, 2, 1, 1, 0,
-1, -1, 0, 1, 1, 1, 0, 1, 1, 0, -1, -1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 2, 2, 2, 1,
0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1,
0, -1, -1, -1, 0, 0, 1, 1, 1, 1, 0, -1, 0, 0, 1, 1, 1, 1, 1, 0, -1, 0, 0, 1, 2,
2, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, -1,
0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1,
1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1,
1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, -1, -1, 0, 0, 1,
1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 1,
1, 0, 0, -1, -1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 2, 1, 1, 0, 0, -1, 0, 0, 1, 1,
1, 2, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, -1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, -1, 0, 1,
1, 1, 1, 0, 0, 0, 1, 1, 1, 2, 2, 1, 0, -1, 0, 1, 1, 1, 0, 0, 0, 0, 0, -1, 0, 1,
2, 2, 1, 1, 0, 0, 0, 0, 0, 1, 1, 2, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,
1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,
0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1,
1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, };
#endif /* echantillon_H_ */
view raw atchoum.h hosted with ❤ by GitHub

Sketch qui fait jouer notre échantillon

Finalement, voici un sketch qui fera jouer notre échantillon (il s'agit, à peu de choses près, de l'exemple "Sample" fourni avec Mozzi). Pour que ça fonctionne, le fichier "atchoum.h" doit se situer dans le même répertoire que le sketch.

/*
* Exemple de lecture d'un échantillon audio par mozzi
* On fait éternuer notre Arduino
* Le fichier "atchoum.h" doit se trouver dans le même répertoire que ce sketch
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/04/synthese-sonore-avec-mozzi-et-arduino-3.html
*
* Example of playing a sampled sound,
using Mozzi sonification library.
Demonstrates one-shot samples scheduled
with EventDelay.
Circuit: Audio output on digital pin 9 on a Uno or similar, or
DAC/A14 on Teensy 3.0/3.1, or
check the README or http://sensorium.github.com/Mozzi/
Mozzi help/discussion/announcements:
https://groups.google.com/forum/#!forum/mozzi-users
Tim Barrass 2012, CC by-nc-sa.
*/
#include <MozziGuts.h>
#include <Sample.h> // Sample template
#include <EventDelay.h>
#include "atchoum.h" // doit être dans le même répertoire que le présent sketch
#define CONTROL_RATE 64
// use: Sample <table_size, update_rate> SampleName (wavetable)
Sample <echantillon_NUM_CELLS, AUDIO_RATE> aSample(echantillon_DATA);
// for scheduling sample start
EventDelay kTriggerDelay;
void setup(){
startMozzi(CONTROL_RATE);
aSample.setFreq((float) echantillon_SAMPLERATE / (float) echantillon_NUM_CELLS); // play at the speed it was recorded
kTriggerDelay.set(3000); // on le fait éternuer toutes les 3 secondes
}
void updateControl(){
if(kTriggerDelay.ready()){
aSample.start();
kTriggerDelay.start();
}
}
int updateAudio(){
return (int) aSample.next();
}
void loop(){
audioHook();
}
Yves Pelletier   (TwitterFacebook)

dimanche 14 avril 2019

Synthèse sonore avec Mozzi et Arduino (2)

Dans le billet précédent, nous avons vu comment produire un son avec Mozzi. Cette fois, nous allons  écrire un sketch qui joue une mélodie. Ensuite, nous améliorerons progressivement ce sketch en y ajoutant de la polyphonie, puis une enveloppe ADSR.

Jouer une mélodie: la classe EventDelay

Nous voulons donc, dans un premier temps, écrire un sketch qui jouera automatiquement une mélodie. L'algorithme sera donc : jouer la première note, attendre un peu, jouer la deuxième note, attendre un peu, etc.

Mais attention: la bonne vieille fonction "delay()" est désactivée dans Mozzi. Il faut plutôt utiliser la classe EventDelay, ce qui implique de démarrer le chronométrage ("start()"), puis de vérifier périodiquement si le délai est écoulé ou non ("ready()").

Vous en avez une illustration dans le sketch ci-dessous, qui joue de façon répétitive une suite de 12 notes au rythme de 4 notes par seconde.

Pour utiliser des délais dans le sketch, il faut d'abord inclure le fichier "EventDelay.h". C'est fait à la ligne 8 du sketch.

On doit ensuite définir un objet de type "EventDelay": c'est ce que j'ai fait à la ligne 14, je l'ai baptisé "attente".

À la ligne 26, je démarre un temps d'attente de 250 millisecondes grâce à la commande "attente.start(duree);".

Ensuite, à l'intérieur d'updateControl(), je vérifie si le délai est écoulé; ça commence à la ligne 31 du sketch ("if (attente.ready())"). Cette condition deviendra vraie 250 millisecondes après le démarrage du délai.

Lorsque les 250 millisecondes sont écoulées, les lignes 32 à 38 sont exécutées: elles consistent à modifier la valeur de la fréquence de l'oscillateur (ligne 32), à incrémenter la variable "compteur" qui indique le rang de la note à jouer (ligne 33), et à redémarrer le chronomètre pour un nouveau délai de 250 millisecondes (ligne 38).

/* *********************************************************
On joue une mélodie avec Mozzi.
Démonstration de la classe EventDelay
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/04/synthese-sonore-avec-mozzi-et-arduino-2.html
***********************************************************/
#include <MozziGuts.h>
#include <Oscil.h>
#include <EventDelay.h> // fichier nécessaire pour utiliser des délais.
#include <tables/saw2048_int8.h>
#define CONTROL_RATE 64
Oscil <SAW2048_NUM_CELLS, AUDIO_RATE> onde(SAW2048_DATA);
EventDelay attente;
const int duree = 250; // durée d'une note, en millisecondes
// fréquence de chaque note jouée
#define nombreDeNotes 12 // nombre de notes à jouer
const float notes[nombreDeNotes] = {65.41, 138.59, 220.00, 77.78, 164.81, 261.63, 92.50, 196.00, 311.13, 110.00, 233.08, 369.99
};
int compteur = 0; // numéro de la note à jouer
void setup() {
startMozzi(CONTROL_RATE);
attente.start(duree);
}
void updateControl() {
if (attente.ready()) { // c'est le temps de jouer une nouvelle note
onde.setFreq(notes[compteur]);
compteur++;
if (compteur == nombreDeNotes)
{
compteur = 0;
}
attente.start(duree); // on repart le chrono
}
}
int updateAudio() {
return onde.next();
}
void loop() {
audioHook();
}

Jouer des accords (polyphonie)

Rien ne nous oblige à nous limiter à jouer une note à la fois. Le sketch ci-dessous est très similaire au précédent, sauf que nous utilisons 3 oscillateurs afin de jouer trois notes simultanément.


/************************************************************
On joue une suite d'accords en additionnant le signal de
3 oscillateurs.
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/04/synthese-sonore-avec-mozzi-et-arduino-2.html
***************************************************************/
#include <MozziGuts.h>
#include <Oscil.h>
#include <EventDelay.h>
#include <tables/square_no_alias_2048_int8.h>
Oscil <SQUARE_NO_ALIAS_2048_NUM_CELLS, AUDIO_RATE> oscil1(SQUARE_NO_ALIAS_2048_DATA);
Oscil <SQUARE_NO_ALIAS_2048_NUM_CELLS, AUDIO_RATE> oscil2(SQUARE_NO_ALIAS_2048_DATA);
Oscil <SQUARE_NO_ALIAS_2048_NUM_CELLS, AUDIO_RATE> oscil3(SQUARE_NO_ALIAS_2048_DATA);
#define CONTROL_RATE 64
EventDelay attente;
#define NOMBRE_D_ACCORDS 4
const float lesAccords[NOMBRE_D_ACCORDS][3] = {
{261.63, 329.63, 392.00}, // accord de do majeur
{220.00, 261.63, 349.23}, // accord de fa majeur
{246.94, 293.66, 392.00}, // accord de sol majeur
{220.00, 261.63, 349.23} // accord de fa majeur
};
int compteur = 0;
void setup() {
startMozzi(CONTROL_RATE);
attente.set(1500); // on définit la durée du délai
attente.start();
}
void updateControl() {
if (attente.ready()) { // c'est le temps de jouer un nouvel accord
// on règle les 3 oscillateurs à leur nouvelle fréquence
oscil1.setFreq(lesAccords[compteur][0]);
oscil2.setFreq(lesAccords[compteur][1]);
oscil3.setFreq(lesAccords[compteur][2]);
compteur++;
if (compteur == NOMBRE_D_ACCORDS) {
compteur = 0;
}
attente.start(); // on repart en neuf.
}
}
int updateAudio() {
return ((oscil1.next() + oscil2.next() + oscil3.next()) >> 2);
}
void loop() {
audioHook();
}


Enveloppe ADSR

Nos deux programmes précédents donnent un résultat qui manque un peu d'expression, puisque chaque note (ou accord) est joué avec un volume sonore égal du début à la fin.  Pour améliorer les choses, nous allons maintenant définir une enveloppe ADSR qui nous permettra de modifier le volume pendant l'exécution de la note.

"ADSR" est l'acronyme pour Attack, Decay, Sustain et Release, quatre phases qui se succèdent pendant l'exécution d'une note.

  • L'attaque (attack) est la première phase; il s'agit du temps pendant lequel le volume de la note augmente progressivement d'une valeur nulle jusqu'à la valeur maximale. Pour un son percussif, on utilise une attaque courte (le son atteint instantanément son volume maximal), alors qu'une attaque longue donnera un résultat beaucoup plus doux (le volume augmente lentement au début de la note).
  • La chute (decay) est le temps pendant lequel le volume de la note diminue afin de passer de la valeur maximale (atteinte à la fin de l'attaque) jusqu'à une valeur un peu plus faible.
  • L'entretien (sustain) est le temps pendant lequel le volume de la note demeure constant.
  • L'extinction (release) est l'étape finale, pendant laquelle le volume de la note diminue progressivement jusqu'à devenir nul.

Le sketch ci-dessous joue 5 fois la même note en utilisant chaque fois une enveloppe dont les paramètres sont différents.

Cette fois, il est important d'inclure le fichier ADSR.h; c'est fait à la ligne numéro 10.

À la ligne 31, j'ai créé un objet de type ADSR que j'ai baptisé "enveloppe".

Les caractéristiques de l'enveloppe sont réglées aux lignes 44 et 47.

"setADLevels(niveau_attaque, niveau_chute)" (ligne 44) permet de régler le volume sonore atteint à la fin de l'attaque et le volume qui sera maintenu constant pendant la phase d'entretien. Les deux paramètres peuvent prendre n'importe quelle valeur entre 0 et 255.

À la ligne 47, "setTimes(durée_attaque, durée_chute, durée_entretien, durée_extinction)" permet de définir, en millisecondes, la durée de chacune des 4 phases de l'enveloppe. Il semble nécessaire d'éviter les durées inférieures à 20 ms, qui génèrent parfois des résultats indésirables.

À la ligne 60, "update()" met l'enveloppe à jour.

Finalement, la ligne 66 retourne la multiplication de notre enveloppe et de la note jouée par l'oscillateur principal. Il faut diviser par 256 (">> 8") pour que le résultat demeure à l'intérieur des limites requises.

Vous devriez entendre 5 notes qui ne diffèrent que par les paramètres de leur enveloppe.

/****************************************************************
Démonstration de l'utilisation d'une enveloppe (ADSL)
avec mozzi. La même note est jouée 5 fois avec une enveloppe
différente.
https://electroniqueamateur.blogspot.com/2019/04/synthese-sonore-avec-mozzi-et-arduino-2.html
***************************************************************/
#include <MozziGuts.h>
#include <Oscil.h>
#include <EventDelay.h>
#include <ADSR.h> // fichier nécessaire pour générer une enveloppe
#include <tables/saw2048_int8.h>
#define CONTROL_RATE 64
#define NOMBRE_DE_NOTES 5
// format du tableau: niveau_attaque, niveau_chute, temps_attaque, temps_chute, temps_entretien, temps_extinction, fréquence
// les durées sont en ms: éviter les valeurs de 20 ou moins, qui risquent d'être interprétées comme 0.
const int lesNotes[NOMBRE_DE_NOTES][7] = {
{255, 255, 30, 30, 50, 30, 300}, // un court blip
{255, 255, 30, 30, 2000, 30, 300}, // un son de niveau constant
{255, 255, 2000, 30, 30, 30, 300}, // une attaque lente
{255, 255, 30, 30, 50, 2000, 300}, // percussif, avec une longue extinction
{255, 150, 500, 500, 500, 500, 300} // les 4 phases de durée égale.
};
unsigned int compteur = 0; // indique laquelle des 5 notes il faut jouer
Oscil <SAW2048_NUM_CELLS, AUDIO_RATE> oscillateur(SAW2048_DATA);
EventDelay attente; // le délai entre deux notes consécutives
ADSR <CONTROL_RATE, AUDIO_RATE> envelope; // notre enveloppe
void setup() {
attente.set(3000); // une note jouée toutes les 3 secondes
startMozzi(CONTROL_RATE);
}
void updateControl() {
if (attente.ready()) { // c'est le temps de jouer une nouvelle note
// réglage des volumes de l'enveloppe
envelope.setADLevels(lesNotes[compteur][0], lesNotes[compteur][1]);
// réglage des durées de l'enveloppe en millisecondes.
envelope.setTimes(lesNotes[compteur][2], lesNotes[compteur][3], lesNotes[compteur][4], lesNotes[compteur][5]);
oscillateur.setFreq(lesNotes[compteur][6]); // fréquence de la note
envelope.noteOn(); // on joue la note
compteur = compteur + 1;
if (compteur == NOMBRE_DE_NOTES) {
compteur = 0;
}
attente.start(); // on redémarre le chrono
}
envelope.update(); // mise à jour de l'enveloppe
}
int updateAudio() {
//multiplication des 2 signaux et division par 256
return (int) (envelope.next() * oscillateur.next()) >> 8;
}
void loop() {
audioHook();
}


Résultat final

Pour terminer, voici un autre sketch qui joue une suite d'accords mais, cette fois, je leur applique une enveloppe ADSL (définie dans setUp()). Sans l'enveloppe, ça sonnait un peu comme un orgue. Maintenant, c'est plus proche d'un accordéon...

/***************************************************************
On joue une suite d'accords en leur appliquant une enveloppe.
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/04/synthese-sonore-avec-mozzi-et-arduino-2.html
****************************************************************/
#include <MozziGuts.h>
#include <Oscil.h>
#include <EventDelay.h>
#include <ADSR.h>
#include <tables/square_no_alias_2048_int8.h>
#define CONTROL_RATE 64
Oscil <SQUARE_NO_ALIAS_2048_NUM_CELLS, AUDIO_RATE> oscil1(SQUARE_NO_ALIAS_2048_DATA);
Oscil <SQUARE_NO_ALIAS_2048_NUM_CELLS, AUDIO_RATE> oscil2(SQUARE_NO_ALIAS_2048_DATA);
Oscil <SQUARE_NO_ALIAS_2048_NUM_CELLS, AUDIO_RATE> oscil3(SQUARE_NO_ALIAS_2048_DATA);
EventDelay Delay;
ADSR <CONTROL_RATE, AUDIO_RATE> envelope; // notre enveloppe
#define NOMBRE_D_ACCORDS 4
const float lesAccords[NOMBRE_D_ACCORDS][3] = {
{261.63, 329.63, 392.00}, // accord de do majeur
{246.94, 293.66, 392.00}, // accord de sol majeur
{220.00, 261.63, 349.23}, // accord de fa majeur
{246.94, 293.66, 392.00} // accord de sol majeur
};
int compteur = 0; // numéro de l'accord à jouer
void setup() {
startMozzi(CONTROL_RATE);
// réglage des volumes de l'enveloppe
envelope.setADLevels(255, 200);
// réglage des durées de l'enveloppe en millisecondes.
envelope.setTimes(1000, 500, 500, 1000);
Delay.set(3000); // durée de chaque accord
Delay.start();
}
void updateControl() {
if (Delay.ready()) {
oscil1.setFreq(lesAccords[compteur][0]);
oscil2.setFreq(lesAccords[compteur][1]);
oscil3.setFreq(lesAccords[compteur][2]);
envelope.noteOn();
compteur++;
if (compteur == NOMBRE_D_ACCORDS) {
compteur = 0;
}
Delay.start();
}
envelope.update();
}
int updateAudio() {
return ((envelope.next() * ((oscil1.next() + oscil2.next() + oscil3.next()) >> 2)) >> 8);
}
void loop() {
audioHook();
}


Yves Pelletier   (TwitterFacebook)

dimanche 7 avril 2019

Synthèse sonore avec Mozzi et Arduino (1)


Aujourd'hui, je vous propose de jouer un peu avec Mozzi, une bibliothèque dédiée à la synthèse sonore sur Arduino.

Bien sûr, nous avons eu de multiples occasions de faire chanter notre Arduino au moyen de la fonction Tone(), mais cette méthode simple nous contraint à utiliser un signal carré d'amplitude constante, n'ayant le contrôle que sur la hauteur et la durée des notes (pour un résultat qui rappelle inévitablement la musique des jeux vidéos du début des années 1980).

Avec Mozzi, vous transformez votre Arduino en véritable synthétiseur, en contrôlant non seulement la fréquence du son généré, mais aussi son timbre et son enveloppe, pour des résultats beaucoup plus variés.

Matériel

Pour cette première exploration, j'ai utilisé un modeste Arduino Uno. Mozzi fonctionne également sur des cartes plus rapides comme la Blue Pill (STM32Duino) ou l'ESP8266, ce qui pourrait se révéler particulièrement approprié pour des projets plus élaborés.

Par défaut, le signal sonore est généré sur la broche 9 de l'Arduino. J'y a branché une paire d'enceintes multimédias (le signal généré est beaucoup plus faible que celui produit avec la fonction Tone(), et il est nécessaire de l'amplifier pour bien l'entendre). La pointe de la prise jack est relié à la broche 9 de l'Arduino, alors que le manchon est relié à la masse (GND).



Installation de la bibliothèque

Vous trouverez sur cette page la version la plus récente de Mozzi (cliquez sur le bouton vert "Get the most recent release"). 

Après l'installation de la bibliothèque dans l'IDE Arduino, je vous encourage à faire l'essai de quelques-uns des exemples qui l'accompagnent, question de vous assurer que tout est bien fonctionnel, en plus de constater la diversité des sons possibles.

Sketch minimal

Commençons par analyser l'exemple "Sinewave" (chemin d'accès: Exemples / Mozzi / 01.Basics / Sinewave ) qui constitue le strict minimum: la production d'un son sinusoïdal de 440 Hz (pas particulièrement agréable à l'oreille, je dois l'admettre).




Les premières lignes du sketch font référence à quelques fichiers indispensables: "MozziGuts.h" est la bibliothèque elle-même, et vous devez donc toujours l'inclure dans votre sketch. "Oscil.h" est une description d'oscillateur, alors que "sin2048_int8.h" est un tableau comportant 2048 entiers décrivant une oscillation complète d'un sinus (puisque la rapidité est primordiale lorsqu'on synthétise du son, l'Arduino utilisera les valeurs pré-calculées de ce tableau plutôt que de les calculer lui-même au gré de ses besoins).

C'est intéressant d'aller jeter un oeil sur le dossier "/libraries/Mozzi/tables": on y trouve une soixantaine de tableaux décrivant des ondes sinusoïdales, carrées, triangulaires, en dent de scie, du bruit blanc, etc.  


À la ligne 22, nous définissons un oscillateur nommé "aSin" qui, grâce aux données incluses dans le fichier "sin2048_int8.h", oscillera de façon sinusoïdale. "SIN2048_NUM_CELLS" est défini dans le fichier "sin2048_int8.h": il s'agit du nombre de valeurs comprises dans le tableau (on aurait pu écrire tout simplement 2048; il s'agit toujours d'une puissance de 2). AUDIO_RATE est le rythme auquel l'onde sonore sera générée, "aSin" est le nom qui a été donné à cet oscillateur dans ce sketch, et "SIN2048_DATA" est le nom du tableau de données dans le fichier "sin2048_int8.h".

La ligne 25 définit le "CONTROL_RATE", c'est à dire à quel rythme l'Arduino vérifiera si un changement doit être effectué dans les paramètres du son (si la position d'un potentiomètre a changé, par exemple). Il est de 64 Hz par défaut, et doit être une puissance de 2.


L'instruction "startMozzi(CONTROL_RATE)" doit obligatoirement se trouver à l'intérieur du setup(). Ici, on règle aussi la fréquence de l'oscillateur à 440 Hz (ligne 30).


Deux parties qu'on ne retrouve pas dans un sketch Arduino classique sont nécessaires dans un sketch pour Mozzi: updateControl() comporte les instructions permettant de modifier les paramètres du son (par exemple: suite à l'enfoncement d'un bouton ou la rotation d'un potentiomètre). Il est exécuté 64 fois par seconde.  updateAudio() permet la génération du son lui-même, et est exécuté plus de 16000 fois par seconde. Dans ce sketch, on se contente d'émettre la prochaine valeur de notre oscillateur sinusoïdal, mais on pourrait aussi lui faire subir des transformations, l'additionner au signal d'un autre oscillateur, etc.

On retrouve finalement le loop(), qui doit obligatoirement contenir l'instruction audioHook(). Dans un souci d'optimiser la rapidité d'exécution, on doit éviter d'ajouter d'autres instructions dans cette partie.

Combinaison de deux oscillateurs

Amusons-nous maintenant à modifier cet exemple, afin d'explorer progressivement les possibilités de Mozzi.

Le sketch ci-dessous est une version légèrement modifiée de l'exemple Sinewave: il produit un effet de trémolo en multipliant le signal sonore sinusoïdal de 440 Hz par un deuxième signal sinusoïdal dont la fréquence est beaucoup plus lente (16 Hz). Remarquez le décalage à droite (>>8) à l'intérieur d'updateAudio(): le signal de chacun des deux oscillateurs peut prendre une valeur maximale de 255, ce qui implique que la multiplication des deux signaux peut atteindre une valeur de 2552, qu'il faut diviser par 255 afin de ne pas dépasser le maximum imposé. Le décalage de 8 positions vers la droite constitue une division par 255, mais elle s'effectue plus rapidement.  (Au besoin, vous pouvez consulter cet article sur les opérations bit à bit)

/******************************************************************************
*
* Un signal sonore sinusoïdal est multiplié par un signal sinusoïdal de
* basse fréquence afin de produire un effet trémolo.
* Utilisation de la bibliothèque Mozzi
* https://sensorium.github.io/Mozzi/
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/04/synthese-sonore-avec-mozzi-et-arduino-1.html
*
*******************************************************************************/
#include <MozziGuts.h>
#include <Oscil.h>
#include <tables/sin2048_int8.h>
// création de 2 oscillateurs
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> leSon(SIN2048_DATA); // le son de base (haute fréquence)
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> leTremolo(SIN2048_DATA); // oscillateur de basse fréquence
#define CONTROL_RATE 64
void setup(){
startMozzi(CONTROL_RATE);
leSon.setFreq(440); // fréquence du son: 440 Hz
leTremolo.setFreq(16); // fréquence du trémolo 16 Hz
}
void updateControl(){
}
int updateAudio(){
return (int) (leTremolo.next() * leSon.next()) >> 8;
}
void loop(){
audioHook();
}



Modification de la fréquence du son généré, avec un potentiomètre

Pour rendre les choses un tout petit peu plus interactives, je branche un potentiomètre à l'entrée A0 de l'Arduino.


Le sketch ci-dessous génère une onde en dent de scie dont la fréquence est contrôlée par le potentiomètre.  Puisque la fréquence doit être modifiée en cours d'exécution, elle est donc réglée à l'intérieur de updateControl() plutôt que dans setup(). Remarquez l'utilisation de l'instruction "mozziAnalogRead()" qui doit être préférée à notre classique "analogRead()" (car plus rapide). J'ai ajouté 50 à la valeur retournée par "mozziAnalogRead()" car une fréquence de 0 Hz ne serait pas d'un grand intérêt.

/***************************************************
Génération d'une onde en dent de scie
La fréquence est réglée par un potentiomètre
Utilisation de la bibliothèque Mozzi
https://sensorium.github.io/Mozzi/
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/04/synthese-sonore-avec-mozzi-et-arduino-1.html
*****************************************************/
#include <MozziGuts.h>
#include <Oscil.h>
#include <tables/saw2048_int8.h> // tableau pour signal en dent de scie
// définition de l'oscillateur baptisé "leSon"
Oscil <SAW2048_NUM_CELLS, AUDIO_RATE> leSon(SAW2048_DATA);
#define CONTROL_RATE 64
void setup() {
startMozzi(CONTROL_RATE);
}
void updateControl() {
leSon.setFreq(mozziAnalogRead(A0) + 50);
}
int updateAudio() {
return leSon.next();
}
void loop() {
audioHook();
}



Modification du volume sonore, avec un potentiomètre

Le volume sonore est un autre paramètre susceptible d'être contrôlé au moyen d'un potentiomètre, particulièrement lorsque vous désirez moduler le signal principal au moyen d'un deuxième oscillateur.  Le sketch ci-dessous génère une onde triangulaire dont l'amplitude est contrôlée par un potentiomètre.

C'est encore à l'intérieur de updateControl() qu'on vérifie l'état du potentiomètre. Puisque le volume peut prendre une valeur maximale de 255 alors que mozziAnalogRead() retourne une valeur située entre 0 et 1023, on effectue une division par 4. Pour plus de rapidité, toutefois, cette division par 4 est effectuée au moyen d'un décalage à droite (>> 2).

À l'intérieur de updateAudio(), la valeur de l'oscillateur triangulaire est multipliée par la valeur qui dépend du potentiomètre, puis divisée par 256 au moyen d'un autre décalage à droite (>> 8). Par exemple, si la variable "volume" prend la valeur 100, l'opération "(leSon.next() * volume) >> 8" revient à multiplier par 100/256 les valeurs provenant du tableau de données.

/************************************************************************
Production d'un son triangulaire dont le volume peut être ajusté par
un potentiomètre.
Utilisation de la bibliothèque Mozzi
https://sensorium.github.io/Mozzi/
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/04/synthese-sonore-avec-mozzi-et-arduino-1.html
************************************************************************/
#include <MozziGuts.h>
#include <Oscil.h> // oscillator template
#include <tables/triangle_hermes_2048_int8.h>
// définition d'un oscillateur baptisé "leSon"
Oscil <TRIANGLE_HERMES_2048_NUM_CELLS, AUDIO_RATE> leSon(TRIANGLE_HERMES_2048_DATA);
#define CONTROL_RATE 64
byte volume;
void setup() {
startMozzi(CONTROL_RATE);
leSon.setFreq(220); // fréquence de 220 Hz
}
void updateControl() {
volume = mozziAnalogRead(A0) >> 2; // division par 4 pour passer d'un maximum de 1023 à un maximum de 255.
}
int updateAudio() {
return (leSon.next() * volume) >> 8; // on termine par une division par 256
}
void loop() {
audioHook();
}


Il reste encore beaucoup de choses à raconter concernant Mozzi...un deuxième billet est en préparation.

Yves Pelletier   (TwitterFacebook)

mercredi 3 avril 2019

Programmer un Raspberry Pi avec Arduino Create: suite...et fin!

La semaine dernière, je vous ai présenté un premier article sur l'utilisation d'Arduino Create pour la programmation d'un Raspberry Pi. En peu de temps, et sans difficulté majeure, j'avais fait clignoter une LED branchée au Raspberry Pi en utilisant le célèbre sketch "Blink".  Ça s'annonçait plutôt bien.

Aujourd'hui, je vous présente le résultat de quelques autres tentatives de programmation d'un Raspberry Pi au moyen d'Arduino Create...avec des résultats beaucoup moins réjouissants.

Où est la documentation?

Massimo Banzi a annoncé officiellement la possibilité de programmer un Raspberry Pi au moyen d'Arduino Create en mars 2018. Un an plus tard, je ne trouve aucun tutoriel, wiki ou autre forme de documentation sur la façon de procéder: c'est comme si l'équipe d'Arduino Create avait oublié l'existence de l'outil qu'elle a créé!

Pas de problème concernant l'étape consistant à lier votre Raspberry Pi à Arduino Create, décrite dans mon article précédent: il s'agit de suivre les instructions à l'écran, et celles-ci sont claires. Mais ensuite, on se retrouve dans l'éditeur en ligne, avec un sketch vide. Quelles sont les bibliothèques supportées? Quels changements doit-on effectuer dans un sketch initialement conçu pour l'Arduino? Allez savoir...

La page github d'Arduino Connector comporte certaines informations, mais rien de tout ça ne semble vraiment utile lors de la rédaction d'un sketch.

analogRead()

Puisque le Raspberry Pi ne comporte pas de convertisseur analogique/numérique (ADC), il me semble évident qu'un appel à analogRead(A0) n'a pas la moindre chance de fonctionner correctement. Par curiosité, j'ai tout de même compilé, téléversé et exécuté l'exemple "AnalogReadSerial" dans mon Rasberry Pi. Aucun message d'erreur ne m'indique que ce que je demande n'a pas de sens.



Serial.println()

J'étais aussi curieux de savoir si la commande Serial.println() allait permettre d'afficher quelque chose dans le "moniteur série" d'Arduino Create, malgré le fait que le Raspberry Pi n'est pas branché par USB.

Le moniteur est disponible, et réglé à mon Raspberry Pi ("Cloud Device: RaspberryPi2"). Il n'y a pas de menu permettant de régler la vitesse de communication (baud rate), toutefois.

Rien ne s'y affiche pendant l'exécution de mon sketch.


Lorsque mon Raspberry Pi est éteint, Arduino Create se donne la peine d'annoncer que le port série n'est plus disponible (donc il aurait dû fonctionner avant, non?).


Puisqu'il semble impossible de recevoir ces messages dans le moniteur série d'Arduino Create, j'ai tenté de les capter au moyen d'un convertisseur USB/série branché à la broche GPIO14 du Raspberry Pi: je n'ai rien capté.


Pourtant, la communication UART est activée dans les réglages de mon Raspberry Pi, et je suis capable d'émettre des messages UART sur la broche GPIO14 grâce à un script en Python.

Conclusion: ou bien j'ai fait quelque chose de travers, ou bien Serial.println() ne fonctionne pas.

(Ici, mon enthousiasme vient d'en prendre un coup: programmer un sketch Arduino sans pouvoir récupérer d'informations par communication série, de mon point de vue, c'est un peu comme jouer au tennis avec les yeux bandés.)

Un afficheur?

Pendant que j'y suis, dans l'espoir de faire fonctionner quelque chose  aujourd'hui, j'ai aussi tenté d'afficher un bout de texte sur un écran LCD 16 X 2 branché au Raspberry Pi. La bibliothèque LiquidCrystal est disponible par défaut dans Arduino Create, ça aurait donc dû être facile...

Résultat: rien du tout­. L'afficheur fonctionne pourtant correctement lorsque je le contrôle au moyen d'un script en langage python.



Conclusion: non merci!

Programmer un Rasperry Pi avec Arduino Create, oublions ça! Tout ce que j'ai réussi à faire, c'est faire clignoter une LED.  Toutes mes autres tentatives ont été vaines.

Si vous avez plus de succès, n'hésitez pas à nous le faire savoir en laissant un commentaire ci-dessous...

Yves Pelletier   (TwitterFacebook)