Um dos posts mais populares no Dragão é o post com a marcha imperial, música tema de Darth Vader, em estilo 8 bits para Arduino. Esse é um projeto bem simples e só precisa de um buzzer piezo. É difícil encontrar algumas músicas para Arduino, então resolvi uma coleção de músicas para Arduino em uma mesmo lugar.
Recentemente tenho me interessado bastante em música, e por isso comecei a aprender a ler partituras. Portanto, pensei que seria um bom exercício adaptar algumas partituras para Arduino. Escrevi os códigos com alguns detalhes em mente.
- Códigos compatíveis com todas ou quase todas as placas Arduino;
- Sem necessidade de instalação de bibliotecas;
- De fácil modificação e entendimento.
Para isso utilizei apenas a função tone(), que faz parte da linguagem. A função tone() é capaz de gerar apenas um tom em apenas um pino por vez. Bibliotecas como a Tone library permitem gerar mais formas de ondas, mas utilizam timers específicos de alguns microcontroladores, o que causa incompatibilidade com muitas placas. Isso implica que os códigos aqui são monofônicos, isto é, apenas uma nota pode ser tocada de cada vez.
Update: Para saber como programo os sketches a partir das partituras, veja o outro post a respeito.
Músicas
Até o momento foram programadas as seguintes músicas:
Filmes / TV
- Cantina Band de Star Wars
- Marcha Imperial de Star Wars
- Hedwig’s theme de Harry Potter
- Tema principal de Star Wars
- Pulo da gaita de O Auto da Compadecida
- Abertura Star Trek
- Game of Thrones
- O Poderoso Chefão
Jogos
- Bloody Tears de Castlevania II
- Vampire Killer de Castlevania
- Green Hill Zone de Sonic the Hedgehog
- Mii channel
- Tema do Professor Layton de Professor Layton and the Curious Village
- Song of stomrs de The Legend of Zelda Ocarina of time
- Super Mario Bros
- Tetris (Korobeiniki)
- Zelda’s Lullaby de The Legend of Zelda Ocarina of time
- The Legend of Zelda para o NES
- DOOM
- Canção da Jigglypuff (Pokemon)
Clássicas
- Cannon in D – Pachelbel
- Greensleeves
- Ode to Joy – Sinfonia No. 9 de Beethoven
- Principe Igor – Borodin
- Minuet in G – Christian Petzold
- Brahms Lullaby
- Fur Elise – Beethoven
Outras
- Asa Branca – Luiz Gonzaga
- Pantera cor de rosa
- Take on me A-ha
- The lick
- The Lion sleeps tonight (A-uima-uê A-uima-uê )
- Keyboard cat
- Passo do elefantinho
- Parabéns pra você
- Feliz Natal
- Never Gonna Give you Up (Rickroll)
- Noite Feliz
Exemplo
Como exemplo vamos utilizar a música do jogo Tetris. Basta copiar o código na IDE do Arduino e conectar um buzzer ao pino 11 da sua placa arduino, ou então conectar em qualquer pino e editar o valor da variável buzzer de acordo.
Estando o piezo conectado a placa, basta adicionar o código com a música desejada na IDE e gravar no Arduino. A variável tempo pode ser mudada para fazer a música tocar mais rápido ou mais devagar, enquanto a variável buzzer contém o número do pino a qual o piezo é conectado. O vetor melody contém cada nota da música seguida da duração da mesma.
/* Tetris theme - (Korobeiniki) Connect a piezo buzzer or speaker to pin 11 or select a new pin. More songs available at https://github.com/robsoncouto/arduino-songs Robson Couto, 2019 */ #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 #define PAUSE 0 // change this to make the song slower or faster int tempo=144; // change this to whichever pin you want to use int buzzer = 11; // notes of the moledy followed by the duration. // a 4 means a quarter note, 8 an eighteenth , 16 sixteenth, so on // !!negative numbers are used to represent dotted notes, // so -4 means a dotted quarter note, that is, a quarter plus an eighteenth!! int melody[] = { //Based on the arrangement at https://www.flutetunes.com/tunes.php?id=192 NOTE_E5, 4, NOTE_B4,8, NOTE_C5,8, NOTE_D5,4, NOTE_C5,8, NOTE_B4,8, NOTE_A4, 4, NOTE_A4,8, NOTE_C5,8, NOTE_E5,4, NOTE_D5,8, NOTE_C5,8, NOTE_B4, -4, NOTE_C5,8, NOTE_D5,4, NOTE_E5,4, NOTE_C5, 4, NOTE_A4,4, NOTE_A4,8, NOTE_A4,4, NOTE_B4,8, NOTE_C5,8, NOTE_D5, -4, NOTE_F5,8, NOTE_A5,4, NOTE_G5,8, NOTE_F5,8, NOTE_E5, -4, NOTE_C5,8, NOTE_E5,4, NOTE_D5,8, NOTE_C5,8, NOTE_B4, 4, NOTE_B4,8, NOTE_C5,8, NOTE_D5,4, NOTE_E5,4, NOTE_C5, 4, NOTE_A4,4, NOTE_A4,4, PAUSE, 4, NOTE_E5, 4, NOTE_B4,8, NOTE_C5,8, NOTE_D5,4, NOTE_C5,8, NOTE_B4,8, NOTE_A4, 4, NOTE_A4,8, NOTE_C5,8, NOTE_E5,4, NOTE_D5,8, NOTE_C5,8, NOTE_B4, -4, NOTE_C5,8, NOTE_D5,4, NOTE_E5,4, NOTE_C5, 4, NOTE_A4,4, NOTE_A4,8, NOTE_A4,4, NOTE_B4,8, NOTE_C5,8, NOTE_D5, -4, NOTE_F5,8, NOTE_A5,4, NOTE_G5,8, NOTE_F5,8, NOTE_E5, -4, NOTE_C5,8, NOTE_E5,4, NOTE_D5,8, NOTE_C5,8, NOTE_B4, 4, NOTE_B4,8, NOTE_C5,8, NOTE_D5,4, NOTE_E5,4, NOTE_C5, 4, NOTE_A4,4, NOTE_A4,4, PAUSE, 4, NOTE_E5,2, NOTE_C5,2, NOTE_D5,2, NOTE_B4,2, NOTE_C5,2, NOTE_A4,2, NOTE_GS4,2, NOTE_B4,4, PAUSE,8, NOTE_E5,2, NOTE_C5,2, NOTE_D5,2, NOTE_B4,2, NOTE_C5,4, NOTE_E5,4, NOTE_A5,2, NOTE_GS5,2, }; // sizeof gives the number of bytes, each int value is composed of two bytes (16 bits) // there are two values per note (pitch and duration), so for each note there are four bytes int notes=sizeof(melody)/2/2; // this calculates the duration of a whole note in ms (60s/tempo)*4 beats int wholenote = (60000 * 4) / tempo; int divider = 0, noteDuration = 0; void setup() { // iterate over the notes of the melody. // Remember, the array is twice the number of notes (notes + durations) for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2) { // calculates the duration of each note divider = melody[thisNote + 1]; if (divider > 0) { // regular note, just proceed noteDuration = (wholenote) / divider; } else if (divider < 0) { // dotted notes are represented with negative durations!! noteDuration = (wholenote) / abs(divider); noteDuration *= 1.5; // increases the duration in half for dotted notes } // we only play the note for 90% of the duration, leaving 10% as a pause tone(buzzer, melody[thisNote], noteDuration*0.9); // Wait for the specief duration before playing the next note. delay(noteDuration); // stop the waveform generation before the next note. noTone(buzzer); } } void loop() { // no need to repeat the melody. }
Depois de gravado o sketch, o arduino irá tocar a musica. O código do setup() pode ser tranferido para o loop() caso queira-se que a música se repita.
Por enquanto é isso. Tenho em mente de fazer um post sobre o processo que uso para “converter” as músicas da partitura para o arduino, mas isso fica para depois :). Edit: Link do post com o tutorial.
Obrigado pela leitura e até o próximo post o/
Ola queria saber se tem como fazer a musica tema do filme VINGADORES no arduino
Oi Ellyan,
Provavelmente. Se você souber um pouquinho sobre música e encontrar uma partitura simplificada não é tão difícil.
Bom dia, gostaria de saber se você poderia fazer a música “Ela partiu” do Tim Maia para o buzzer.
Bacana !ola to querendo fazer um projector assim,com arduino leonardo.
1-toca no piezo
2-arduino leonardo conectado ao android
3-app caustic
OBS-toca no piezo que aciona uma nota midi determinada pele usuario no Arduilo Leonardo diparando no App Caustic na parte MPC Sinth
Olá, tudo bom?
Parabéns pelos trabalhos! É um projeto mais legal que o outro.
Estou tentando (e tendo dificuldade no código) para colocar 3 botões e quando acionar cada um deles o buzzer tocar uma música diferente.
tem alguma dica ou mesmo código para me ajudar?
Desde já agradeço :)
Bom dia Robson.
Primeiramente parabéns pelo projeto de longe o melhor que já vi sobre a biblioteca tone, sem querer incomodar mas já incomodando, você teria alguns sons simples pra ser usado como por exemplo, um para iniciar, desligar e de bateria fraca tipo daquelas caixinhas de som só que usando a biblioteca tone. desde já agradeço.
// Lilium – musica abertura do anime elfen lied
int bu = 11;
// bu = buzzer
#define C4 262
#define CS4 277
#define D4 294
#define DS4 311
#define E4 330
#define F4 349
#define FS4 370
#define G4 392
#define GS4 415
#define A4 440
#define AS4 466
#define B4 494
#define C5 523
#define CS5 554
#define D5 587
#define DS5 622
#define E5 659
#define F5 698
#define FS5 740
#define G5 784
#define GS5 831
#define A5 880
#define AS5 932
#define B5 988
#define C6 1047
#define CS6 1109
#define D6 1175
#define DS6 1245
#define E6 1319
#define F6 1397
#define FS6 1480
#define G6 1568
#define GS6 1661
#define A6 1760
#define AS6 1865
#define B6 1976
#define C7 2093
#define CS7 2217
#define D7 2349
#define DS7 2489
#define E7 2637
#define F7 2794
#define FS7 2960
#define G7 3136
#define GS7 3322
#define A7 3520
#define AS7 3729
#define B7 3951
void setup() {
pinMode(bu, OUTPUT);
}
void loop() {
tone(bu, FS5);
delay(500);
noTone(bu);
delay(10);
tone(bu, CS6);
delay(500);
noTone(bu);
delay(10);
tone(bu, GS5);
delay(1500);
noTone(bu);
delay(10);
tone(bu, A5);
delay(500);
noTone(bu);
delay(10);
tone(bu, A5);
delay(1000);
noTone(bu);
delay(10);
tone(bu, FS5);
delay(500);
noTone(bu);
delay(10);
tone(bu, CS6);
delay(500);
noTone(bu);
delay(10);
tone(bu, GS5);
delay(1500);
noTone(bu);
delay(10);
tone(bu, A5);
delay(500);
noTone(bu);
delay(10);
tone(bu, B5);
delay(500);
noTone(bu);
delay(10);
tone(bu, A5);
delay(500);
noTone(bu);
delay(10);
tone(bu, FS5);
delay(2500);
noTone(bu);
delay(10);
tone(bu, GS5);
delay(500);
noTone(bu);
delay(10);
tone(bu, E5);
delay(500);
noTone(bu);
delay(10);
tone(bu, D5);
delay(500);
noTone(bu);
delay(10);
tone(bu, E5);
delay(2500);
noTone(bu);
delay(10);
tone(bu, FS5);
delay(500);
noTone(bu);
delay(10);
tone(bu, D5);
delay(500);
noTone(bu);
delay(10);
tone(bu, CS5);
delay(500);
noTone(bu);
delay(10);
tone(bu, D5);
delay(500);
noTone(bu);
delay(10);
tone(bu, E5);
delay(500);
noTone(bu);
delay(10);
tone(bu, FS5);
delay(1500);
noTone(bu);
delay(10);
tone(bu, GS5);
delay(500);
noTone(bu);
delay(10);
tone(bu, A5);
delay(500);
noTone(bu);
delay(10);
tone(bu, B5);
delay(500);
noTone(bu);
delay(10);
tone(bu, A5);
delay(2500);
noTone(bu);
delay(10);
tone(bu, GS5);
delay(2500);
noTone(bu);
delay(10);
}
poderia por favor fazer a musica best friends forever da mc funny
tem alguma música de alarme?
eu vou fazer um sistema de segurança
I loved as much as you will receive carried out right here The sketch is attractive your authored material stylish nonetheless you command get got an impatience over that you wish be delivering the following unwell unquestionably come more formerly again since exactly the same nearly a lot often inside case you shield this hike