Boite Ă  musique Arduino

Dans la lignĂ©e du dĂ©poussiĂ©rage de vieux codes, j’ai ressorti un jeu de quelques fonctions pour arduino que je n’avais 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 :

Plus sur Tone :