Boite à musique

Jérémy Cochoy

2013/08/16

Dans la lignée du dépoussiérage de vieux codes, j'ai ressorti un jeu de quelques fonctions pour arduino que je n'ai pas eu le temps de publier. Il s'agit d'une certaine façon d'une bibliothèque similaire à la lib "Tone" fournie avec l'Arduino. Toutefois, contrairement à cette dernière, c'est bien un instrument polyphonique dont vous disposez. À dire vrai, il y a 4 canaux d'onde carré, et un canal de bruit. On peut de plus régler l'amplitude sonore de chacun des canaux entre 0 (minimum) et 255 (maximum). Il y a tout de même une contrainte ; la somme des amplitudes ne doit pas excéder 255. Ainsi, jouer de la musique est relativement simple. Il suffit de choisir la fréquence et l'amplitude de chaque canal, puis d'attendre un certain laps de temps (fonction delay fournis avec les libs de l'arduino) avant de recommencer. Le bruit est généré grâce à une table de valeurs aléatoires près-calculés, pour des raisons de performances. Vous pouvez réduire ou augmenter la taille de cette table à votre guise, un "script C++"(trop peu de lignes pour parler de programme) permettant de générer le header.

Tout ceci est plutôt abstrait, alors regardons cela de plus près.

Montage de test :

Le montage de test est très similaire à celui du tutoriel tone. Seul change le port sur lequel vous devez connecter votre speacker.

Montage arduino

Donc, une résistance d'une centaine d'ohms (prenez ce que vous avez sous la main, plus la résistance sera élevée, moins le volume le sera) reliée à un speacker, ou bien à une prise JACK pour brancher vos enceintes favorites.

Si vous souhaitez changer le port de sortie, il vous faudra toucher au code (et au code asm aussi :/) car le code utilise un mécanisme de l'ATMEGA328P qui n'est disponible que sur les ports 11, 10, 9, 6, 5 et 3 de l'arduino (ceux marqués d'une petite vague). De plus, si vous souhaitez utiliser le port 3 conjointement à ce code, vous risquez d'avoir quelques soucis. (Ces ports sont regroupés en paires, et chaque port d'une paire ne peut émettre un signal qu'à la même fréquence. Vous ne pourrez pas non plus utiliser l'interruption du timer 2, utilisé par ces deux ports. Ici, le code utilise la fréquence maximum possible, donc cela ne devrait à priori pas poser de soucis pour les utilisations les plus simples du port 3, comme contrôler l'intensité lumineuse d'une led).

Fonctionnement de la Lib

L'utilisation se fait via le header Synth_8bits.h qui définit plusieurs variables globales essentielles au fonctionnement. Dans un premier temps, il faut initialiser la lib en appelant synth_setup();. Par la suite, vous disposez de 4 variables de période / fréquences :

extern int square1_period;
extern int square2_period;
extern int square3_period;
extern int square4_period;

En fait, c'est la période de l'onde qui est stockée, exprimée en 62500ième de seconde. Une macro, frequency_to_period(f), s'occupe de convertir une fréquence f (en Hz) en une période. Un exemple d'utilisation serait :

square1_period = frequency_to_period(440); //Le LA de référence est à 440Hz

De nombreuses macros et un tableau sont là pour vous permettre de choisir une note de façon plus agréable :

square1_period = frequency_to_period(NOTE_A4); //Pour encoder, directement dans votre code, une mélodie
square1_period = frequency_to_period(note_table[BNOTE_A4]); //Pour pouvoir facilement générer des mélodies à partir d'algorithmes.

Reste un détail important : le volume de sortie! Il se fait à l'aide des

extern unsigned char square1_amplitude;
extern unsigned char square2_amplitude;
extern unsigned char square3_amplitude;
extern unsigned char square4_amplitude;

Où vous pouvez choisir une amplitude sonore entre 0 (pas de son) et 255 (volume maximum). Attention ! La somme des volumes de tous les canaux doit être inférieure à 255 ! (Sinon et ben, ça sera moche et tout sauf musical ;) ).

Vous pouvez ainsi créer vos propres instruments en superposant différentes fréquences, et en modifiant le volume des canaux au cours du temps (par exemple, si vous voulez un son qui s'atténue, décrémentez petit à petit l'amplitude jusqu'à ce qu'elle atteigne 0). Le second exemple sonore exploite cette possibilité.

Pour les percussions, il y a le canal de bruit.

extern unsigned char noise_amplitude;

C'est un canal qui émet un son similaire à celui d'un vieux téléviseur sans antennes, un "Tshhhhh" très caractéristique. À nouveau, en faisant varier l'amplitude (on parle de modulation d'amplitude), vous pouvez créer le timbre de divers instruments de percussion. La fonction play_seawave(); est un exemple.

Le bruit est près calculé grâce au programme C++ generate_white_noise.cpp.src (qui n'est autre qu'un fichier .cpp). Vous pouvez le bidouiller pour diminuer ou agrandir la table.

Code et exemple de test

Voici le code directement dans ce billet, et sous la forme d'un tar un peu plus loin. Les commentaires sont plutôt explicites :

// Synth_8bits.h :

#ifndef SYNTH_8BITS_H_
# define SYNTH_8_BITS_H_

//Some macros
#define frequency_to_period(f) (62500 / (f))

/*
#ifdef __cplusplus
extern "C" {
#endif
*/

/*************************************************************************/
/* Here come definitions and prototypes for the Synth_8bits library      */
/* All this stuff is given, without guaranty, and under the BSD licence. */
/*                                 ---                                   */
/* By Jeremy Cochoy                                                      */
/*************************************************************************/

//White noise table, in progmem
extern char white_noise[4096];

/////////////////////////
// Settings / Controls //
/////////////////////////

//Periods, stored after applying the right calculus with frequency_to_period(int)
extern int square1_period;
extern int square2_period;
extern int square3_period;
extern int square4_period;

// 0 = full speed, 255 = slowest (for a tv white noise sound
// use 20, which i the default value)
extern unsigned char noise_speed;

//Output amplitudes. Make sure that the sum of all your amplitudes of synth is < than 256!

extern unsigned char square1_amplitude;
extern unsigned char square2_amplitude;
extern unsigned char square3_amplitude;
extern unsigned char square4_amplitude;

extern unsigned char noise_amplitude;

/*************************************************
* Public Constants, from Tone Lybrary, by B Hagman
*  see : http://code.google.com/p/arduino-tone/source/browse/trunk/Tone.h
*************************************************/

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978

/**********
 * A table that contain all those frequencies (89)
 * stored in sram.
 **********/
extern int note_table[];

/**********
 * Give the 8bits index of the previous table, if you know the note
 **********/
#define BNOTE_B0    0
#define BNOTE_C1    1
#define BNOTE_CS1   2
#define BNOTE_D1    3
#define BNOTE_DS1   4
#define BNOTE_E1    5
#define BNOTE_F1    6
#define BNOTE_FS1   7
#define BNOTE_G1    8
#define BNOTE_GS1   9
#define BNOTE_A1    10
#define BNOTE_AS1   11
#define BNOTE_B1    12
#define BNOTE_C2    13
#define BNOTE_CS2   14
#define BNOTE_D2    15
#define BNOTE_DS2   16
#define BNOTE_E2    17
#define BNOTE_F2    18
#define BNOTE_FS2   19
#define BNOTE_G2    20
#define BNOTE_GS2   21
#define BNOTE_A2    22
#define BNOTE_AS2   23
#define BNOTE_B2    24
#define BNOTE_C3    25
#define BNOTE_CS3   26
#define BNOTE_D3    27
#define BNOTE_DS3   28
#define BNOTE_E3    29
#define BNOTE_F3    30
#define BNOTE_FS3   31
#define BNOTE_G3    32
#define BNOTE_GS3   33
#define BNOTE_A3    34
#define BNOTE_AS3   35
#define BNOTE_B3    36
#define BNOTE_C4    37
#define BNOTE_CS4   38
#define BNOTE_D4    39
#define BNOTE_DS4   40
#define BNOTE_E4    41
#define BNOTE_F4    42
#define BNOTE_FS4   43
#define BNOTE_G4    44
#define BNOTE_GS4   45
#define BNOTE_A4    46
#define BNOTE_AS4   47
#define BNOTE_B4    48
#define BNOTE_C5    49
#define BNOTE_CS5   50
#define BNOTE_D5    51
#define BNOTE_DS5   52
#define BNOTE_E5    53
#define BNOTE_F5    54
#define BNOTE_FS5   55
#define BNOTE_G5    56
#define BNOTE_GS5   57
#define BNOTE_A5    58
#define BNOTE_AS5   59
#define BNOTE_B5    60
#define BNOTE_C6    61
#define BNOTE_CS6   62
#define BNOTE_D6    63
#define BNOTE_DS6   64
#define BNOTE_E6    65
#define BNOTE_F6    66
#define BNOTE_FS6   67
#define BNOTE_G6    68
#define BNOTE_GS6   69
#define BNOTE_A6    70
#define BNOTE_AS6   71
#define BNOTE_B6    72
#define BNOTE_C7    73
#define BNOTE_CS7   74
#define BNOTE_D7    75
#define BNOTE_DS7   76
#define BNOTE_E7    77
#define BNOTE_F7    78
#define BNOTE_FS7   79
#define BNOTE_G7    80
#define BNOTE_GS7   81
#define BNOTE_A7    82
#define BNOTE_AS7   83
#define BNOTE_B7    84
#define BNOTE_C8    85
#define BNOTE_CS8   86
#define BNOTE_D8    87
#define BNOTE_DS8   88

//////////////
//Prototypes//
//////////////

//Initialisation (call it in void setup() )
void synth_setup();

//Play some chord 'like' an orgue
// (do not forget to delay a little time after...)
void play_org(int f);

//Play waves from the sea/beach
// (just call it in a while(true) )
void play_seawave();

/*
#ifdef __cplusplus
}
#endif
*/

#endif /* !SYNTH_8BITS_H_ */
</pre>

<br/>
Synth_8bits_lib.cpp :<pre lang="C" colla="-">#include <avr/io.h>
#include <avr/interrupt.h>

#include <Arduino.h>

#include "Synth_8bits.h"
#include "white_noise.h"

//Periods, stored after applying the right calculus with frequency_to_period(int)
int square1_period = 0;
int square2_period = 0;
int square3_period = 0;
int square4_period = 0;

// 0 = full speed, 255 = slowest (for a tv white noise sound, use 20
unsigned char noise_speed = 20;

//Output amplitudes. Make sure that the sum of all your amplitudes of synth is < than 256!

unsigned char square1_amplitude = 0;
unsigned char square2_amplitude = 0;
unsigned char square3_amplitude = 0;
unsigned char square4_amplitude = 0;

unsigned char noise_amplitude = 0;

///////////////////////
// PRIVATE VARIABLES //
///////////////////////
//Counters used to synthetise at the right frequency

int square1_id = 0;
int square2_id = 0;
int square3_id = 0;
int square4_id = 0;

int noise_id = 0;

unsigned char noise_delay = 0;

//Note table
int note_table[] = {31, 33, 35, 37, 39, 41, 44, 46, 49, 52, 55, 58, 62, 65, 69, 73, 78, 82, 87, 93, 98,
  104, 110, 117, 123, 131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247, 262, 277, 294, 311, 330,
  349, 370, 392, 415, 440, 466, 494, 523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988, 1047, 1109,
  1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1976, 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136,
  3322, 3520, 3729, 3951, 4186, 4435, 4699, 4978};

void synth_setup()
{
  //Fast PWM
  //COM2A 1:0 = 2 -> not inverted
  //WGM0 2:1:0 = 3 -> FAST PWM
  TCCR2A = _BV(COM2A1) | _BV(WGM01) | _BV(WGM00);
  
  //Timer setting
  //Setup the mask
  TIMSK2 = _BV(TOIE2);
  //Set N=1 : no divisor
  TCCR2B = 0 << CS22 | 0 << CS21 | 1 << CS20;
  
  //OC2A[The pwm pin] is pin B3(~11)
  DDRB = _BV(DDB3);
}

/*
// OLD C-CODE
// TOO SLOW TO BE USED AT THIS FREQUENCY :(

void inline compute_square_wave(int &out, int &square_id, unsigned char &square_amplitude, int &square_period)
{
  square_id = square_id & (4096 - 1);
  if (square_id > 2048)
    out += square_amplitude;
  //Center the square wave
  out -= square_amplitude >> 1;
  square_id += square_period;
};

//The synthetiser
ISR(TIMER2_OVF_vect)
{
   int out = 128;

  //Square waves
  compute_square_wave(out, square1_id, square1_amplitude, square1_period);
  compute_square_wave(out, square2_id, square2_amplitude, square2_period);
  //compute_square_wave(out, square3_id, square3_amplitude, square3_period);
  
  OCR2A = out;
}
*/

// ------------ SQUARE WAVE GENERATOR -----------------------+
#define square_wave0(amplitude, period, id)                  \
      asm volatile (                                         \
        "lds r24, " period "\n" /* load period low */        \
    "lds r25, (" period ")+1\n" /* load period high */       \
        "lds r30, " id "\n" /* load id low */                \
        "lds r31, (" id ")+1\n" /* load id high */           \
        "lds r28, " amplitude "\n" /* load amplitude */      \
                                                             \
        /* square1_id &= (8192-1) ; 4096-1 = 0xFFF */        \
        "andi r31, hi8(8191)\n"                              \
                                                             \
        /* if (r >= 4096) goto .Lb_<something> */            \
        "cpi r31, hi8(4096)\n"                               \
        "brge .Lb_%=\n"                                      \
                                                             \
        /* Add the amplitude */                              \
        "add r23, r28\n"                                     \
                                                             \
        ".Lb_%=:\n"                                          \
                                                             \
        /* out -= square_amplitude/2 */                      \
        "lsr r28\n" /* logical shift right = >> 1 */         \
        "sub r23, r28\n"                                     \
                                                             \
        /* square_id += square_period */                     \
        "add r30,r24\n"                                      \
        "adc r31,r25\n"                                      \
        "sts " id ",r30\n"                                   \
        "sts (" id ")+1,r31\n"                               \
        ::)

/* NEW ONE  */
// ------------ SQUARE WAVE GENERATOR -----------------------+
#define square_wave(amplitude, period, id)                   \
      asm volatile (                                         \
        "lds r24, " period "\n" /* load period low */        \
    "lds r25, (" period ")+1\n" /* load period high */       \
        "lds r30, " id "\n" /* load id low */                \
        "lds r31, (" id ")+1\n" /* load id high */           \
        "lds r28, " amplitude "\n" /* load amplitude */      \
                                                             \
        /* if (id < period) goto .do_not_reset_<something> */\
        "cp r30, r24\n"                                      \
        "cpc r31, r25\n"                                     \
        "brlt .do_not_reset_%=\n"                            \
        /* Reset id and go to the end of the function */     \
        "ldi r30,0\n" /* id = 0 */                           \
        "ldi r31,0\n"                                        \
        "sts " id ",r30\n"                                   \
        "sts (" id ")+1,r31\n"                               \
        "rjmp .end_%=\n"                                     \
        ".do_not_reset_%=:\n"                                \
                                                             \
        /* if (id >= period/2) goto .Lb_<something> */       \
        "lsr r25\n"                                          \
        "ror r24\n"                                          \
        "cp r30, r24\n"                                      \
        "cpc r31, r25\n"                                     \
        "brge .Lb_%=\n"                                      \
                                                             \
        /* Add the amplitude */                              \
        "add r23, r28\n"                                     \
                                                             \
        ".Lb_%=:\n"                                          \
                                                             \
        /* out -= square_amplitude/2 */                      \
        "lsr r28\n" /* logical shift right = >> 1 */         \
        "sub r23, r28\n"                                     \
                                                             \
        /* square_id += 1 */                                 /*
        // You can also use : 
        "ldi r24, 1\n"                                       \
        "ldi r25, 0\n"                                       \
        "add r30,r24\n"                                      \
        "adc r31,r25\n"                                      \*/\
        "adiw r30, 1\n"                                      \
        "sts " id ",r30\n"                                   \
        "sts (" id ")+1,r31\n"                               \
                                                             \
        ".end_%=:\n"                                         \
        ::)

ISR(TIMER2_OVF_vect, ISR_NAKED)
{   
  asm volatile (
    "push r30\n" //square_id low
    "push r31\n" //square_id high
    "push r28\n" //square_amplitude
    "push r23\n" //out
    "push r24\n" //square_period low
    "push r25\n" //square_period high
    "in r23, __SREG__\n"
    "push r23\n"
    
    "ldi r23, lo8(128)\n" //out=128
    );
                
  //---------------
  //-  SQUARE  1  -
  //---------------
  square_wave("square1_amplitude", "square1_period", "square1_id");
  //---------------
  
  //---------------
  //-  SQUARE  2  -
  //---------------
  square_wave("square2_amplitude", "square2_period", "square2_id");
  //---------------
  
  //---------------
  //-  SQUARE  3  -
  //---------------
  square_wave("square3_amplitude", "square3_period", "square3_id");
  //---------------
  
  //---------------
  //-  SQUARE  4  -
  //---------------
  square_wave("square4_amplitude", "square4_period", "square4_id");
  //---------------
  
  asm volatile (
    //if (noise_amplitude) : when there is no noise (in fact often ;) )
    // we skip all these code an prevent a lot's of cycles.
    "lds r30, noise_amplitude\n"
    "cpi r30, 0\n"

    "breq .no_noise\n"
    
    //Load noise id
    "lds r24, noise_id\n"
    "lds r25, (noise_id)+1\n"
    
    //Load white_noise addr
    "ldi r30, lo8(white_noise)\n"
    "ldi r31, hi8(white_noise)\n"

    //Sum noise_id and white_noise
    "add r30, r24\n"
    "adc r31, r25\n"
    
    //Load noise value into r28
    "lpm r28, Z\n"
    
    //We will use mult!
    "push r0\n"
    "push r1\n"

    //Load noise amplitude
    "lds r30, noise_amplitude\n"
     
    //r1:r0 = white_noise[noise_id] * noise_amplitude
    "mul r28, r30\n"
    
    //Add white_noise[noise_id] to out
    // (We want to divide r1:r0 by 255, but it's easyer to divide by 256, i.e.
    // only take the hight part r1 of the result :)
    "add r23, r1\n"
    
    "pop r1\n"
    "pop r0\n"
    
    //Load the delay value
    "lds r30, noise_delay\n"
    "lds r31, noise_speed\n"
    
    //If noise_delay <= noise_speed
    "cp r30, r31\n"
    "brge .inc_noise\n"
    //Increment noise_delay
    "inc r30\n"
    "rjmp .endif_delay_lt_speed\n"
    
    //else
    ".inc_noise:\n"
    //noise_delay = 0
    "ldi r30, lo8(0)\n"

    //Increment noise_id of 1
    "ldi r28, 1\n"
    "add r24, r28\n"
    "ldi r28, 0\n"
    "adc r25, r28\n"
    "andi r25, hi8(4095)\n"
    //Store the new noise_id value
    "sts noise_id, r24\n"
    "sts (noise_id)+1, r25\n"

    ".endif_delay_lt_speed:\n"
    //Store the new noise_delay value
    "sts noise_delay, r30\n"
    
    //endif (noise_activated)
    ".no_noise:\n");

  asm volatile (
    //Update OCR2A with the out(r23) value calculated
    "ldi r30,lo8(179)\n"
    "ldi r31,hi8(179)\n"
    "st Z, r23\n"
    
    //pop saved registers
    "pop r23\n"
    "out __SREG__, r23\n"
    "pop r25\n"
    "pop r24\n"
    "pop r23\n"
    "pop r28\n"
    "pop r31\n"
    "pop r30\n");
  reti();
}


///////////////////////////////////////////////
// Funny functions, used to make some noises //
///////////////////////////////////////////////


void play_org(int f)
{
    square1_amplitude = 100;
    square1_period = frequency_to_period(f);
  
    square2_amplitude = 60;
    square2_period = frequency_to_period(f*2);
  
    square3_amplitude = 40;
    square3_period = frequency_to_period(f*4);
  
    square4_amplitude = 20;
    square4_period = frequency_to_period(f*8);
}

void play_seawave()
{
  for (; noise_amplitude < 120;)
  {
   noise_amplitude+=2;
   delay(40);
  }
  for (; noise_amplitude > 10;)
  {
   noise_amplitude-=4;
   delay(40);
  }
  delay(700);
}
// white_noise.h :

#ifndef WHITE_NOISE_H_
 #define WHITE_NOISE_H_

#include <avr/pgmspace.h>

char white_noise[4096] PROGMEM = {
70, 100, 49, 41, 100, 134, 237, 156, 215, 31, 194, 7, 37, 72, 32, 162, 
196, 168, 90, 235, 11, 32, 65, 73, 79, 139, 241, 248, 205, 48, 241, 19, 
148, 34, 60, 248, 168, 41, 149, 128, 73, 87, 135, 110, 159, 167, 17, 99, 
80, 107, 78, 91, 140, 143, 164, 219, 27, 149, 211, 232, 197, 197, 251, 90, 
231, 55, 82, 144, 96, 231, 16, 169, 62, 151, 24, 221, 62, 41, 65, 142, 
148, 143, 233, 32, 31, 141, 251, 58, 34, 207, 34, 232, 148, 29, 66, 123, 
84, 148, 11, 180, 124, 27, 94, 186, 178, 118, 152, 241, 159, 217, 127, 51, 
104, 105, 84, 135, 246, 79, 193, 25, 30, 227, 1, 178, 0, 67, 46, 84, 
215, 57, 9, 83, 85, 103, 14, 7, 221, 166, 248, 124, 127, 120, 175, 231, 
225, 3, 111, 215, 83, 48, 240, 113, 20, 241, 36, 20, 52, 82, 105, 12, 
139, 114, 95, 224, 217, 109, 232, 182, 19, 224, 50, 146, 88, 225, 122, 57, 
229, 233, 17, 56, 25, 1, 169, 45, 243, 205, 66, 39, 31, 171, 51, 171, 
29, 147, 139, 246, 0, 115, 172, 20, 84, 222, 166, 172, 191, 32, 230, 164, 
9, 247, 220, 35, 248, 134, 80, 235, 83, 146, 19, 115, 61, 70, 30, 90, 
217, 169, 80, 218, 29, 252, 238, 113, 218, 148, 29, 154, 181, 3, 62, 190, 
250, 27, 225, 243, 161, 50, 222, 244, 196, 241, 103, 2, 56, 133, 92, 17, 
47, 173, 235, 76, 169, 217, 189, 132, 110, 218, 30, 35, 222, 92, 225, 216, 
119, 195, 203, 24, 245, 170, 13, 185, 155, 116, 187, 211, 250, 24, 229, 41, 
197, 208, 117, 110, 170, 50, 242, 24, 12, 16, 59, 234, 109, 28, 195, 228, 
223, 142, 253, 212, 56, 10, 142, 212, 126, 73, 167, 120, 97, 140, 161, 38, 
93, 22, 149, 7, 72, 135, 31, 85, 152, 90, 63, 5, 118, 2, 233, 86, 
145, 230, 42, 201, 240, 184, 157, 111, 2, 69, 231, 99, 209, 137, 138, 46, 
159, 31, 53, 232, 166, 84, 61, 62, 174, 124, 67, 37, 127, 45, 123, 16, 
19, 165, 217, 4, 94, 119, 115, 96, 188, 90, 195, 141, 227, 77, 188, 131, 
108, 241, 107, 19, 70, 168, 81, 244, 36, 149, 25, 163, 194, 148, 179, 213, 
58, 141, 217, 152, 4, 76, 248, 192, 167, 187, 77, 138, 9, 9, 13, 117, 
251, 120, 136, 65, 32, 218, 53, 69, 111, 79, 232, 49, 227, 156, 6, 29, 
41, 224, 181, 45, 44, 173, 237, 211, 105, 58, 94, 114, 68, 107, 231, 63, 
228, 112, 128, 4, 74, 181, 73, 185, 4, 50, 234, 232, 206, 240, 5, 247, 
208, 187, 36, 253, 104, 17, 208, 209, 75, 46, 67, 143, 154, 43, 206, 126, 
155, 78, 130, 229, 4, 204, 158, 8, 254, 136, 240, 204, 120, 246, 195, 73, 
177, 231, 70, 25, 248, 22, 235, 67, 69, 46, 211, 223, 89, 161, 93, 244, 
240, 223, 217, 244, 171, 119, 252, 169, 255, 237, 117, 120, 227, 56, 193, 148, 
31, 7, 173, 23, 29, 152, 91, 98, 199, 46, 65, 32, 207, 158, 21, 191, 
126, 238, 179, 41, 102, 176, 211, 101, 157, 72, 221, 128, 129, 158, 20, 160, 
165, 193, 184, 195, 90, 19, 37, 33, 65, 103, 65, 16, 5, 86, 208, 131, 
69, 131, 173, 171, 51, 128, 16, 208, 200, 238, 80, 73, 140, 100, 234, 50, 
38, 162, 245, 128, 181, 26, 161, 246, 129, 226, 6, 135, 57, 214, 10, 126, 
90, 183, 41, 141, 55, 57, 94, 0, 39, 174, 73, 180, 19, 51, 230, 57, 
213, 219, 185, 138, 245, 90, 128, 119, 60, 135, 254, 117, 93, 8, 243, 183, 
192, 28, 69, 247, 86, 163, 247, 125, 81, 65, 49, 100, 116, 23, 157, 74, 
242, 86, 212, 232, 176, 85, 95, 237, 220, 93, 98, 57, 101, 86, 241, 37, 
114, 54, 29, 200, 217, 20, 70, 42, 85, 119, 143, 202, 143, 44, 20, 129, 
131, 232, 105, 51, 61, 200, 32, 25, 37, 131, 83, 139, 217, 68, 176, 75, 
122, 205, 20, 83, 226, 90, 125, 55, 209, 12, 1, 96, 57, 21, 226, 188, 
254, 75, 239, 59, 20, 16, 85, 57, 147, 168, 196, 108, 236, 117, 183, 102, 
66, 203, 185, 36, 37, 54, 92, 247, 67, 93, 87, 124, 115, 57, 56, 113, 
133, 39, 172, 153, 55, 1, 210, 202, 169, 151, 54, 149, 12, 238, 251, 78, 
185, 180, 115, 223, 235, 207, 214, 46, 44, 45, 170, 159, 103, 226, 16, 236, 
9, 189, 133, 65, 190, 87, 11, 104, 238, 66, 253, 250, 48, 249, 73, 233, 
173, 188, 200, 152, 139, 158, 198, 183, 204, 112, 87, 51, 82, 103, 31, 92, 
36, 164, 157, 227, 251, 168, 75, 234, 234, 72, 228, 26, 65, 45, 4, 239, 
233, 204, 135, 116, 107, 78, 44, 55, 190, 131, 106, 17, 234, 137, 109, 15, 
45, 10, 242, 40, 178, 61, 18, 157, 133, 247, 183, 199, 36, 187, 182, 14, 
136, 61, 130, 243, 139, 174, 42, 74, 49, 148, 91, 28, 29, 200, 43, 74, 
210, 29, 114, 132, 90, 133, 33, 223, 124, 217, 166, 160, 148, 92, 174, 28, 
154, 49, 15, 37, 223, 57, 111, 17, 205, 202, 45, 234, 146, 88, 52, 100, 
117, 167, 233, 207, 44, 10, 174, 168, 227, 85, 72, 120, 177, 247, 148, 75, 
40, 164, 113, 7, 221, 224, 24, 171, 171, 69, 149, 61, 157, 202, 162, 18, 
113, 139, 225, 157, 149, 144, 69, 121, 229, 141, 241, 150, 132, 133, 226, 172, 
41, 83, 180, 7, 51, 204, 178, 222, 18, 71, 28, 175, 17, 190, 194, 130, 
73, 163, 31, 222, 51, 100, 87, 24, 242, 72, 175, 118, 206, 145, 35, 247, 
228, 215, 254, 23, 163, 176, 246, 181, 248, 18, 101, 9, 208, 39, 140, 25, 
202, 171, 247, 254, 16, 79, 22, 2, 151, 197, 120, 101, 86, 155, 93, 58, 
114, 91, 82, 22, 12, 72, 203, 4, 90, 48, 13, 42, 87, 153, 67, 34, 
69, 58, 32, 85, 137, 54, 87, 33, 252, 207, 134, 82, 107, 227, 141, 221, 
63, 223, 243, 75, 39, 191, 79, 129, 239, 92, 171, 71, 246, 238, 105, 59, 
40, 137, 144, 178, 191, 231, 211, 187, 182, 89, 14, 33, 61, 155, 255, 124, 
122, 242, 199, 161, 177, 22, 34, 161, 114, 205, 232, 104, 187, 81, 163, 227, 
218, 51, 149, 153, 26, 104, 85, 209, 194, 99, 242, 255, 254, 241, 123, 120, 
228, 66, 25, 149, 88, 59, 54, 202, 8, 30, 51, 195, 111, 214, 166, 73, 
10, 60, 227, 36, 164, 56, 245, 102, 155, 232, 101, 153, 217, 224, 17, 189, 
34, 42, 83, 122, 101, 137, 69, 109, 168, 120, 48, 23, 78, 214, 97, 88, 
18, 68, 125, 183, 124, 114, 29, 23, 90, 131, 176, 52, 99, 193, 241, 134, 
235, 68, 0, 80, 206, 69, 189, 118, 189, 237, 141, 12, 195, 238, 100, 214, 
50, 225, 141, 174, 84, 170, 197, 174, 45, 117, 226, 145, 54, 212, 23, 33, 
24, 23, 113, 230, 93, 46, 92, 26, 27, 234, 38, 223, 216, 139, 181, 11, 
108, 66, 185, 192, 236, 127, 111, 26, 244, 81, 171, 43, 37, 194, 76, 62, 
217, 190, 36, 54, 236, 129, 81, 8, 107, 119, 231, 67, 2, 156, 78, 111, 
222, 8, 47, 202, 135, 158, 228, 123, 240, 143, 166, 21, 81, 243, 83, 43, 
177, 120, 97, 157, 249, 178, 165, 100, 42, 140, 167, 44, 40, 246, 155, 6, 
254, 203, 209, 133, 105, 181, 0, 89, 69, 167, 111, 150, 154, 194, 193, 75, 
58, 35, 232, 51, 213, 142, 151, 255, 26, 63, 44, 67, 53, 199, 73, 51, 
146, 26, 184, 252, 208, 184, 85, 21, 95, 196, 171, 249, 135, 109, 68, 193, 
144, 45, 245, 101, 187, 140, 101, 213, 203, 145, 24, 0, 88, 98, 51, 235, 
124, 235, 231, 76, 164, 60, 97, 3, 1, 13, 253, 136, 122, 65, 73, 10, 
110, 62, 111, 41, 203, 212, 255, 150, 101, 23, 151, 190, 121, 202, 169, 246, 
182, 144, 66, 90, 204, 164, 93, 205, 177, 90, 85, 43, 156, 159, 53, 10, 
221, 164, 52, 168, 121, 51, 63, 222, 74, 214, 156, 196, 160, 69, 186, 86, 
213, 252, 176, 162, 160, 14, 111, 81, 104, 197, 124, 4, 100, 177, 15, 65, 
86, 67, 234, 207, 118, 41, 173, 192, 255, 74, 132, 159, 143, 62, 246, 101, 
59, 166, 7, 219, 180, 118, 45, 29, 59, 169, 33, 159, 91, 48, 225, 177, 
115, 203, 128, 233, 244, 45, 170, 243, 119, 46, 146, 7, 109, 136, 108, 168, 
47, 115, 131, 227, 233, 176, 0, 37, 90, 34, 196, 181, 82, 165, 102, 198, 
112, 230, 175, 100, 19, 89, 87, 139, 136, 234, 146, 245, 114, 254, 157, 161, 
113, 32, 133, 90, 209, 133, 127, 43, 167, 68, 224, 250, 233, 70, 192, 90, 
44, 111, 190, 63, 201, 22, 202, 81, 0, 92, 70, 114, 90, 227, 20, 203, 
3, 153, 38, 212, 30, 165, 255, 198, 233, 223, 192, 211, 37, 128, 45, 81, 
239, 235, 145, 184, 1, 91, 9, 1, 184, 79, 116, 18, 50, 136, 222, 54, 
33, 4, 10, 63, 169, 10, 5, 147, 233, 197, 102, 15, 69, 147, 96, 53, 
126, 241, 237, 128, 77, 247, 129, 5, 70, 245, 23, 121, 125, 245, 175, 158, 
249, 185, 222, 163, 195, 227, 54, 173, 169, 156, 188, 238, 47, 28, 35, 173, 
14, 17, 45, 91, 8, 175, 96, 78, 164, 119, 199, 34, 109, 118, 192, 102, 
48, 158, 9, 243, 130, 63, 160, 43, 219, 92, 25, 10, 121, 61, 184, 135, 
78, 229, 226, 86, 148, 66, 164, 57, 185, 108, 91, 38, 226, 27, 141, 18, 
186, 150, 6, 60, 214, 166, 103, 177, 3, 128, 188, 124, 189, 116, 3, 11, 
89, 229, 97, 238, 39, 6, 39, 224, 114, 130, 7, 84, 157, 148, 103, 87, 
42, 109, 147, 0, 19, 250, 178, 22, 123, 110, 146, 56, 226, 149, 68, 59, 
122, 165, 41, 161, 171, 80, 130, 29, 210, 137, 114, 112, 29, 217, 199, 71, 
70, 91, 72, 89, 85, 250, 112, 208, 104, 2, 9, 74, 152, 77, 133, 18, 
242, 175, 180, 158, 255, 54, 187, 210, 191, 45, 66, 220, 6, 9, 35, 76, 
100, 107, 166, 186, 101, 22, 138, 205, 24, 147, 23, 176, 224, 157, 195, 211, 
76, 119, 113, 75, 173, 44, 29, 108, 90, 95, 72, 96, 105, 107, 173, 205, 
215, 83, 135, 60, 105, 18, 10, 129, 165, 33, 50, 134, 190, 245, 89, 10, 
108, 202, 86, 25, 246, 115, 133, 80, 211, 205, 177, 60, 56, 94, 9, 15, 
177, 145, 76, 26, 163, 86, 155, 72, 119, 205, 206, 54, 194, 39, 64, 46, 
241, 150, 71, 232, 10, 204, 56, 221, 153, 233, 25, 210, 71, 34, 225, 248, 
179, 45, 18, 86, 131, 174, 159, 251, 123, 109, 49, 62, 149, 113, 108, 134, 
8, 180, 110, 18, 128, 167, 239, 26, 144, 8, 236, 216, 42, 205, 208, 222, 
251, 227, 52, 126, 145, 211, 121, 12, 65, 170, 74, 214, 28, 183, 92, 36, 
107, 203, 54, 235, 114, 37, 5, 2, 45, 241, 218, 87, 191, 171, 53, 186, 
142, 106, 56, 31, 61, 178, 43, 126, 92, 118, 84, 120, 45, 177, 156, 152, 
124, 210, 131, 238, 247, 137, 240, 36, 122, 203, 124, 57, 118, 177, 243, 4, 
27, 44, 35, 89, 222, 78, 215, 58, 196, 44, 179, 241, 221, 79, 137, 89, 
34, 13, 71, 25, 150, 55, 62, 16, 2, 186, 74, 120, 107, 61, 124, 135, 
105, 159, 224, 71, 238, 183, 130, 178, 227, 53, 164, 192, 132, 45, 25, 166, 
58, 96, 192, 208, 152, 254, 225, 154, 184, 43, 19, 35, 104, 143, 170, 210, 
47, 138, 25, 29, 66, 155, 207, 37, 208, 115, 230, 85, 161, 255, 251, 219, 
96, 187, 172, 248, 185, 141, 146, 113, 184, 165, 149, 32, 53, 63, 242, 100, 
202, 12, 129, 12, 167, 80, 49, 120, 196, 23, 205, 101, 23, 200, 64, 119, 
132, 236, 111, 61, 121, 1, 175, 49, 167, 68, 82, 220, 131, 68, 64, 77, 
80, 193, 89, 248, 17, 139, 112, 213, 162, 61, 58, 185, 5, 123, 48, 137, 
103, 159, 199, 225, 161, 118, 18, 72, 186, 100, 36, 61, 169, 100, 139, 249, 
37, 228, 241, 54, 111, 97, 12, 18, 158, 70, 203, 164, 193, 252, 45, 41, 
155, 244, 10, 60, 106, 28, 132, 36, 129, 168, 98, 42, 12, 237, 35, 49, 
209, 21, 104, 65, 118, 116, 83, 21, 186, 30, 185, 124, 26, 230, 165, 182, 
219, 175, 242, 69, 203, 119, 106, 76, 31, 204, 118, 44, 185, 154, 93, 138, 
175, 197, 203, 37, 57, 30, 58, 244, 61, 243, 112, 87, 218, 21, 13, 181, 
196, 0, 250, 143, 119, 100, 220, 150, 48, 82, 194, 233, 236, 32, 116, 155, 
229, 63, 193, 31, 94, 251, 19, 155, 239, 131, 242, 201, 152, 0, 126, 92, 
0, 120, 235, 119, 221, 199, 13, 13, 26, 208, 247, 6, 240, 107, 162, 213, 
170, 99, 244, 8, 94, 7, 163, 77, 138, 150, 22, 34, 150, 148, 126, 150, 
13, 106, 13, 234, 49, 26, 247, 75, 234, 238, 82, 218, 89, 244, 176, 4, 
87, 164, 12, 181, 172, 176, 3, 54, 70, 25, 89, 220, 174, 215, 114, 187, 
65, 127, 165, 115, 153, 156, 190, 132, 139, 16, 94, 228, 4, 14, 232, 91, 
179, 245, 17, 95, 165, 20, 149, 235, 45, 238, 199, 219, 198, 57, 150, 7, 
184, 59, 122, 81, 216, 57, 213, 99, 73, 52, 71, 78, 66, 48, 169, 245, 
37, 186, 84, 202, 206, 234, 181, 252, 216, 124, 215, 158, 181, 110, 166, 109, 
169, 32, 190, 129, 89, 148, 228, 163, 200, 44, 241, 10, 92, 154, 0, 129, 
85, 84, 75, 35, 62, 0, 31, 23, 124, 247, 181, 49, 101, 91, 158, 14, 
124, 92, 144, 213, 240, 116, 120, 184, 160, 105, 195, 252, 4, 195, 125, 89, 
23, 200, 124, 86, 200, 156, 109, 68, 147, 34, 117, 248, 126, 19, 6, 250, 
112, 150, 207, 96, 11, 72, 25, 171, 177, 220, 168, 181, 159, 37, 14, 182, 
238, 139, 12, 182, 39, 121, 251, 186, 156, 112, 178, 26, 132, 184, 20, 244, 
79, 227, 84, 90, 43, 109, 5, 221, 73, 173, 146, 232, 211, 161, 159, 193, 
44, 171, 119, 83, 37, 114, 13, 193, 227, 191, 219, 103, 119, 239, 91, 198, 
210, 175, 32, 254, 29, 38, 219, 102, 211, 109, 79, 166, 14, 238, 103, 58, 
153, 223, 141, 190, 81, 154, 127, 52, 89, 90, 155, 209, 73, 246, 151, 28, 
166, 184, 26, 195, 222, 245, 41, 177, 98, 120, 88, 113, 102, 191, 171, 0, 
158, 57, 190, 240, 211, 62, 36, 45, 152, 192, 254, 226, 182, 149, 254, 92, 
77, 24, 31, 43, 13, 73, 221, 111, 193, 53, 224, 40, 244, 140, 40, 147, 
197, 230, 131, 152, 36, 167, 197, 189, 103, 195, 159, 30, 89, 157, 122, 166, 
181, 154, 210, 194, 227, 175, 49, 164, 228, 18, 204, 216, 158, 244, 107, 99, 
219, 238, 251, 255, 150, 193, 188, 253, 132, 91, 27, 221, 248, 150, 132, 173, 
48, 86, 111, 19, 5, 161, 183, 233, 179, 132, 193, 81, 120, 45, 180, 83, 
27, 175, 83, 177, 112, 15, 175, 245, 107, 202, 210, 99, 96, 86, 17, 144, 
172, 128, 163, 177, 33, 91, 154, 212, 223, 92, 37, 87, 137, 217, 171, 164, 
137, 254, 86, 249, 13, 5, 238, 120, 207, 193, 220, 48, 23, 237, 192, 196, 
109, 100, 117, 143, 191, 16, 99, 158, 108, 137, 245, 245, 98, 160, 153, 235, 
158, 239, 229, 172, 244, 211, 36, 196, 148, 0, 244, 172, 237, 180, 112, 91, 
24, 229, 234, 215, 245, 77, 117, 97, 214, 107, 86, 57, 11, 240, 36, 170, 
223, 9, 86, 212, 221, 122, 152, 113, 123, 140, 29, 104, 64, 141, 195, 89, 
115, 173, 48, 104, 251, 166, 202, 209, 17, 32, 10, 28, 16, 47, 198, 240, 
56, 28, 196, 21, 151, 92, 135, 18, 232, 164, 122, 40, 50, 62, 129, 165, 
235, 178, 13, 230, 88, 215, 184, 105, 248, 194, 133, 8, 241, 76, 248, 42, 
104, 188, 63, 255, 24, 198, 17, 0, 107, 140, 41, 157, 202, 170, 66, 181, 
92, 79, 156, 180, 39, 84, 29, 31, 22, 163, 39, 8, 239, 32, 50, 87, 
220, 113, 87, 245, 56, 104, 245, 163, 244, 30, 64, 190, 201, 130, 116, 37, 
209, 16, 218, 248, 100, 247, 23, 122, 154, 63, 130, 137, 95, 180, 225, 59, 
38, 56, 48, 94, 160, 38, 1, 149, 68, 65, 83, 13, 195, 199, 51, 148, 
215, 13, 141, 59, 4, 164, 182, 159, 227, 56, 40, 66, 237, 9, 126, 19, 
65, 174, 113, 226, 212, 114, 119, 25, 179, 202, 38, 118, 146, 89, 10, 105, 
102, 151, 165, 107, 60, 91, 10, 31, 147, 50, 98, 128, 60, 224, 147, 125, 
142, 4, 95, 99, 118, 214, 124, 41, 161, 162, 159, 51, 252, 170, 156, 98, 
65, 65, 205, 125, 156, 215, 157, 48, 10, 255, 176, 70, 223, 68, 195, 109, 
72, 35, 208, 191, 249, 76, 232, 154, 239, 136, 205, 235, 50, 106, 77, 115, 
171, 27, 241, 72, 242, 142, 120, 252, 141, 40, 66, 108, 108, 6, 217, 181, 
41, 170, 116, 34, 246, 92, 189, 229, 228, 138, 208, 22, 244, 30, 138, 160, 
57, 123, 232, 43, 9, 96, 40, 150, 136, 106, 2, 245, 112, 219, 170, 153, 
133, 30, 188, 124, 122, 121, 97, 95, 3, 50, 117, 248, 80, 255, 152, 137, 
122, 128, 180, 131, 224, 220, 25, 104, 71, 27, 93, 183, 247, 7, 81, 124, 
37, 13, 248, 160, 134, 90, 255, 137, 140, 116, 129, 220, 116, 25, 101, 238, 
153, 25, 114, 121, 246, 139, 226, 61, 167, 63, 244, 158, 71, 69, 26, 108, 
82, 19, 12, 216, 109, 11, 98, 249, 128, 227, 213, 244, 253, 58, 226, 150, 
83, 84, 16, 73, 224, 242, 134, 135, 49, 123, 37, 120, 192, 63, 229, 19, 
82, 241, 235, 191, 253, 77, 184, 125, 49, 141, 113, 46, 199, 83, 196, 27, 
168, 212, 100, 136, 198, 235, 15, 248, 102, 52, 112, 38, 115, 85, 57, 198, 
71, 37, 133, 68, 114, 62, 193, 163, 203, 50, 209, 147, 133, 150, 174, 45, 
106, 18, 181, 49, 253, 196, 41, 99, 248, 153, 138, 108, 239, 195, 50, 54, 
232, 183, 122, 91, 245, 59, 254, 193, 109, 208, 84, 242, 102, 2, 32, 208, 
20, 213, 1, 18, 154, 42, 117, 146, 196, 255, 254, 179, 195, 48, 233, 171, 
232, 99, 6, 221, 158, 5, 158, 11, 213, 242, 253, 59, 244, 29, 11, 9, 
243, 13, 27, 141, 55, 144, 31, 251, 144, 30, 174, 83, 78, 151, 254, 54, 
250, 5, 20, 152, 10, 178, 163, 223, 165, 161, 26, 153, 190, 37, 162, 177, 
50, 189, 62, 106, 78, 94, 101, 222, 124, 20, 49, 202, 171, 47, 1, 166, 
52, 21, 62, 62, 199, 226, 29, 108, 131, 55, 6, 65, 93, 168, 243, 143, 
102, 49, 249, 180, 143, 95, 146, 11, 115, 195, 214, 30, 242, 215, 196, 39, 
236, 3, 101, 179, 229, 131, 32, 104, 186, 38, 169, 23, 206, 156, 167, 52, 
206, 160, 232, 93, 255, 122, 105, 114, 61, 63, 145, 48, 22, 85, 87, 2, 
88, 188, 181, 61, 63, 213, 165, 250, 251, 79, 17, 202, 235, 184, 254, 185, 
89, 231, 23, 88, 97, 128, 203, 159, 191, 92, 207, 213, 177, 38, 215, 10, 
226, 140, 71, 34, 98, 237, 28, 93, 60, 45, 39, 39, 230, 38, 225, 63, 
13, 248, 151, 110, 120, 98, 13, 55, 190, 220, 12, 112, 2, 227, 122, 229, 
111, 193, 7, 209, 174, 35, 47, 234, 80, 86, 18, 54, 124, 243, 117, 137, 
235, 13, 248, 99, 111, 5, 154, 46, 226, 166, 158, 228, 137, 24, 201, 248, 
217, 208, 202, 136, 243, 249, 114, 68, 79, 132, 122, 204, 119, 240, 85, 98, 
253, 77, 197, 108, 83, 95, 154, 53, 5, 56, 25, 142, 80, 227, 135, 42, 
179, 81, 178, 167, 74, 36, 235, 153, 169, 101, 101, 32, 85, 187, 131, 82, 
8, 72, 191, 91, 168, 89, 144, 173, 146, 170, 60, 226, 141, 195, 12, 64, 
20, 190, 231, 94, 227, 210, 247, 140, 56, 93, 172, 141, 24, 47, 224, 32, 
120, 159, 124, 32, 248, 12, 205, 138, 182, 9, 109, 67, 204, 121, 132, 224, 
56, 107, 62, 27, 62, 54, 167, 118, 147, 83, 3, 171, 131, 227, 203, 251, 
130, 71, 27, 123, 84, 232, 5, 10, 242, 114, 78, 190, 236, 210, 159, 36, 
61, 221, 63, 123, 19, 230, 241, 166, 57, 245, 81, 188, 216, 29, 183, 91, 
100, 210, 214, 184, 187, 219, 195, 173, 78, 17, 107, 58, 227, 10, 94, 32, 
232, 157, 156, 251, 131, 141, 162, 188, 130, 243, 121, 91, 16, 48, 182, 117, 
3, 140, 45, 190, 103, 240, 107, 181, 1, 214, 239, 228, 225, 77, 5, 201, 
234, 161, 196, 109, 46, 102, 42, 177, 90, 163, 12, 106, 211, 194, 223, 214, 
78, 13, 148, 181, 253, 255, 107, 255, 214, 90, 227, 183, 168, 232, 128, 146, 
137, 68, 0, 184, 171, 42, 105, 5, 205, 117, 111, 160, 55, 79, 119, 133, 
92, 11, 58, 89, 11, 165, 88, 225, 0, 60, 152, 168, 36, 24, 58, 174, 
92, 58, 102, 7, 100, 207, 12, 49, 68, 124, 210, 123, 203, 73, 0, 39, 
84, 58, 128, 95, 224, 217, 64, 224, 21, 216, 136, 57, 240, 194, 231, 77, 
253, 77, 84, 97, 28, 97, 147, 96, 221, 101, 219, 168, 174, 219, 207, 2, 
22, 79, 98, 246, 40, 162, 214, 61, 123, 94, 119, 107, 32, 94, 184, 29, 
172, 13, 127, 200, 110, 18, 41, 75, 119, 4, 243, 37, 224, 194, 39, 246, 
17, 137, 236, 58, 44, 194, 119, 167, 32, 238, 18, 64, 77, 203, 94, 249, 
216, 221, 193, 70, 239, 234, 145, 102, 239, 132, 139, 207, 70, 178, 197, 87, 
60, 177, 145, 104, 115, 9, 15, 147, 247, 33, 211, 68, 236, 49, 61, 196, 
14, 255, 10, 253, 233, 155, 99, 216, 31, 238, 167, 101, 161, 108, 189, 221, 
29, 78, 69, 144, 87, 84, 35, 79, 117, 247, 147, 98, 40, 209, 38, 55, 
208, 49, 52, 185, 204, 152, 146, 236, 134, 57, 81, 39, 166, 14, 4, 195, 
93, 73, 84, 180, 157, 119, 3, 19, 110, 151, 117, 151, 104, 155, 206, 56, 
204, 2, 241, 153, 154, 131, 133, 33, 189, 214, 72, 99, 229, 77, 38, 66, 
150, 122, 246, 52, 242, 250, 71, 96, 145, 188, 247, 249, 87, 197, 49, 36, 
200, 34, 189, 98, 166, 66, 131, 99, 24, 204, 198, 253, 25, 236, 63, 175, 
103, 54, 227, 89, 48, 42, 185, 193, 230, 177, 186, 62, 118, 235, 98, 62, 
13, 31, 161, 179, 97, 36, 22, 121, 240, 220, 119, 9, 201, 182, 185, 48, 
236, 156, 137, 28, 199, 66, 221, 173, 243, 151, 235, 106, 130, 77, 168, 144, 
108, 73, 67, 205, 110, 90, 71, 94, 54, 190, 104, 255, 116, 33, 47, 97, 
189, 184, 125, 132, 251, 91, 50, 238, 242, 29, 88, 117, 107, 1, 5, 215, 
74, 72, 165, 184, 162, 236, 23, 217, 170, 127, 216, 30, 160, 8, 127, 93, 
192, 253, 226, 187, 88, 20, 170, 74, 49, 2, 191, 156, 3, 196, 116, 78, 
13, 25, 6, 175, 5, 29, 136, 175, 156, 97, 205, 60, 105, 77, 154, 41, 
74, 124, 229, 162, 144, 143, 236, 193, 145, 172, 94, 149, 112, 210, 227, 125, 
235, 233, 45, 240, 7, 181, 159, 163, 22, 108, 224, 127, 185, 122, 169, 255};

#endif /* WHITE_NOISE_H_ */
// generate_white_noise.cpp

#include <iostream>
#include <cstdlib>

#define SIZE 4096

int main()
{

  srand(42);

  std::cout << "#ifndef WHITE_NOISE_H_\n";
  std::cout << " #define WHITE_NOISE_H_\n\n";
  std::cout << "#include <avr/pgmspace.h>\n";
  std::cout << "char white_noise[" << SIZE << "] PROGMEM = {";

  for (int i = 0; i < SIZE; i++)
    {
      if (i % 16 == 0)
      std::cout << "\n";
      std::cout << rand() % 256 << ", ";
    }

  std::cout << "};\n";
  std::cout << "#endif \\* WHITE_NOISE_H_ *\\\n";

  return 0;
}
// Synth_8bits.ino :

#include <avr/io.h>

#include "Synth_8bits.h"

void setup()
{
  synth_setup();
}

int tetris_m[] = {
  NOTE_D5, NOTE_D5,
  NOTE_B4, NOTE_C5,
  NOTE_D5, NOTE_D5,
  NOTE_C5, NOTE_B4,
  
  NOTE_A4, NOTE_A4,
  NOTE_A4, NOTE_C5,
  NOTE_E5, NOTE_E5,
  NOTE_D5, NOTE_C5,
  
  NOTE_B4, NOTE_B4,
  NOTE_B4, NOTE_C5,
  NOTE_D5, NOTE_D5,
  NOTE_E5, NOTE_E5,
  
  NOTE_C5, NOTE_C5,
  NOTE_A4, NOTE_A4,
  NOTE_A4, NOTE_A4,
  NOTE_A4, NOTE_A4,
  
  //--
  
  NOTE_D5, NOTE_D5,
  NOTE_D5, NOTE_F5,
  NOTE_A5, NOTE_A5,
  NOTE_G5, NOTE_F5,
  
  NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_C5,
  NOTE_E5, NOTE_E5,
  NOTE_D5, NOTE_C5,

  NOTE_B4, NOTE_B4,
  NOTE_B4, NOTE_C5,
  NOTE_D5, NOTE_D5,
  NOTE_E5, NOTE_E5,
 
  NOTE_C5, NOTE_C5,
  NOTE_A4, NOTE_A4,
  NOTE_A4, NOTE_A4,
  NOTE_A4, NOTE_A4,

  //--
  
  NOTE_D5, NOTE_D5,
  NOTE_D5, NOTE_F5,
  NOTE_A5, NOTE_A5,
  NOTE_G5, NOTE_F5,
  
  NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_C5,
  NOTE_E5, NOTE_E5,
  NOTE_D5, NOTE_C5,

  NOTE_B4, NOTE_B4,
  NOTE_B4, NOTE_C5,
  NOTE_D5, NOTE_D5,
  NOTE_E5, NOTE_E5,
 
  NOTE_C5, NOTE_C5,
  NOTE_A4, NOTE_A4,
  NOTE_A4, NOTE_A4,
  NOTE_A4, NOTE_A4,
  
  //--
  
  NOTE_E5, NOTE_E5,
  NOTE_C5, NOTE_C5,
  NOTE_D5, NOTE_D5,
  NOTE_B4, NOTE_B4,

  NOTE_C5, NOTE_C5,
  NOTE_A4, NOTE_A4,
  NOTE_GS3, NOTE_GS3,
  NOTE_B4, NOTE_B4,
  
  NOTE_E5, NOTE_E5,
  NOTE_C5, NOTE_C5,
  NOTE_D5, NOTE_D5,
  NOTE_B4, NOTE_B4,

  NOTE_C5, NOTE_E5,
  NOTE_A5, NOTE_GS5,
  NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_E5,
  
  //-- Last one
  
  NOTE_E5, NOTE_E5,
  NOTE_C5, NOTE_C5,
  NOTE_D5, NOTE_D5,
  NOTE_B4, NOTE_B4,

  NOTE_C5, NOTE_C5,
  NOTE_A4, NOTE_A4,
  NOTE_GS3, NOTE_GS3,
  NOTE_B4, NOTE_B4,
  
  NOTE_E5, NOTE_E5,
  NOTE_C5, NOTE_C5,
  NOTE_D5, NOTE_D5,
  NOTE_B4, NOTE_B4,

  NOTE_A5, NOTE_A5,
  NOTE_A5, NOTE_A5,
  NOTE_A5, NOTE_A5,
  NOTE_A5, NOTE_A5,
  0  };

#define FINISH 4242

int tetris_b[] = {
  NOTE_E3, NOTE_E3,
  NOTE_E2, NOTE_E2,
  NOTE_E3, NOTE_E3,
  NOTE_E2, NOTE_E2,

  NOTE_A3, NOTE_A3,
  NOTE_A2, NOTE_A2,
  NOTE_A3, NOTE_A3,
  NOTE_A2, NOTE_A2,
  
  NOTE_GS3, NOTE_GS3,
  NOTE_GS2, NOTE_GS2,
  NOTE_GS3, NOTE_GS3,
  NOTE_GS2, NOTE_GS2,
  
  NOTE_A3, NOTE_A3,
  NOTE_A2, NOTE_A2,
  NOTE_A3, NOTE_B3,
  NOTE_C4, NOTE_D4,
  
  // --

  NOTE_D3, NOTE_D3,
  NOTE_D2, NOTE_D2,
  NOTE_D3, NOTE_D3,
  NOTE_D2, NOTE_D2,
  
  NOTE_C3, NOTE_C3,
  NOTE_C2, NOTE_C2,
  NOTE_C3, NOTE_C3,
  NOTE_C2, NOTE_C2,

  NOTE_B3, NOTE_B3,
  NOTE_B2, NOTE_B2,
  NOTE_B3, NOTE_B3,
  NOTE_B2, NOTE_B2,
  
  NOTE_A3, NOTE_A3,
  NOTE_A2, NOTE_A2,
  NOTE_A3, NOTE_B3,
  NOTE_C4, NOTE_D4,
  
  // --

  NOTE_D3, NOTE_D3,
  NOTE_D2, NOTE_D2,
  NOTE_D3, NOTE_D3,
  NOTE_D2, NOTE_D2,
  
  NOTE_C3, NOTE_C3,
  NOTE_C2, NOTE_C2,
  NOTE_C3, NOTE_C3,
  NOTE_C2, NOTE_C2,

  NOTE_B3, NOTE_B3,
  NOTE_B2, NOTE_B2,
  NOTE_B3, NOTE_B3,
  NOTE_B2, NOTE_B2,
  
  NOTE_A3, NOTE_A3,
  NOTE_A2, NOTE_A2,
  NOTE_A3, NOTE_A3,
  NOTE_A2, NOTE_A2,
  
  //--
  
  NOTE_A3, NOTE_A3,
  NOTE_A2, NOTE_A2,
  NOTE_B3, NOTE_B3,
  NOTE_B2, NOTE_B2,
  
  NOTE_C4, NOTE_C4,
  NOTE_C3, NOTE_C3,
  NOTE_D4, NOTE_D4,
  NOTE_D3, NOTE_D3,
 
  NOTE_A3, NOTE_A3,
  NOTE_A2, NOTE_A2,
  NOTE_B3, NOTE_B3,
  NOTE_B2, NOTE_B2,
  
  NOTE_C4, NOTE_C4,
  NOTE_C3, NOTE_C3,
  NOTE_D4, NOTE_D4,
  NOTE_D3, NOTE_D3,
  
  // -- and the last line
  
  NOTE_A3, NOTE_A3,
  NOTE_A2, NOTE_A2,
  NOTE_B3, NOTE_B3,
  NOTE_B2, NOTE_B2,
  
  NOTE_C4, NOTE_C4,
  NOTE_C3, NOTE_C3,
  NOTE_D4, NOTE_D4,
  NOTE_D3, NOTE_D3,
 
  NOTE_A3, NOTE_A3,
  NOTE_A2, NOTE_A2,
  NOTE_B3, NOTE_B3,
  NOTE_B2, NOTE_B2,
  
  FINISH, FINISH,
  FINISH, FINISH,
  FINISH, FINISH,
  FINISH, FINISH,
  
  0};

void play_2_voices(int M, int B)
{
    square1_amplitude = 100;
    square1_period = frequency_to_period(M);
  
    square2_amplitude = 120;
    if (B != FINISH)
    square2_period = frequency_to_period(B);
    
    if (B == FINISH)
    {
      square2_period = frequency_to_period(NOTE_A3);
      square3_period = frequency_to_period(NOTE_A4);
      square2_amplitude = 120;
      square3_amplitude = 25;
    }

    square3_amplitude = 0;
    square4_amplitude = 0;

    delay(300);
}

void play_2_voices_with_effects(int M, int B)
{
    square1_amplitude = 90;
    square1_period = frequency_to_period(M);
  
    square2_amplitude = 90;
    if (B != FINISH)
    square2_period = frequency_to_period(B);
    
    if (B == FINISH)
    {
      square2_period = frequency_to_period(NOTE_A3);
      square3_period = frequency_to_period(NOTE_A4);
      square2_amplitude = 120;
      square3_amplitude = 25;
    }

    square3_amplitude = 0;
    square4_amplitude = 0;

  int cp1 = square1_period;
  int cp2 = square2_period;
  for (int i =0; i < 6; i++)
  {
    square1_amplitude = (5 - i) * 100 / 5;
    square1_period = cp1 / (1 + (i % 2));
    square2_amplitude = 50 + (i) * 50 / 5;
    square2_period = cp2 / (1 + (1 + i % 2));
    delay(50);
  }
}

void cutall()
{
  square1_amplitude = 0;
  square2_amplitude = 0;
  square3_amplitude = 0;
  square4_amplitude = 0;
}

void loop()
{
  //TETRIS SONG!
  for (int i = 0; tetris_m[i] != 0; i++)
  {
    play_2_voices(tetris_m[i], tetris_b[i]);
  }
  
  //TETRIS SONG (CHIPTUNE VERSION)
  for (int i = 0; tetris_m[i] != 0; i++)
  {
    play_2_voices_with_effects(tetris_m[i], tetris_b[i]);
  }
  
  cutall();
  while(true);
    play_seawave();
}

Le tar.gz : synth_8bits.tar.

Extrait sonore du code de démonstration

Pour vous montrer que je ne plaisante pas quand à la polyphonie, voici deux extraits utilisant 2 canaux. (Bon, le dernier accord en utilise 3, mais on ne s'en rend pas compte.)

Première partie Seconde partie

Pour aller plus loin

N'hésitez pas à supprimer quelques canaux, comme le 4ième canal, si vous ne l'utilisez pas et trouvez que votre application est trop lente (i.e. supprimer le bloc de code suivant).

  //---------------
  //-  SQUARE  4  -
  //---------------
  square_wave("square4_amplitude", "square4_period", "square4_id");
  //---------------

Vous pouvez aussi supprimer le canal de bruit et le tableau white_noise.h pour gagner un peu de mémoire. Bref, faite ce que vous voulez de ce code!

Quelques références :

Plus sur le PWM :