|
@@ -2,38 +2,152 @@
|
|
|
#include <stdio.h>
|
|
|
#include "freertos/FreeRTOS.h"
|
|
|
#include "freertos/task.h"
|
|
|
-#include "driver/gpio.h"
|
|
|
+//#include "driver/gpio.h"
|
|
|
#include "esp_log.h"
|
|
|
#include "sdkconfig.h"
|
|
|
-#include "driver/ledc.h"
|
|
|
+#include "driver/dac.h"
|
|
|
+#include "math.h"
|
|
|
|
|
|
-#define PWM_PIN GPIO_NUM_19 // GPIO pin for PWM output
|
|
|
-#define PWM_FREQ 262 // Frequency for C4 (Middle C)
|
|
|
+#define DAC_CHANNEL 1
|
|
|
+#define DAC_PIN GPIO_NUM_25 // GPIO pin for DAC output GPIO25=Channel 1
|
|
|
+#define TONE_FREQ 262 // Frequency for C4 (Middle C)
|
|
|
#define PWM_CHANNEL LEDC_CHANNEL_0
|
|
|
#define PWM_TIMER LEDC_TIMER_0
|
|
|
#define PWM_RES LEDC_TIMER_8_BIT // 8-bit resolution (0-255)
|
|
|
|
|
|
+typedef struct {
|
|
|
+ int frequency; // Frequency in Hz
|
|
|
+ int duration; // Duration in ms
|
|
|
+ int quietDuration; // The quiet duration after each note
|
|
|
+} Note;
|
|
|
+
|
|
|
+// Super Mario Bros. short intro melody
|
|
|
+/*Note melody[] = {
|
|
|
+ {660, 100}, {0, 150}, {660, 100}, {0, 300}, {660, 100}, {0, 300}, {510, 100}, {660, 100}, {770, 100}, {0, 550},
|
|
|
+ {380, 100}, {0, 500}, {510, 100}, {0, 300}, {380, 100}, {0, 300}, {320, 100}, {0, 700} // End of melody
|
|
|
+};*/
|
|
|
+/*Note melody[] = {
|
|
|
+ {440, 500}, {440, 500}, {440, 500}, {349, 350}, {523, 150}, {440, 500}, {349, 350}, {523, 150}, {440, 1000},
|
|
|
+ {659, 500}, {659, 500}, {659, 500}, {698, 350}, {523, 150}, {415, 500}, {349, 350}, {523, 150}, {440, 1000},
|
|
|
+};*/
|
|
|
+/*Note melody[] = {
|
|
|
+ {1318, 150}, {2637, 150}, {2093, 150}, {2349, 150}, {3136, 300}
|
|
|
+};*/
|
|
|
+
|
|
|
+/*Note melody[] = {
|
|
|
+ {320, 200, 200},{320, 200, 200},{320, 200, 200},{320, 200, 200},{320, 200, 200},{320, 200, 200},{320, 200, 200},
|
|
|
+
|
|
|
+ {660, 100, 150}, {660, 100, 300}, {660, 100, 300}, {510, 100, 100}, {660, 100, 300}, {770, 100, 550}, {380, 100, 575},
|
|
|
+ {510, 100, 450}, {380, 100, 400}, {320, 100, 500}, {440, 100, 300}, {480, 80, 330}, {450, 100, 150}, {430, 100, 300},
|
|
|
+ {380, 100, 200}, {660, 80, 200}, {760, 50, 150}, {860, 100, 300}, {700, 80, 150}, {760, 50, 350}, {660, 80, 300},
|
|
|
+ {520, 80, 150}, {580, 80, 150}, {480, 80, 500},
|
|
|
+
|
|
|
+ {510, 100, 450}, {380, 100, 400}, {320, 100, 500}, {440, 100, 300}, {480, 80, 330}, {450, 100, 150}, {430, 100, 300},
|
|
|
+ {380, 100, 200}, {660, 80, 200}, {760, 50, 150}, {860, 100, 300}, {700, 80, 150}, {760, 50, 350}, {660, 80, 300},
|
|
|
+ {520, 80, 150}, {580, 80, 150}, {480, 80, 500},
|
|
|
+
|
|
|
+ {500, 100, 300}, {760, 100, 100}, {720, 100, 150}, {680, 100, 150}, {620, 150, 300}, {650, 150, 300}, {380, 100, 150},
|
|
|
+ {430, 100, 150}, {500, 100, 300}, {430, 100, 150}, {500, 100, 100}, {570, 100, 220}, {500, 100, 300}, {760, 100, 100},
|
|
|
+ {720, 100, 150}, {680, 100, 150}, {620, 150, 300}, {650, 200, 300},
|
|
|
+
|
|
|
+ {1020, 80, 300}, {1020, 80, 150}, {1020, 80, 300}, {380, 100, 300}, {500, 100, 300}, {760, 100, 100}, {720, 100, 150},
|
|
|
+ {680, 100, 150}, {620, 150, 300}, {650, 150, 300}, {380, 100, 150}, {430, 100, 150}, {500, 100, 300}, {430, 100, 150},
|
|
|
+ {500, 100, 100}, {570, 100, 420}, {585, 100, 450}, {550, 100, 420}, {500, 100, 360}, {380, 100, 300}, {500, 100, 300},
|
|
|
+
|
|
|
+ {500, 100, 150}, {500, 100, 300}, {500, 100, 300}, {760, 100, 100}, {720, 100, 150}, {680, 100, 150}, {620, 150, 300},
|
|
|
+ {650, 150, 300}, {380, 100, 150}, {430, 100, 150}, {500, 100, 300}, {430, 100, 150}, {500, 100, 100}, {570, 100, 220},
|
|
|
+ {500, 100, 300}, {760, 100, 100}, {720, 100, 150}, {680, 100, 150}, {620, 150, 300}, {650, 200, 300},
|
|
|
+
|
|
|
+ {1020, 80, 300}, {1020, 80, 150}, {1020, 80, 300}, {380, 100, 300}, {500, 100, 300}, {760, 100, 100}, {720, 100, 150},
|
|
|
+ {680, 100, 150}, {620, 150, 300}, {650, 150, 300}, {380, 100, 150}, {430, 100, 150}, {500, 100, 300}, {430, 100, 150},
|
|
|
+ {500, 100, 100}, {570, 100, 420}, {585, 100, 450}, {550, 100, 420}, {500, 100, 360}, {380, 100, 300}, {500, 100, 300},
|
|
|
+
|
|
|
+ {500, 60, 150}, {500, 80, 300}, {500, 60, 350}, {500, 80, 150}, {580, 80, 350}, {660, 80, 150}, {500, 80, 300},
|
|
|
+ {430, 80, 150}, {380, 80, 600}, {500, 60, 150}, {500, 80, 300}, {500, 60, 350}, {500, 80, 150}, {580, 80, 150},
|
|
|
+ {660, 80, 550}, {870, 80, 325}, {760, 80, 600},
|
|
|
+
|
|
|
+ {500, 60, 150}, {500, 80, 300}, {500, 60, 350}, {500, 80, 150}, {580, 80, 350}, {660, 80, 150}, {500, 80, 300},
|
|
|
+ {430, 80, 150}, {380, 80, 600}, {660, 100, 150}, {660, 100, 300}, {660, 100, 300}, {510, 100, 100}, {660, 100, 300},
|
|
|
+ {770, 100, 550}, {380, 100, 575}
|
|
|
+};*/
|
|
|
+
|
|
|
+const Note melody[] = {
|
|
|
+ {196.00, 152, 0},
|
|
|
+ {261.63, 152, 39},
|
|
|
+ {329.63, 151, 160},
|
|
|
+ {392.00, 152, 201},
|
|
|
+ {523.25, 152, 318},
|
|
|
+ {659.26, 151, 361},
|
|
|
+ {783.99, 456, 480},
|
|
|
+ {659.26, 456, 536},
|
|
|
+ {207.65, 152, 960},
|
|
|
+ {261.63, 152, 999},
|
|
|
+ {311.13, 151, 1120},
|
|
|
+ {415.30, 152, 1161},
|
|
|
+ {523.25, 152, 1278},
|
|
|
+ {622.25, 151, 1321},
|
|
|
+ {830.61, 456, 1440},
|
|
|
+ {622.25, 456, 1496},
|
|
|
+ {233.08, 152, 1920},
|
|
|
+ {293.66, 152, 1959},
|
|
|
+ {349.23, 151, 2080},
|
|
|
+ {466.16, 152, 2121},
|
|
|
+ {587.33, 152, 2238},
|
|
|
+ {698.46, 151, 2281},
|
|
|
+ {932.33, 456, 2400},
|
|
|
+ {932.33, 152, 2456},
|
|
|
+ {932.33, 152, 2863},
|
|
|
+ {932.33, 151, 2616},
|
|
|
+ {659.26, 456, 3025},
|
|
|
+};
|
|
|
+
|
|
|
+int melody_size = sizeof(melody) / sizeof(melody[0]);
|
|
|
+
|
|
|
+static void play_tone(int frequency, float duration, int quietDuration) {
|
|
|
+
|
|
|
+ int semitones = 2;
|
|
|
+
|
|
|
+ int t_freq = frequency * pow(2.0, semitones / 12.0);
|
|
|
+
|
|
|
+ int8_t cw_offset = 0;
|
|
|
+ dac_cw_config_t cosineConf = {DAC_CHANNEL_1, DAC_CW_SCALE_8, DAC_CW_PHASE_0, t_freq, cw_offset};
|
|
|
+
|
|
|
+ if (frequency == 0) {
|
|
|
+ dac_output_disable(DAC_CHANNEL_1);
|
|
|
+ } else {
|
|
|
+ dac_cw_generator_config(&cosineConf);
|
|
|
+ dac_output_enable(DAC_CHANNEL_1);
|
|
|
+ }
|
|
|
+ vTaskDelay(pdMS_TO_TICKS(duration));
|
|
|
+ //dac_output_disable(DAC_CHANNEL_1);
|
|
|
+ //vTaskDelay(pdMS_TO_TICKS(quietDuration));
|
|
|
+}
|
|
|
+
|
|
|
+void play_melody() {
|
|
|
+ for (int i = 0; i < melody_size; i++) {
|
|
|
+ play_tone(melody[i].frequency, melody[i].duration, melody[i].quietDuration);
|
|
|
+ }
|
|
|
+ dac_output_disable(DAC_CHANNEL_1);
|
|
|
+}
|
|
|
+
|
|
|
static void setupSound() {
|
|
|
|
|
|
- // Configure LEDC PWM Timer
|
|
|
- ledc_timer_config_t timer_conf = {
|
|
|
- .speed_mode = LEDC_LOW_SPEED_MODE,
|
|
|
- .duty_resolution = PWM_RES,
|
|
|
- .timer_num = PWM_TIMER,
|
|
|
- .freq_hz = PWM_FREQ,
|
|
|
- .clk_cfg = LEDC_AUTO_CLK,
|
|
|
- };
|
|
|
- ledc_timer_config(&timer_conf);
|
|
|
-
|
|
|
- // Configure LEDC PWM Channel
|
|
|
- ledc_channel_config_t channel_conf = {
|
|
|
- .gpio_num = PWM_PIN,
|
|
|
- .speed_mode = LEDC_LOW_SPEED_MODE,
|
|
|
- .channel = PWM_CHANNEL,
|
|
|
- .timer_sel = PWM_TIMER,
|
|
|
- .duty = 0, // Start at 0% volume
|
|
|
- };
|
|
|
- ledc_channel_config(&channel_conf);
|
|
|
+ int8_t cw_offset = 0;
|
|
|
+ dac_cw_config_t cosineConf = {DAC_CHANNEL_1, DAC_CW_SCALE_8, DAC_CW_PHASE_0, 440, cw_offset};
|
|
|
+
|
|
|
+
|
|
|
+ dac_cw_generator_config(&cosineConf);
|
|
|
+ dac_cw_generator_enable();
|
|
|
+ //dac_output_enable(DAC_CHANNEL_1);
|
|
|
+
|
|
|
+ //vTaskDelay(pdMS_TO_TICKS(1000)); // Delay 1 second
|
|
|
+
|
|
|
+ dac_output_disable(DAC_CHANNEL_1);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
ESP_LOGI("SOUND", "Sound setup");
|
|
|
}
|
|
@@ -44,30 +158,11 @@ static void sound_task(void *pvParameters) {
|
|
|
|
|
|
while (1) {
|
|
|
|
|
|
- ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, 30);
|
|
|
- ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL);
|
|
|
-
|
|
|
- /*// Gradually increase volume (fade-in)
|
|
|
- for (int duty = 10; duty <= 127; duty += 5) {
|
|
|
- ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, duty);
|
|
|
- ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL);
|
|
|
- vTaskDelay(pdMS_TO_TICKS(50));
|
|
|
- }*/
|
|
|
-
|
|
|
- vTaskDelay(pdMS_TO_TICKS(1000)); // Keep sound for 500ms
|
|
|
-
|
|
|
- ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, 10);
|
|
|
- ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL);
|
|
|
|
|
|
- /*// Gradually decrease volume (fade-out)
|
|
|
- for (int duty = 127; duty >= 0; duty -= 5) {
|
|
|
- ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, duty);
|
|
|
- ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL);
|
|
|
- vTaskDelay(pdMS_TO_TICKS(50));
|
|
|
- }*/
|
|
|
|
|
|
|
|
|
- vTaskDelay(pdMS_TO_TICKS(1000)); // Delay 1 second
|
|
|
+ vTaskDelay(pdMS_TO_TICKS(5000));
|
|
|
+ play_melody();
|
|
|
}
|
|
|
|
|
|
ESP_LOGI("SOUND", "Sound task starts....");
|