summaryrefslogtreecommitdiff
path: root/project/Core/Src/Project
diff options
context:
space:
mode:
authorsowgro <tpoke.ferrari@gmail.com>2025-12-15 22:19:59 -0500
committersowgro <tpoke.ferrari@gmail.com>2025-12-15 22:19:59 -0500
commitb7b00994fa6ddd4c29c20f37dde7e10fa88d5812 (patch)
tree2ceff2003b1e6f685e19224c3fa948bb9b9cc22a /project/Core/Src/Project
parent0616056e336da34b0a84e98e6e0ee286d4b69b8b (diff)
download340-repo-Sowgro-b7b00994fa6ddd4c29c20f37dde7e10fa88d5812.tar.gz
340-repo-Sowgro-b7b00994fa6ddd4c29c20f37dde7e10fa88d5812.tar.bz2
340-repo-Sowgro-b7b00994fa6ddd4c29c20f37dde7e10fa88d5812.zip
Push most recent code
Diffstat (limited to 'project/Core/Src/Project')
-rw-r--r--project/Core/Src/Project/parser.c23
-rw-r--r--project/Core/Src/Project/tone.c28
2 files changed, 40 insertions, 11 deletions
diff --git a/project/Core/Src/Project/parser.c b/project/Core/Src/Project/parser.c
index 397dd7b..1c04ab5 100644
--- a/project/Core/Src/Project/parser.c
+++ b/project/Core/Src/Project/parser.c
@@ -19,15 +19,24 @@ static track_t tracks[4];
static int nTracks;
static int startTime;
static song_info_t song_info;
+static uint16_t division;
/**
* Prepare the parser to play the notes
* Expected that parse_song() was called first
*/
void parser_play_init() {
+ DAC_Init();
+ DAC_Start();
startTime = systick_get_count();
}
+uint32_t ticks_to_ms(uint32_t ticks) {
+ // tempo is in microseconds per quarter note
+ uint32_t us_per_tick = song_info.tempo / division;
+ return (ticks * us_per_tick) / 1000;
+}
+
/**
* Play any notes that are ready to be played
* Should be called continuously in the play state
@@ -35,9 +44,13 @@ void parser_play_init() {
*/
void parser_play_loop() {
int curAbsTime = systick_get_count() - startTime;
- for (int i = 0; i < nTracks; i++) {
+ for (int i = 1; i < 2; i++) {
+ if (tracks[i].curEventIndex >= tracks[i].nEvents) {
+ continue;
+ }
note_event_t curEvent = tracks[i].events[tracks[i].curEventIndex];
- if (curEvent.abs_time >= curAbsTime) {
+ if (ticks_to_ms(curEvent.abs_time) <= curAbsTime) {
+ printf("%i %i %i\r\n", curEvent.ev_type, curEvent.key_number, curEvent.value);
switch (curEvent.ev_type) {
case NOTE_OFF_EVENT:
remove_tone(curEvent.key_number); break;
@@ -61,10 +74,13 @@ void parse_song(uint8_t *p_song) {
parse_song_info(p_song, &song_info);
+ division = header.division;
+
nTracks = header.ntrcks;
for(int i = 0; i < nTracks; i++){
p_song = parse_track(p_song, &tracks[i]);
}
+ printf("done\r\n");
}
/**
@@ -81,7 +97,7 @@ uint8_t *parse_track(uint8_t *p_song, track_t *track) {
int curEvent = 0;
uint32_t prev_abs_time = 0;
- for (uint8_t *p_end = p_song + MTrk_len; p_song != p_end; p_song++) {
+ for (uint8_t *p_end = p_song + MTrk_len; p_song != p_end; ) {
note_event_t note;
parseDelay_result_t delay_result = parseDelay(p_song);
@@ -111,6 +127,7 @@ uint8_t *parse_track(uint8_t *p_song, track_t *track) {
p_song++;
track->events[curEvent++] = note;
+ printf("%i %i %i\r\n", note.ev_type, note.key_number, note.value);
}
track->nEvents = curEvent;
track->curEventIndex = 0;
diff --git a/project/Core/Src/Project/tone.c b/project/Core/Src/Project/tone.c
index eb6d4b0..d6449b2 100644
--- a/project/Core/Src/Project/tone.c
+++ b/project/Core/Src/Project/tone.c
@@ -76,14 +76,26 @@ uint8_t remove_tone (uint8_t note) {
// Play any tones in the array
void play_tones () {
- int power_sum = 0;
- for (int i = 0; i < MAX_TONES; i++) {
- uint32_t rollover = hertz_to_systicks (tones[i].note);
- if ((systick_get_count () % rollover) < (rollover >> 1)) {
- power_sum += 500;
- }
- }
- DAC_Set_Value(power_sum);
+// int power_sum = 0;
+// for (int i = 0; i < MAX_TONES; i++) {
+// uint32_t rollover = tones[i].note;
+//// printf("%i\r\n", tones[i].note);
+// if ((systick_get_count () % rollover) < (rollover >> 1)) {
+// power_sum += 500;
+// }
+// }
+// DAC_Set_Value(power_sum);
+// printf("called %i\r\n", power_sum);
+
+ uint32_t rollover = tones[0].note;
+ if ((systick_get_count () % rollover) < (rollover >> 1)) {
+ DAC_Set_Value(500);
+// printf ("1");
+ }
+ else {
+ DAC_Set_Value(0);
+// printf ("0");
+ }
}