summaryrefslogtreecommitdiff
path: root/examples/device/dynamic_configuration/src
diff options
context:
space:
mode:
authorhathach <[email protected]>2020-04-23 14:37:22 +0700
committerhathach <[email protected]>2020-04-23 14:37:22 +0700
commita029c63b3061c1b84c18d9a7453bdf7180e02b86 (patch)
tree8c99b2a9c449a52dbeb33bba890bcb5d37ed24ac /examples/device/dynamic_configuration/src
parent7acdcc2ebcf0d3e5a9949212d26d61357190dd7e (diff)
complete the midi output for dynamic configuration
Diffstat (limited to 'examples/device/dynamic_configuration/src')
-rw-r--r--examples/device/dynamic_configuration/src/main.c47
1 files changed, 45 insertions, 2 deletions
diff --git a/examples/device/dynamic_configuration/src/main.c b/examples/device/dynamic_configuration/src/main.c
index a407e2ddd..3ad13aefa 100644
--- a/examples/device/dynamic_configuration/src/main.c
+++ b/examples/device/dynamic_configuration/src/main.c
@@ -48,8 +48,8 @@ enum {
static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;
void led_blinking_task(void);
-
void cdc_task(void);
+void midi_task(void);
/*------------- MAIN -------------*/
int main(void)
@@ -61,8 +61,8 @@ int main(void)
{
tud_task(); // tinyusb device task
led_blinking_task();
-
cdc_task();
+ midi_task();
}
return 0;
@@ -147,6 +147,49 @@ void tud_cdc_rx_cb(uint8_t itf)
}
//--------------------------------------------------------------------+
+// MIDI Task
+//--------------------------------------------------------------------+
+
+// Variable that holds the current position in the sequence.
+uint32_t note_pos = 0;
+
+// Store example melody as an array of note values
+static const uint8_t note_sequence[] =
+{
+ 74,78,81,86,90,93,98,102,57,61,66,69,73,78,81,85,88,92,97,100,97,92,88,85,81,78,
+ 74,69,66,62,57,62,66,69,74,78,81,86,90,93,97,102,97,93,90,85,81,78,73,68,64,61,
+ 56,61,64,68,74,78,81,86,90,93,98,102
+};
+
+void midi_task(void)
+{
+ static uint32_t start_ms = 0;
+
+ // send note every 1000 ms
+ if (board_millis() - start_ms < 286) return; // not enough time
+ start_ms += 286;
+
+ // Previous positions in the note sequence.
+ int previous = note_pos - 1;
+
+ // If we currently are at position 0, set the
+ // previous position to the last note in the sequence.
+ if (previous < 0) previous = sizeof(note_sequence) - 1;
+
+ // Send Note On for current position at full velocity (127) on channel 1.
+ tudi_midi_write24(0, 0x90, note_sequence[note_pos], 127);
+
+ // Send Note Off for previous note.
+ tudi_midi_write24(0, 0x80, note_sequence[previous], 0);
+
+ // Increment position
+ note_pos++;
+
+ // If we are at the end of the sequence, start over.
+ if (note_pos >= sizeof(note_sequence)) note_pos = 0;
+}
+
+//--------------------------------------------------------------------+
// BLINKING TASK
//--------------------------------------------------------------------+
void led_blinking_task(void)