

Considerações musicais






[tone(pino, frequencia, duracao);]
Nessa abordagem, cada nota é executada a partir de dois parâmetros fundamentais da linguagem musical:
[duração da semínima (ms) = 60000 / BPM]
A partir desse valor, as demais figuras podem ser obtidas por proporção matemática, mantendo relação direta com a escrita musical tradicional.



Código Engine
// Melodias — Engine
int bpm = 180; // Andamento da melodia
#define ARRAY_LEN(x) (sizeof(x) / sizeof(x[0]))
#define buzzer 11
// Definição das notas
#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 REST 0
// Melodias
// Melodia 1 - O Guarani
int melodia1[] = {
NOTE_E5, NOTE_A5, NOTE_G5, NOTE_F5, NOTE_E5,
NOTE_A5, NOTE_G5, NOTE_F5, NOTE_E5,
NOTE_A5, NOTE_A5, NOTE_C6,
NOTE_B5, NOTE_C6, NOTE_B5, NOTE_A5, NOTE_G5, NOTE_A5,
NOTE_B5, NOTE_G5
};
int duracoes1[] = {
2, 4, 8, 8, 2,
4, 8, 8, 2,
4, 4, 4,
8, 8, 4, 8, 8, 4,
4, 4
};
// Melodia 2 - Missão Impossível
int melodia2[] = {
NOTE_A4, NOTE_A4, NOTE_C5, NOTE_E5,
NOTE_A4, NOTE_A4, NOTE_G4, NOTE_GS4,
NOTE_A4, NOTE_A4, NOTE_C5, NOTE_E5,
NOTE_A4, NOTE_A4, NOTE_G4, NOTE_GS4,
NOTE_C5, NOTE_A4, NOTE_E4,
NOTE_C5, NOTE_A4, NOTE_DS4,
NOTE_C5, NOTE_A4, NOTE_D4,
NOTE_C4, NOTE_D4,
};
int duracoes2[] = {
3, 3, 4, 4,
3, 3, 4, 4,
3, 3, 4, 4,
3, 3, 4, 4,
8, 8, 1,
8, 8, 1,
8, 8, 1,
8,3
};
// Melodia 3 — Imperial March
int melodia3[] = {
NOTE_A4, NOTE_A4, NOTE_A4,
NOTE_F4, NOTE_C5, NOTE_A4,
NOTE_F4, NOTE_C5, NOTE_A4, REST,
NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_F5, NOTE_C5, NOTE_A4,
NOTE_F4, NOTE_C5, NOTE_A4
};
int duracoes3[] = {
2, 2, 2,
3, 8, 2,
3, 8, 2, 2,
2, 2, 2,
3, 8, 2,
3, 8, 2
};
// Melodia 4 — Nokia Theme
int melodia4[] = {
NOTE_G5, NOTE_F5, NOTE_A4, NOTE_B4,
NOTE_E5, NOTE_D5, NOTE_F4, NOTE_G4,
NOTE_D5, NOTE_C5, NOTE_E4, NOTE_G4, NOTE_C5
};
int duracoes4[] = {
8, 8, 4, 4,
8, 8, 4, 4,
8, 8, 4, 4, 4
};
// Melodia 5 — Escala Cromática Ascendente
int melodia5[] = {
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4,
NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4,
NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5,
NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5,
NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, REST
};
int duracoes5[] = {
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16
};
// Melodia 6 — Escala Cromática Descendente
int melodia6[] = {
NOTE_C6,
NOTE_B5, NOTE_AS5, NOTE_A5, NOTE_GS5,
NOTE_G5, NOTE_FS5, NOTE_F5, NOTE_E5,
NOTE_DS5, NOTE_D5, NOTE_CS5, NOTE_C5,
NOTE_B4, NOTE_AS4, NOTE_A4, NOTE_GS4,
NOTE_G4, NOTE_FS4, NOTE_F4, NOTE_E4,
NOTE_DS4, NOTE_D4, NOTE_CS4, NOTE_C4, REST
};
int duracoes6[] = {
16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16, 16
};
// ---------------------------------------- Setup
void setup() {
pinMode(buzzer, OUTPUT);
Serial.begin(9600);
Serial.println("Melodias Engine");
delay(1000);
}
// Funções musicais
int tempoSeminima() {
return 60000 / bpm;
}
int calcularDuracao(int figura) {
int base = tempoSeminima();
switch (figura) {
case 16: return base / 4; // semicolcheia
case 8: return base / 2; // colcheia
case 4: return base; // semínima
case 3: return base + base / 2; // semínima pontuada
case 2: return base * 2; // mínima
case 1: return base * 3; // mínima pontuada
}
return base;
}
// Função de execução
void tocarMelodia(const int* melodia, const int* duracoes, int totalNotas) {
Serial.println("Tocando...");
for (int i = 0; i < totalNotas; i++) {
int duracao = calcularDuracao(duracoes[i]);
if (melodia[i] != REST) {
tone(buzzer, melodia[i], duracao);
}
delay(duracao * 1.1); // articulação
noTone(buzzer);
}
}
// ---------------------------------------- Loop
void loop() {
Serial.println("debug -> Melodia 1");
tocarMelodia(
melodia1,
duracoes1,
ARRAY_LEN(melodia1)
);
delay(1000);
Serial.println("debug -> Melodia 2");
tocarMelodia(
melodia2,
duracoes2,
ARRAY_LEN(melodia2)
);
delay(1000);
Serial.println("debug -> Melodia 3");
tocarMelodia(
melodia3,
duracoes3,
ARRAY_LEN(melodia3)
);
delay(1000);
Serial.println("debug -> Melodia 4");
tocarMelodia(
melodia4,
duracoes4,
ARRAY_LEN(melodia4)
);
delay(1000);
Serial.println("debug -> Melodia 5 (Cromática)");
tocarMelodia(
melodia5,
duracoes5,
ARRAY_LEN(melodia5)
);
delay(1000);
Serial.println("debug -> Melodia 6 (Cromática Descendente)");
tocarMelodia(
melodia6,
duracoes6,
ARRAY_LEN(melodia6)
);
delay(1000);
}
Código Clean
#include "melodias.h"
#define BUZZER_PIN 11
void setup() {
Serial.begin(9600);
Serial.println("Melodias Clean");
delay(1000)
melodias_init(BUZZER_PIN);
}
void loop() {
delay(3000);
Serial.println("Debug melodia 1");
melodia1();
delay(1000);
Serial.println("Debug melodia 2");
melodia2();
delay(1000);
Serial.println("Debug melodia 3");
melodia3();
delay(1000);
Serial.println("Debug melodia 4");
melodia4();
delay(1000);
}melodias.h
#ifndef MELODIAS_H #define MELODIAS_H #include <Arduino.h> // inicialização do módulo void melodias_init(uint8_t pin); // melodias disponíveis void melodia1(); void melodia2(); void melodia3(); void melodia4(); #endif
melodias.cpp
#include "melodias.h"
static uint8_t buzzer_pin; // visível apenas neste arquivo
void melodias_init(uint8_t pin) {
buzzer_pin = pin;
pinMode(buzzer_pin, OUTPUT);
}
/* ================= MELODIA 1 ================= */
void melodia1() {
tone(buzzer_pin, 659, 667); delay(667); delay(40);
tone(buzzer_pin, 880, 333); delay(333); delay(40);
tone(buzzer_pin, 784, 167); delay(167); delay(40);
tone(buzzer_pin, 698, 167); delay(167); delay(40);
tone(buzzer_pin, 659, 667); delay(667); delay(80);
tone(buzzer_pin, 880, 333); delay(333); delay(40);
tone(buzzer_pin, 784, 167); delay(167); delay(40);
tone(buzzer_pin, 698, 167); delay(167); delay(40);
tone(buzzer_pin, 659, 667); delay(667); delay(80);
tone(buzzer_pin, 880, 333); delay(333); delay(40);
tone(buzzer_pin, 880, 333); delay(333); delay(40);
tone(buzzer_pin, 1047, 333); delay(333); delay(80);
tone(buzzer_pin, 988, 167); delay(167); delay(40);
tone(buzzer_pin, 1047, 167); delay(167); delay(40);
tone(buzzer_pin, 988, 333); delay(333); delay(40);
tone(buzzer_pin, 880, 167); delay(167); delay(40);
tone(buzzer_pin, 784, 167); delay(167); delay(40);
tone(buzzer_pin, 880, 333); delay(333); delay(80);
tone(buzzer_pin, 988, 333); delay(333); delay(40);
tone(buzzer_pin, 784, 333); delay(333);
}
/* ================= MELODIA 2 ================= */
void melodia2() {
tone(buzzer_pin, 440, 500); delay(500); delay(40);
tone(buzzer_pin, 440, 500); delay(500); delay(40);
tone(buzzer_pin, 523, 333); delay(333); delay(40);
tone(buzzer_pin, 659, 333); delay(333); delay(80);
tone(buzzer_pin, 440, 500); delay(500); delay(40);
tone(buzzer_pin, 440, 500); delay(500); delay(40);
tone(buzzer_pin, 392, 333); delay(333); delay(40);
tone(buzzer_pin, 415, 333); delay(333); delay(80);
tone(buzzer_pin, 440, 500); delay(500); delay(40);
tone(buzzer_pin, 440, 500); delay(500); delay(40);
tone(buzzer_pin, 523, 333); delay(333); delay(40);
tone(buzzer_pin, 659, 333); delay(333); delay(80);
tone(buzzer_pin, 440, 500); delay(500); delay(40);
tone(buzzer_pin, 440, 500); delay(500); delay(40);
tone(buzzer_pin, 392, 333); delay(333); delay(40);
tone(buzzer_pin, 415, 333); delay(333); delay(80);
tone(buzzer_pin, 523, 167); delay(167); delay(40);
tone(buzzer_pin, 440, 167); delay(167); delay(40);
tone(buzzer_pin, 330, 1000); delay(1000); delay(80);
tone(buzzer_pin, 523, 167); delay(167); delay(40);
tone(buzzer_pin, 440, 167); delay(167); delay(40);
tone(buzzer_pin, 311, 1000); delay(1000); delay(80);
tone(buzzer_pin, 523, 167); delay(167); delay(40);
tone(buzzer_pin, 440, 167); delay(167); delay(40);
tone(buzzer_pin, 294, 1000); delay(1000); delay(80);
tone(buzzer_pin, 262, 167); delay(167); delay(40);
tone(buzzer_pin, 294, 500); delay(500);
}
/* ================= MELODIA 3 ================= */
void melodia3() {
tone(buzzer_pin, 440, 667); delay(667); delay(40);
tone(buzzer_pin, 440, 667); delay(667); delay(40);
tone(buzzer_pin, 440, 667); delay(667); delay(80);
tone(buzzer_pin, 349, 500); delay(500); delay(40);
tone(buzzer_pin, 523, 167); delay(167); delay(40);
tone(buzzer_pin, 440, 667); delay(667); delay(80);
tone(buzzer_pin, 349, 500); delay(500); delay(40);
tone(buzzer_pin, 523, 167); delay(167); delay(40);
tone(buzzer_pin, 440, 667); delay(667); delay(120);
tone(buzzer_pin, 659, 667); delay(667); delay(40);
tone(buzzer_pin, 659, 667); delay(667); delay(40);
tone(buzzer_pin, 659, 667); delay(667); delay(80);
tone(buzzer_pin, 698, 500); delay(500); delay(40);
tone(buzzer_pin, 523, 167); delay(167); delay(40);
tone(buzzer_pin, 440, 667); delay(667); delay(80);
tone(buzzer_pin, 349, 500); delay(500); delay(40);
tone(buzzer_pin, 523, 167); delay(167); delay(40);
tone(buzzer_pin, 440, 667); delay(667);
}
/* ================= MELODIA 4 ================= */
void melodia4() {
tone(buzzer_pin, 784, 167); delay(167); delay(40);
tone(buzzer_pin, 698, 167); delay(167); delay(40);
tone(buzzer_pin, 440, 333); delay(333); delay(40);
tone(buzzer_pin, 494, 333); delay(333); delay(80);
tone(buzzer_pin, 659, 167); delay(167); delay(40);
tone(buzzer_pin, 587, 167); delay(167); delay(40);
tone(buzzer_pin, 349, 333); delay(333); delay(40);
tone(buzzer_pin, 392, 333); delay(333); delay(80);
tone(buzzer_pin, 587, 167); delay(167); delay(40);
tone(buzzer_pin, 523, 167); delay(167); delay(40);
tone(buzzer_pin, 330, 333); delay(333); delay(40);
tone(buzzer_pin, 392, 333); delay(333); delay(40);
tone(buzzer_pin, 523, 333); delay(333);
}
Código PWMless
#include "melodias.h"
#define BUZZER_PIN 11
void setup() {
Serial.begin(9600);
Serial.println("Melodias Clean — Sem PWM");
delay(1000);
melodias_init(BUZZER_PIN);
}
void loop() {
delay(3000);
melodia1();
delay(1000);
melodia2();
delay(1000);
melodia3();
delay(1000);
melodia4();
delay(1000);
}melodias.h (PWMless)
#ifndef MELODIAS_H #define MELODIAS_H #include <Arduino.h> // inicialização do módulo void melodias_init(uint8_t pin); // melodias disponíveis void melodia1(); void melodia2(); void melodia3(); void melodia4(); #endif
melodias.cpp (PWMless)
#include "melodias.h"
static uint8_t buzzer_pin;
// ------------------------------------------------------
// Função beep: geração de onda quadrada por software
// ------------------------------------------------------
void beep(int freq, int duracaoMs) {
if (freq <= 0) {
delay(duracaoMs);
return;
}
long periodo = 1000000L / freq;
long meioPeriodo = periodo / 2;
long ciclos = (duracaoMs * 1000L) / periodo;
for (long i = 0; i < ciclos; i++) {
digitalWrite(buzzer_pin, HIGH);
delayMicroseconds(meioPeriodo);
digitalWrite(buzzer_pin, LOW);
delayMicroseconds(meioPeriodo);
}
}
// ------------------------------------------------------
// Inicialização
// ------------------------------------------------------
void melodias_init(uint8_t pin) {
buzzer_pin = pin;
pinMode(buzzer_pin, OUTPUT);
}
// ------------------------------------------------------
// Melodia 1
// ------------------------------------------------------
void melodia1() {
beep(659, 667); delay(40);
beep(880, 333); delay(40);
beep(784, 167); delay(40);
beep(698, 167); delay(40);
beep(659, 667); delay(80);
beep(880, 333); delay(40);
beep(784, 167); delay(40);
beep(698, 167); delay(40);
beep(659, 667); delay(80);
beep(880, 333); delay(40);
beep(880, 333); delay(40);
beep(1047, 333); delay(80);
beep(988, 167); delay(40);
beep(1047, 167); delay(40);
beep(988, 333); delay(40);
beep(880, 167); delay(40);
beep(784, 167); delay(40);
beep(880, 333); delay(80);
beep(988, 333); delay(40);
beep(784, 333);
}
// ------------------------------------------------------
// Melodia 2 — Missão Impossível
// ------------------------------------------------------
void melodia2() {
beep(440, 500); delay(40);
beep(440, 500); delay(40);
beep(523, 333); delay(40);
beep(659, 333); delay(80);
beep(440, 500); delay(40);
beep(440, 500); delay(40);
beep(392, 333); delay(40);
beep(415, 333); delay(80);
beep(440, 500); delay(40);
beep(440, 500); delay(40);
beep(523, 333); delay(40);
beep(659, 333); delay(80);
beep(440, 500); delay(40);
beep(440, 500); delay(40);
beep(392, 333); delay(40);
beep(415, 333); delay(80);
beep(523, 167); delay(40);
beep(440, 167); delay(40);
beep(330, 1000); delay(80);
beep(523, 167); delay(40);
beep(440, 167); delay(40);
beep(311, 1000); delay(80);
beep(523, 167); delay(40);
beep(440, 167); delay(40);
beep(294, 1000); delay(80);
beep(262, 167); delay(40);
beep(294, 500);
}
// ------------------------------------------------------
// Melodia 3 — Imperial March
// ------------------------------------------------------
void melodia3() {
beep(440, 667); delay(40);
beep(440, 667); delay(40);
beep(440, 667); delay(80);
beep(349, 500); delay(40);
beep(523, 167); delay(40);
beep(440, 667); delay(80);
beep(349, 500); delay(40);
beep(523, 167); delay(40);
beep(440, 667); delay(120);
beep(659, 667); delay(40);
beep(659, 667); delay(40);
beep(659, 667); delay(80);
beep(698, 500); delay(40);
beep(523, 167); delay(40);
beep(440, 667); delay(80);
beep(349, 500); delay(40);
beep(523, 167); delay(40);
beep(440, 667);
}
// ------------------------------------------------------
// Melodia 4 — Nokia Theme
// ------------------------------------------------------
void melodia4() {
beep(784, 167); delay(40);
beep(698, 167); delay(40);
beep(440, 333); delay(40);
beep(494, 333); delay(80);
beep(659, 167); delay(40);
beep(587, 167); delay(40);
beep(349, 333); delay(40);
beep(392, 333); delay(80);
beep(587, 167); delay(40);
beep(523, 167); delay(40);
beep(330, 333); delay(40);
beep(392, 333); delay(40);
beep(523, 333);
}Este projeto demonstra como um buzzer passivo, apesar de simples, pode servir como ponto de encontro entre música, eletrônica e programação embarcada. A abordagem modular apresentada permite compreender a tradução de conceitos musicais para código, ao mesmo tempo em que facilita a reutilização e adaptação do sistema a diferentes hardwares.
Ao organizar o código em versões complementares — engine, clean e sem PWM por hardware — o artigo evidencia que decisões de arquitetura são tão importantes quanto o resultado sonoro final. Mais do que tocar melodias, o sistema propõe uma forma estruturada de pensar o som dentro do código, priorizando clareza, portabilidade e controle.
A partir dessa base, o leitor pode expandir o projeto conforme suas necessidades, seja criando novas melodias, adaptando o sistema a outras placas ou explorando aplicações interativas que integrem som e lógica embarcada.
ARDUINO. tone() / noTone().
Documentação oficial das funções tone() e noTone(), descrevendo funcionamento, limitações e comportamento em diferentes placas Arduino.
Disponível em: https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/
ARDUINO. Estrutura de arquivos (.ino, .h, .cpp).
Guia oficial sobre a organização de projetos no Arduino IDE e o uso de arquivos de cabeçalho e implementação.
Disponível em: https://docs.arduino.cc/learn/programming/sketches/
ESPRESSIF SYSTEMS. ESP32 Technical Reference Manual.
Documentação técnica do microcontrolador ESP32, incluindo GPIOs, timers e geração de sinais digitais.
Disponível em: https://www.espressif.com/en/support/documents/technical-documents
MED, Bohumil. Teoria da Música. 4. ed. Brasília: Musimed, 1996.
SOUZA, Vitor Amadeu. Programando o ESP32 no Arduino. São Paulo: Clube de Autores, 2020.
WIKIPÉDIA. Batidas por minuto (BPM).
Disponível em: https://pt.wikipedia.org/wiki/Batidas_por_minuto
WIKIPÉDIA. Som.
Disponível em: https://pt.wikipedia.org/wiki/Som
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!