summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--project/.settings/language.settings.xml4
-rw-r--r--project/Core/Inc/Project/player.h10
-rw-r--r--project/Core/Src/Activties/activity13.c25
-rw-r--r--project/Core/Src/Project/player.c34
-rw-r--r--project/Core/Src/Project/player_actions.c17
-rw-r--r--project/Core/Src/Project/tone.c15
-rw-r--r--project/Core/Src/main.c4
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 &quot;${INPUTS}&quot;" 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 &quot;${INPUTS}&quot;" 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 &quot;${INPUTS}&quot;" 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 &quot;${INPUTS}&quot;" 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);
}