diff --git a/Core/Clock/melody.c b/Core/Clock/melody.c
index d04d957..e386821 100644
--- a/Core/Clock/melody.c
+++ b/Core/Clock/melody.c
@@ -39,8 +39,7 @@ void Melody_Init(MelodyHandle* mh, TIM_HandleTypeDef* htim, uint32_t channel, ui
mh->htim = htim;
mh->channel = channel;
mh->timer_clock_hz = timer_clock_hz;
- mh->sequence = NULL;
- mh->length = 0;
+ mh->melody = NULL;
mh->current_index = 0;
mh->note_start_time = 0;
mh->is_playing = 0;
@@ -57,20 +56,19 @@ void Melody_SetBPM(MelodyHandle* mh, uint16_t bpm) {
mh->bpm = bpm;
}
-void Melody_Play(MelodyHandle* mh, const Note* sequence, uint16_t length, uint16_t bpm) {
+void Melody_Play(MelodyHandle* mh, Melody_t *melody, uint16_t bpm) {
if (mh->is_playing) {
_set_freq(mh, 0);
}
- mh->sequence = sequence;
- mh->length = length;
+ mh->melody = melody;
mh->current_index = 0;
mh->is_playing = 1;
mh->note_start_time = HAL_GetTick();
mh->bpm = bpm;
- if (length > 0 && sequence[0].freq != 0) {
- _set_freq(mh, sequence[0].freq);
+ if (melody->length > 0 && melody->sequence[0].freq != 0) {
+ _set_freq(mh, melody->sequence[0].freq);
}
}
@@ -83,22 +81,22 @@ void Melody_Update(MelodyHandle* mh) {
if (!mh->is_playing) return;
uint32_t now = HAL_GetTick();
- uint32_t dur_ms = _duration_to_ms(mh, mh->sequence[mh->current_index].duration);
+ uint32_t dur_ms = _duration_to_ms(mh, mh->melody->sequence[mh->current_index].duration);
if (now - mh->note_start_time >= dur_ms) {
mh->current_index++;
- if (mh->current_index >= mh->length) {
+ if (mh->current_index >= mh->melody->length) {
Melody_Stop(mh);
return;
}
mh->note_start_time = now;
- if (mh->sequence[mh->current_index].freq == NOTE_REST) {
+ if (mh->melody->sequence[mh->current_index].freq == NOTE_REST) {
__HAL_TIM_SET_COMPARE(mh->htim, mh->channel, 0);
} else {
- _set_freq(mh, mh->sequence[mh->current_index].freq);
+ _set_freq(mh, mh->melody->sequence[mh->current_index].freq);
}
}
}
diff --git a/Core/Clock/melody.h b/Core/Clock/melody.h
index 716cb1c..35e2887 100644
--- a/Core/Clock/melody.h
+++ b/Core/Clock/melody.h
@@ -2,18 +2,14 @@
#define MELODY_H
#include "stm32f1xx_hal.h"
-
-typedef struct {
- uint16_t freq; // частота в Гц или NOTE_REST
- float duration; // длительность в долях (0.25 = четверть)
-} Note;
+#include "songs.h"
+//#include "sounds.h"
typedef struct {
TIM_HandleTypeDef* htim;
uint32_t channel;
uint32_t timer_clock_hz; // частота тактирования таймера в Гц
- const Note* sequence;
- uint16_t length;
+ Melody_t *melody;
uint16_t current_index;
uint32_t note_start_time;
uint8_t is_playing;
@@ -22,154 +18,9 @@ typedef struct {
void Melody_Init(MelodyHandle* mh, TIM_HandleTypeDef* htim, uint32_t channel, uint32_t timer_clock_hz);
void Melody_SetBPM(MelodyHandle* mh, uint16_t bpm);
-void Melody_Play(MelodyHandle* mh, const Note* sequence, uint16_t length, uint16_t bpm);
+void Melody_Play(MelodyHandle* mh, Melody_t* melody, uint16_t bpm);
void Melody_Stop(MelodyHandle* mh);
void Melody_Update(MelodyHandle* mh);
uint8_t Melody_IsPlaying(MelodyHandle* mh);
-// Длительности (в долях от целой ноты)
-#define NOTE_WHOLE 1.0
-#define NOTE_HALF 0.5
-#define NOTE_QUARTER 0.25
-#define NOTE_EIGHTH 0.125
-#define NOTE_SIXTEENTH 0.0625
-#define NOTE_THIRTYSECOND 0.03125
-
-#define NOTE_WHOLE_DOT 1.5
-#define NOTE_HALF_DOT 0.75
-#define NOTE_QUARTER_DOT 0.375
-#define NOTE_EIGHTH_DOT 0.1875
-#define NOTE_SIXTEENTH_DOT 0.09375
-
-// Ноты (частота, Гц) - диапазон 700-8000 Гц для SCS-17-S
-// Октавы смещены: старая 4-я = новая 0-я, старая 5-я = новая 1-я и т.д.
-
-// 0-я октава (бывшая 4-я)
-#define NOTE_B0 494
-#define NOTE_C1 523
-#define NOTE_CS1 554
-#define NOTE_D1 587
-#define NOTE_DS1 622
-#define NOTE_E1 659
-#define NOTE_F1 698
-#define NOTE_FS1 740
-#define NOTE_G1 784
-#define NOTE_GS1 831
-#define NOTE_A1 880
-#define NOTE_AS1 932
-#define NOTE_B1 988
-
-// 2-я октава (бывшая 6-я)
-#define NOTE_C2 1047
-#define NOTE_CS2 1109
-#define NOTE_D2 1175
-#define NOTE_DS2 1245
-#define NOTE_E2 1319
-#define NOTE_F2 1397
-#define NOTE_FS2 1480
-#define NOTE_G2 1568
-#define NOTE_GS2 1661
-#define NOTE_A2 1760
-#define NOTE_AS2 1865
-#define NOTE_B2 1976
-
-// 3-я октава (бывшая 7-я)
-#define NOTE_C3 2093
-#define NOTE_CS3 2217
-#define NOTE_D3 2349
-#define NOTE_DS3 2489
-#define NOTE_E3 2637
-#define NOTE_F3 2794
-#define NOTE_FS3 2960
-#define NOTE_G3 3136
-#define NOTE_GS3 3322
-#define NOTE_A3 3520
-#define NOTE_AS3 3729
-#define NOTE_B3 3951
-
-// 4-я октава (бывшая 8-я)
-#define NOTE_C4 4186
-#define NOTE_CS4 4435
-#define NOTE_D4 4699
-#define NOTE_DS4 4978
-#define NOTE_E4 5274
-#define NOTE_F4 5588
-#define NOTE_FS4 5920
-#define NOTE_G4 6272
-#define NOTE_GS4 6645
-#define NOTE_A4 7040
-#define NOTE_AS4 7459
-#define NOTE_B4 7902
-
-// Сольфеджио с новыми октавами
-// 0-я октава
-#define SI0 NOTE_B0 // 494 Hz
-
-// 1-я октава
-#define DO1 NOTE_C1 // 523 Hz
-#define RE1 NOTE_D1 // 587 Hz
-#define MI1 NOTE_E1 // 659 Hz
-#define FA1 NOTE_F1 // 698 Hz
-#define SOL1 NOTE_G1 // 784 Hz
-#define LA1 NOTE_A1 // 880 Hz
-#define SI1 NOTE_B1 // 988 Hz
-
-// 2-я октава
-#define DO2 NOTE_C2 // 1047 Hz
-#define RE2 NOTE_D2 // 1175 Hz
-#define MI2 NOTE_E2 // 1319 Hz
-#define FA2 NOTE_F2 // 1397 Hz
-#define SOL2 NOTE_G2 // 1568 Hz
-#define LA2 NOTE_A2 // 1760 Hz
-#define SI2 NOTE_B2 // 1976 Hz
-
-// 3-я октава
-#define DO3 NOTE_C3 // 2093 Hz
-#define RE3 NOTE_D3 // 2349 Hz
-#define MI3 NOTE_E3 // 2637 Hz
-#define FA3 NOTE_F3 // 2794 Hz
-#define SOL3 NOTE_G3 // 3136 Hz
-#define LA3 NOTE_A3 // 3520 Hz
-#define SI3 NOTE_B3 // 3951 Hz
-
-// 4-я октава
-#define DO4 NOTE_C4 // 4186 Hz
-#define RE4 NOTE_D4 // 4699 Hz
-#define MI4 NOTE_E4 // 5274 Hz
-#define FA4 NOTE_F4 // 5588 Hz
-#define SOL4 NOTE_G4 // 6272 Hz
-#define LA4 NOTE_A4 // 7040 Hz
-#define SI4 NOTE_B4 // 7902 Hz
-
-// Диезы для 1-й октавы
-#define DO1s NOTE_CS1 // 554 Hz
-#define RE1s NOTE_DS1 // 622 Hz
-#define FA1s NOTE_FS1 // 740 Hz
-#define SOL1s NOTE_GS1 // 831 Hz
-#define LA1s NOTE_AS1 // 932 Hz
-
-// Диезы для 2-й октавы
-#define DO2s NOTE_CS2 // 1109 Hz
-#define RE2s NOTE_DS2 // 1245 Hz
-#define FA2s NOTE_FS2 // 1480 Hz
-#define SOL2s NOTE_GS2 // 1661 Hz
-#define LA2s NOTE_AS2 // 1865 Hz
-
-// Диезы для 3-й октавы
-#define DO3s NOTE_CS3 // 2217 Hz
-#define RE3s NOTE_DS3 // 2489 Hz
-#define FA3s NOTE_FS3 // 2960 Hz
-#define SOL3s NOTE_GS3 // 3322 Hz
-#define LA3s NOTE_AS3 // 3729 Hz
-
-// Диезы для 4-й октавы
-#define DO4s NOTE_CS4 // 4435 Hz
-#define RE4s NOTE_DS4 // 4978 Hz
-#define FA4s NOTE_FS4 // 5920 Hz
-#define SOL4s NOTE_GS4 // 6645 Hz
-#define LA4s NOTE_AS4 // 7459 Hz
-
-#define NOTE_REST 0
-
-
#endif
\ No newline at end of file
diff --git a/Core/Clock/notes.h b/Core/Clock/notes.h
new file mode 100644
index 0000000..6b1ce48
--- /dev/null
+++ b/Core/Clock/notes.h
@@ -0,0 +1,161 @@
+#ifndef NOTES_H
+#define NOTES_H
+#include "stm32f1xx_hal.h"
+
+typedef struct {
+ uint16_t freq; // частота в Гц или NOTE_REST
+ float duration; // длительность в долях (0.25 = четверть)
+} Note_t;
+
+typedef struct {
+ float length; // длительность мелодии в количестве нот
+ const Note_t *sequence; // последовательность нот
+} Melody_t;
+
+
+// Длительности (в долях от целой ноты)
+#define NOTE_WHOLE 1.0
+#define NOTE_HALF 0.5
+#define NOTE_QUARTER 0.25
+#define NOTE_EIGHTH 0.125
+#define NOTE_SIXTEENTH 0.0625
+#define NOTE_THIRTYSECOND 0.03125
+
+#define NOTE_WHOLE_DOT 1.5
+#define NOTE_HALF_DOT 0.75
+#define NOTE_QUARTER_DOT 0.375
+#define NOTE_EIGHTH_DOT 0.1875
+#define NOTE_SIXTEENTH_DOT 0.09375
+
+// Ноты (частота, Гц) - диапазон 700-8000 Гц для SCS-17-S
+// Октавы смещены: старая 4-я = новая 0-я, старая 5-я = новая 1-я и т.д.
+
+// 0-я октава (бывшая 4-я)
+#define NOTE_B0 494
+#define NOTE_C1 523
+#define NOTE_CS1 554
+#define NOTE_D1 587
+#define NOTE_DS1 622
+#define NOTE_E1 659
+#define NOTE_F1 698
+#define NOTE_FS1 740
+#define NOTE_G1 784
+#define NOTE_GS1 831
+#define NOTE_A1 880
+#define NOTE_AS1 932
+#define NOTE_B1 988
+
+// 2-я октава (бывшая 6-я)
+#define NOTE_C2 1047
+#define NOTE_CS2 1109
+#define NOTE_D2 1175
+#define NOTE_DS2 1245
+#define NOTE_E2 1319
+#define NOTE_F2 1397
+#define NOTE_FS2 1480
+#define NOTE_G2 1568
+#define NOTE_GS2 1661
+#define NOTE_A2 1760
+#define NOTE_AS2 1865
+#define NOTE_B2 1976
+
+// 3-я октава (бывшая 7-я)
+#define NOTE_C3 2093
+#define NOTE_CS3 2217
+#define NOTE_D3 2349
+#define NOTE_DS3 2489
+#define NOTE_E3 2637
+#define NOTE_F3 2794
+#define NOTE_FS3 2960
+#define NOTE_G3 3136
+#define NOTE_GS3 3322
+#define NOTE_A3 3520
+#define NOTE_AS3 3729
+#define NOTE_B3 3951
+
+// 4-я октава (бывшая 8-я)
+#define NOTE_C4 4186
+#define NOTE_CS4 4435
+#define NOTE_D4 4699
+#define NOTE_DS4 4978
+#define NOTE_E4 5274
+#define NOTE_F4 5588
+#define NOTE_FS4 5920
+#define NOTE_G4 6272
+#define NOTE_GS4 6645
+#define NOTE_A4 7040
+#define NOTE_AS4 7459
+#define NOTE_B4 7902
+
+// Сольфеджио с новыми октавами
+// 0-я октава
+#define SI0 NOTE_B0 // 494 Hz
+
+// 1-я октава
+#define DO1 NOTE_C1 // 523 Hz
+#define RE1 NOTE_D1 // 587 Hz
+#define MI1 NOTE_E1 // 659 Hz
+#define FA1 NOTE_F1 // 698 Hz
+#define SOL1 NOTE_G1 // 784 Hz
+#define LA1 NOTE_A1 // 880 Hz
+#define SI1 NOTE_B1 // 988 Hz
+
+// 2-я октава
+#define DO2 NOTE_C2 // 1047 Hz
+#define RE2 NOTE_D2 // 1175 Hz
+#define MI2 NOTE_E2 // 1319 Hz
+#define FA2 NOTE_F2 // 1397 Hz
+#define SOL2 NOTE_G2 // 1568 Hz
+#define LA2 NOTE_A2 // 1760 Hz
+#define SI2 NOTE_B2 // 1976 Hz
+
+// 3-я октава
+#define DO3 NOTE_C3 // 2093 Hz
+#define RE3 NOTE_D3 // 2349 Hz
+#define MI3 NOTE_E3 // 2637 Hz
+#define FA3 NOTE_F3 // 2794 Hz
+#define SOL3 NOTE_G3 // 3136 Hz
+#define LA3 NOTE_A3 // 3520 Hz
+#define SI3 NOTE_B3 // 3951 Hz
+
+// 4-я октава
+#define DO4 NOTE_C4 // 4186 Hz
+#define RE4 NOTE_D4 // 4699 Hz
+#define MI4 NOTE_E4 // 5274 Hz
+#define FA4 NOTE_F4 // 5588 Hz
+#define SOL4 NOTE_G4 // 6272 Hz
+#define LA4 NOTE_A4 // 7040 Hz
+#define SI4 NOTE_B4 // 7902 Hz
+
+// Диезы для 1-й октавы
+#define DO1s NOTE_CS1 // 554 Hz
+#define RE1s NOTE_DS1 // 622 Hz
+#define FA1s NOTE_FS1 // 740 Hz
+#define SOL1s NOTE_GS1 // 831 Hz
+#define LA1s NOTE_AS1 // 932 Hz
+
+// Диезы для 2-й октавы
+#define DO2s NOTE_CS2 // 1109 Hz
+#define RE2s NOTE_DS2 // 1245 Hz
+#define FA2s NOTE_FS2 // 1480 Hz
+#define SOL2s NOTE_GS2 // 1661 Hz
+#define LA2s NOTE_AS2 // 1865 Hz
+
+// Диезы для 3-й октавы
+#define DO3s NOTE_CS3 // 2217 Hz
+#define RE3s NOTE_DS3 // 2489 Hz
+#define FA3s NOTE_FS3 // 2960 Hz
+#define SOL3s NOTE_GS3 // 3322 Hz
+#define LA3s NOTE_AS3 // 3729 Hz
+
+// Диезы для 4-й октавы
+#define DO4s NOTE_CS4 // 4435 Hz
+#define RE4s NOTE_DS4 // 4978 Hz
+#define FA4s NOTE_FS4 // 5920 Hz
+#define SOL4s NOTE_GS4 // 6645 Hz
+#define LA4s NOTE_AS4 // 7459 Hz
+
+#define NOTE_REST 0
+
+
+#endif
\ No newline at end of file
diff --git a/Core/Clock/songs.h b/Core/Clock/songs.h
index af214a2..e6550c6 100644
--- a/Core/Clock/songs.h
+++ b/Core/Clock/songs.h
@@ -1,10 +1,10 @@
#pragma once
-#include "melody.h"
+#include "notes.h"
-#define song_length(song_arr) sizeof(song_arr)/sizeof(song_arr[0]);
+#define song_length(song_arr) sizeof(song_arr)/sizeof(song_arr[0])
-const Note Polyphia_OD[] = {
+static const Note_t Polyphia_OD_Notes[] = {
//1 ТАКТ
{FA1s, NOTE_SIXTEENTH},
{LA1, NOTE_SIXTEENTH},
@@ -77,10 +77,11 @@ const Note Polyphia_OD[] = {
{FA2s, NOTE_SIXTEENTH},
{SI2, NOTE_SIXTEENTH}
};
+static Melody_t Polyphia_OD = {song_length(Polyphia_OD_Notes), Polyphia_OD_Notes};
-const Note Polyphia_PlayingGod[] = {
+static const Note_t Polyphia_PlayingGod_Notes[] = {
//1 ТАКТ
{SOL2, NOTE_QUARTER},
{MI3, NOTE_EIGHTH},
@@ -121,4 +122,5 @@ const Note Polyphia_PlayingGod[] = {
{DO3, NOTE_SIXTEENTH},
{SI2, NOTE_SIXTEENTH},
{MI3, NOTE_SIXTEENTH},
-};
\ No newline at end of file
+};
+static Melody_t Polyphia_PlayingGod = {song_length(Polyphia_PlayingGod_Notes), Polyphia_PlayingGod_Notes};
\ No newline at end of file
diff --git a/Core/Clock/sounds.h b/Core/Clock/sounds.h
new file mode 100644
index 0000000..0168993
--- /dev/null
+++ b/Core/Clock/sounds.h
@@ -0,0 +1,54 @@
+#pragma once
+
+#include "notes.h"
+
+#define song_length(song_arr) sizeof(song_arr)/sizeof(song_arr[0])
+#define SFX_BPM 480 // 480 BPM для звуковых эффектов
+
+// ==================== ЗВУКОВЫЕ ЭФФЕКТЫ ====================
+
+// Короткий писк
+static const Note_t SFX_Beep_Notes[] = {
+ {DO4, NOTE_SIXTEENTH}
+};
+static Melody_t SFX_Beep = {song_length(SFX_Beep_Notes), SFX_Beep_Notes};
+
+// Двойной писк
+static const Note_t SFX_DoubleBeep_Notes[] = {
+ {DO4, NOTE_SIXTEENTH},
+ {NOTE_REST, NOTE_SIXTEENTH},
+ {DO4, NOTE_SIXTEENTH}
+};
+static Melody_t SFX_DoubleBeep = {song_length(SFX_DoubleBeep_Notes), SFX_DoubleBeep_Notes};
+
+// Ошибка
+static const Note_t SFX_Error_Notes[] = {
+ {DO4, NOTE_EIGHTH},
+ {NOTE_REST, NOTE_EIGHTH},
+ {DO4, NOTE_EIGHTH}
+};
+static Melody_t SFX_Error = {song_length(SFX_Error_Notes), SFX_Error_Notes};
+
+// Успех
+static const Note_t SFX_Success_Notes[] = {
+ {DO4, NOTE_SIXTEENTH},
+ {MI4, NOTE_SIXTEENTH},
+ {SOL4, NOTE_QUARTER}
+};
+static Melody_t SFX_Success = {song_length(SFX_Success_Notes), SFX_Success_Notes};
+
+// Нажатие кнопки
+static const Note_t SFX_Click_Notes[] = {
+ {DO4, NOTE_THIRTYSECOND}
+};
+static Melody_t SFX_Click = {song_length(SFX_Click_Notes), SFX_Click_Notes};
+
+// Тревога
+static const Note_t SFX_Alarm_Notes[] = {
+ {LA4, NOTE_EIGHTH},
+ {NOTE_REST, NOTE_EIGHTH},
+ {LA4, NOTE_EIGHTH},
+ {NOTE_REST, NOTE_EIGHTH},
+ {LA4, NOTE_EIGHTH}
+};
+static Melody_t SFX_Alarm = {song_length(SFX_Alarm_Notes), SFX_Alarm_Notes};
\ No newline at end of file
diff --git a/Core/Src/main.c b/Core/Src/main.c
index 857a748..a98dcf9 100644
--- a/Core/Src/main.c
+++ b/Core/Src/main.c
@@ -83,8 +83,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
MelodyHandle melody;
#define curr_song Polyphia_OD
-Note *mySong = (Note *)curr_song;
-int mySong_length = song_length(curr_song);
+Melody_t *mySong = &curr_song;
/* USER CODE END 0 */
@@ -133,7 +132,7 @@ int main(void)
HAL_TIM_Base_Start_IT(&htim2);
Melody_Init(&melody, &htim1, TIM_CHANNEL_1, 72000000);
- Melody_Play(&melody, mySong, mySong_length, 134);
+ Melody_Play(&melody, mySong, 134);
while (1)
{
Menu_Process();
diff --git a/MDK-ARM/lamp.uvoptx b/MDK-ARM/lamp.uvoptx
index 44795ff..0709e2d 100644
--- a/MDK-ARM/lamp.uvoptx
+++ b/MDK-ARM/lamp.uvoptx
@@ -675,6 +675,18 @@
0
0
+
+ 5
+ 34
+ 5
+ 0
+ 0
+ 0
+ ..\Core\Clock\notes.h
+ notes.h
+ 0
+ 0
+
diff --git a/MDK-ARM/lamp.uvprojx b/MDK-ARM/lamp.uvprojx
index 584f007..dc92526 100644
--- a/MDK-ARM/lamp.uvprojx
+++ b/MDK-ARM/lamp.uvprojx
@@ -812,6 +812,11 @@
5
..\Core\Clock\songs.h
+
+ notes.h
+ 5
+ ..\Core\Clock\notes.h
+