#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include "hardware/clocks.h"
#include "hardware/gpio.h"
// Definindo o pino do buzzer
#define BUZZER_PIN 21
// Ajustes para o tempo
#define BPM 550 // BPM para Ghostbusters
#define TEMPO_BATIDA (60000000 / BPM) // Tempo em microssegundos para cada batida (em 116 BPM)
// Frequências das notas
#define A 440.000000
#define B 493.883301
#define E 329.627533
#define FSHARP 740.000000
#define GSHARP 415.304688
#define Bm 466.163788 // Bm (nota base para o acorde)
#define Gm7_5 415.304688 // G#m7(5-) simplificado
// Função para inicializar o PWM no pino do buzzer
void pwm_init_buzzer(uint pin, uint slice_num)
{
gpio_set_function(pin, GPIO_FUNC_PWM);
pwm_config config = pwm_get_default_config();
pwm_init(slice_num, &config, true);
pwm_set_gpio_level(pin, 0);
}
// Função para alterar a frequência da nota
void change_note(uint slice_num, float note_freq)
{
pwm_set_clkdiv(slice_num, clock_get_hz(clk_sys) / (note_freq * 65535));
}
// Função para tocar os acordes
void tocar_acorde(uint slice_num, float acorde[], int num_notas)
{
for (int i = 0; i < num_notas; i++) {
pwm_set_gpio_level(BUZZER_PIN, 4096); // Ativar buzzer
change_note(slice_num, acorde[i]); // Alterar a nota
sleep_us(TEMPO_BATIDA); // Esperar pelo tempo do acorde
pwm_set_gpio_level(BUZZER_PIN, 0); // Desativar buzzer
sleep_us(TEMPO_BATIDA); // Pausar até a próxima nota
}
}
// Função para tocar a música "Ghostbusters"
void tocar_musica(uint slice_num)
{
// Acordes da música simplificados com base na cifra fornecida
// [Intro]
float intro[] = {B, A, E, B, A, E}; // Intro
// [Primeira Parte]
float parte1[] = {B, A, E}; // Primeira parte
float parte2[] = {B, A, E}; // Segunda parte
float refrão[] = {Bm, Gm7_5, E}; // Refrão
// Tocar intro
tocar_acorde(slice_num, intro, 6);
// Tocar a primeira parte
tocar_acorde(slice_num, parte1, 3);
tocar_acorde(slice_num, parte2, 3);
// Tocar refrão
tocar_acorde(slice_num, refrão, 3);
// Repetir a estrutura da música
// Verso 1
tocar_acorde(slice_num, parte1, 3);
tocar_acorde(slice_num, parte2, 3);
// Refrão
tocar_acorde(slice_num, refrão, 3);
// Ponte (usando os acordes B e A)
float ponte[] = {B, A, B, A}; // Ponte
tocar_acorde(slice_num, ponte, 4);
// Segunda Parte
tocar_acorde(slice_num, parte1, 3);
tocar_acorde(slice_num, parte2, 3);
// Refrão final
tocar_acorde(slice_num, refrão, 3);
// Concluir
tocar_acorde(slice_num, intro, 6); // Finalizar com o mesmo acorde da introdução
}
int main()
{
// Inicializar o sistema de saída padrão
stdio_init_all();
// Inicialização do PWM no pino do buzzer
uint slice_num = pwm_gpio_to_slice_num(BUZZER_PIN);
pwm_init_buzzer(BUZZER_PIN, slice_num);
// Tocar a música
while (true)
{
// O loop principal permanece vazio
tocar_musica(slice_num);
sleep_ms(2000);
}
return 0;
}