diff options
| -rw-r--r-- | project/.settings/language.settings.xml | 4 | ||||
| -rw-r--r-- | project/Core/Inc/Project/player.h | 10 | ||||
| -rw-r--r-- | project/Core/Src/Activties/activity13.c | 25 | ||||
| -rw-r--r-- | project/Core/Src/Project/player.c | 34 | ||||
| -rw-r--r-- | project/Core/Src/Project/player_actions.c | 17 | ||||
| -rw-r--r-- | project/Core/Src/Project/tone.c | 15 | ||||
| -rw-r--r-- | project/Core/Src/main.c | 4 |
7 files changed, 76 insertions, 33 deletions
diff --git a/project/.settings/language.settings.xml b/project/.settings/language.settings.xml index ae082b2..ec1bb84 100644 --- a/project/.settings/language.settings.xml +++ b/project/.settings/language.settings.xml @@ -5,7 +5,7 @@ <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> - <provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="781097053452714720" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> + <provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1037502373549229776" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> <language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.g++"/> </provider> @@ -16,7 +16,7 @@ <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> - <provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="781097053452714720" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> + <provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1037502373549229776" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> <language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.g++"/> </provider> diff --git a/project/Core/Inc/Project/player.h b/project/Core/Inc/Project/player.h index 23853cb..1b1d308 100644 --- a/project/Core/Inc/Project/player.h +++ b/project/Core/Inc/Project/player.h @@ -15,10 +15,16 @@ typedef struct { uint8_t value; } note_event_t; -note_event_t NULL_EVENT = {10, 0, 0, 0}; +typedef struct { + note_event_t events[1024]; + int nEvents; + int curEventIndex; +} track_t; + +void play_notes(int count); void parse_song(uint8_t *p_song); -uint8_t *parse_track(uint8_t *p_song, note_event_t *events); +uint8_t *parse_track(uint8_t *p_song, track_t *track); #endif /* INC_PROJECT_PLAYER_H_ */ diff --git a/project/Core/Src/Activties/activity13.c b/project/Core/Src/Activties/activity13.c index 16c2c1b..a4dad21 100644 --- a/project/Core/Src/Activties/activity13.c +++ b/project/Core/Src/Activties/activity13.c @@ -11,23 +11,24 @@ #include "dac.h" //write 1s for half the freq and 0s for the other half -void play_freq(uint8_t hz) { - uint32_t rollover = hertz_to_systicks(hz); - int count = systick_get_count(); - if ((count % rollover) < (rollover >> 1)) { - DAC_Set_Value(3000); - printf("1"); - } - else { - DAC_Set_Value(0); - printf("0"); - } +void play_freq(uint16_t hz) { + uint32_t rollover = hertz_to_systicks (hz); + if ((systick_get_count () % rollover) < (rollover >> 1)) { + DAC_Set_Value(500); +// printf ("1"); + } + else { + DAC_Set_Value(0); +// printf ("0"); + } } void activity13_run() { init_systick(); DAC_Init(); + DAC_Start(); for(;;) { - play_freq(3000); + play_freq(500); } +// DAC_Set_Value(3000); } diff --git a/project/Core/Src/Project/player.c b/project/Core/Src/Project/player.c index f9ffbce..53ae0f8 100644 --- a/project/Core/Src/Project/player.c +++ b/project/Core/Src/Project/player.c @@ -12,11 +12,34 @@ #include "activity4.h" #include "song_info.h" #include "player.h" +#include "systick.h" +#include "tone.h" #define NOTE_OFF_EVENT (0) #define NOTE_ON_EVENT (1) #define KEY_PRESSURE (2) +static track_t tracks[16]; +static int nTracks; +static int startTime; + +void play_notes(int count) { + int curAbsTime = count - startTime; + for (int i = 0; i < nTracks; i++) { + note_event_t curEvent = tracks[i].events[tracks[i].curEventIndex]; + if (curEvent.abs_time >= curAbsTime) { + switch (curEvent.ev_type) { + case NOTE_OFF_EVENT: + remove_tone(curEvent.key_number); break; + case NOTE_ON_EVENT: + add_tone(curEvent.key_number, curEvent.value); break; + } + } + tracks[i].curEventIndex++; + } + play_tones(); +} + void parse_song(uint8_t *p_song) { header_t header; header = get_header(p_song); @@ -25,13 +48,13 @@ void parse_song(uint8_t *p_song) { song_info_t song_info; p_song = get_song_info(p_song, &song_info); - note_event_t trackEvents[header.ntrcks][1024]; for(int i = 0; i < header.ntrcks; i++){ - p_song = parse_track(p_song, trackEvents[i]); + p_song = parse_track(p_song, &tracks[i]); } + nTracks = header.ntrcks; } -uint8_t *parse_track(uint8_t *p_song, note_event_t *events) { +uint8_t *parse_track(uint8_t *p_song, track_t *track) { p_song += 4; // skip MTrk uint32_t MTrk_len = convert_to_uint32(p_song); p_song += 4; @@ -68,9 +91,10 @@ uint8_t *parse_track(uint8_t *p_song, note_event_t *events) { note.value = *p_song; p_song++; - events[curEvent++] = note; + track->events[curEvent++] = note; } - events[curEvent] = NULL_EVENT; // null terminate array + track->nEvents = curEvent; + track->curEventIndex = 0; return p_song; } diff --git a/project/Core/Src/Project/player_actions.c b/project/Core/Src/Project/player_actions.c index 01aff5e..b486dd8 100644 --- a/project/Core/Src/Project/player_actions.c +++ b/project/Core/Src/Project/player_actions.c @@ -12,6 +12,7 @@ #include "song_info.h" #include "song.h" #include "LED.h" +#include "player.h" static uint8_t state = STOPPED_STATE; @@ -54,6 +55,8 @@ void player_next() { song_info_t song_info; get_song_info(song, &song_info); + parse_song(song); + printf("Song #%i\r\n", current_song + 1); if (song_info.title) printf("Title: %s\r\n", song_info.title); @@ -90,10 +93,12 @@ void player_stop() { * Toggles the LED every second if in pause mode */ void player_action_tick(int count) { - if (state != PAUSED_STATE) - return; - - if(!(count & 1023)) { - LED_Toggle(); - } + switch (state) { + case PAUSED_STATE: + if(!(count & 1023)) { + LED_Toggle(); + }; break; + case PLAYING_STATE: + play_notes(count); + } } diff --git a/project/Core/Src/Project/tone.c b/project/Core/Src/Project/tone.c index a0d1cb0..eb6d4b0 100644 --- a/project/Core/Src/Project/tone.c +++ b/project/Core/Src/Project/tone.c @@ -5,7 +5,7 @@ * Author: bruce */ - +#include "systick.h" #include "tone.h" #define CPU_SPEED (80000000.0) @@ -25,7 +25,7 @@ static float notes[] = { /* Octave 9 */ 8372.02, 8869.84, 9397.26, 9956.06,10548.08,11175.30,11839.82,12543.86}; typedef struct { - uint32_t duration; + uint32_t note; uint16_t power; } tone_info; @@ -69,14 +69,21 @@ uint8_t add_tone (uint8_t note, uint8_t velocity) { // Remove a tone from the tones array uint8_t remove_tone (uint8_t note) { - tones [0].duration = hertz_to_systicks (notes [note]); + tones [0].note = hertz_to_systicks (notes [note]); tones [0].power = 0; return 0; } // 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); } diff --git a/project/Core/Src/main.c b/project/Core/Src/main.c index 0863915..0a36667 100644 --- a/project/Core/Src/main.c +++ b/project/Core/Src/main.c @@ -27,11 +27,11 @@ int main(void){ printf("\n\n\n\n\n\n\n\n\r"); // run_demo(); // activity4_run(); -// project_run(); + project_run(); // activity10_run(); // hw6_run(); // activity12_run(); - activity13_run(); +// activity13_run(); // hw8_run(); // parse_song(get_song(0).p_song + 109); } |
