diff --git a/examples/device/cdc_msc_hid/src/main.c b/examples/device/cdc_msc_hid/src/main.c index 8ebdddd8..771638ac 100644 --- a/examples/device/cdc_msc_hid/src/main.c +++ b/examples/device/cdc_msc_hid/src/main.c @@ -263,7 +263,7 @@ void led_blinking_task(void) static uint32_t start_ms = 0; static bool led_state = false; - // Blink every 1000 ms + // Blink every interval ms if ( board_millis() - start_ms < blink_interval_ms) return; // not enough time start_ms += blink_interval_ms; diff --git a/examples/device/hid_generic_inout/src/main.c b/examples/device/hid_generic_inout/src/main.c index bbc61a79..77d6cf7b 100644 --- a/examples/device/hid_generic_inout/src/main.c +++ b/examples/device/hid_generic_inout/src/main.c @@ -154,7 +154,7 @@ void led_blinking_task(void) static uint32_t start_ms = 0; static bool led_state = false; - // Blink every 1000 ms + // Blink every interval ms if ( board_millis() - start_ms < blink_interval_ms) return; // not enough time start_ms += blink_interval_ms; diff --git a/examples/device/midi/src/main.c b/examples/device/midi/src/main.c index 60500df9..0cb9b522 100644 --- a/examples/device/midi/src/main.c +++ b/examples/device/midi/src/main.c @@ -30,6 +30,12 @@ #include "bsp/board.h" #include "tusb.h" +/* This MIDI example send sequence of note (on/off) repeatedly. To test on PC, you need to install + * synth software and midi connection management software. On + * - Linux (Ubuntu) : install qsynth, qjackctl. Then connect TinyUSB output port to FLUID Synth input port + * + */ + //--------------------------------------------------------------------+ // MACRO CONSTANT TYPEDEF PROTYPES //--------------------------------------------------------------------+ @@ -48,6 +54,7 @@ enum { static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED; void led_blinking_task(void); +void midi_task(void); /*------------- MAIN -------------*/ int main(void) @@ -62,6 +69,8 @@ int main(void) tud_task(); led_blinking_task(); + + midi_task(); } return 0; @@ -98,6 +107,49 @@ void tud_resume_cb(void) blink_interval_ms = BLINK_MOUNTED; } +//--------------------------------------------------------------------+ +// 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 +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 //--------------------------------------------------------------------+ @@ -106,7 +158,7 @@ void led_blinking_task(void) static uint32_t start_ms = 0; static bool led_state = false; - // Blink every 1000 ms + // Blink every interval ms if ( board_millis() - start_ms < blink_interval_ms) return; // not enough time start_ms += blink_interval_ms; diff --git a/examples/device/msc_dual_lun/src/main.c b/examples/device/msc_dual_lun/src/main.c index 60500df9..060f2064 100644 --- a/examples/device/msc_dual_lun/src/main.c +++ b/examples/device/msc_dual_lun/src/main.c @@ -106,7 +106,7 @@ void led_blinking_task(void) static uint32_t start_ms = 0; static bool led_state = false; - // Blink every 1000 ms + // Blink every interval ms if ( board_millis() - start_ms < blink_interval_ms) return; // not enough time start_ms += blink_interval_ms; diff --git a/examples/host/cdc_msc_hid/src/main.c b/examples/host/cdc_msc_hid/src/main.c index 61f10112..8625bbcd 100644 --- a/examples/host/cdc_msc_hid/src/main.c +++ b/examples/host/cdc_msc_hid/src/main.c @@ -169,7 +169,7 @@ void led_blinking_task(void) static bool led_state = false; - // Blink every 1000 ms + // Blink every interval ms if ( board_millis() - start_ms < interval_ms) return; // not enough time start_ms += interval_ms; diff --git a/src/class/cdc/cdc_device.h b/src/class/cdc/cdc_device.h index bd8aecfe..8d09094a 100644 --- a/src/class/cdc/cdc_device.h +++ b/src/class/cdc/cdc_device.h @@ -103,7 +103,7 @@ TU_ATTR_WEAK void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts); TU_ATTR_WEAK void tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* p_line_coding); //--------------------------------------------------------------------+ -// Application API (Interface0) Implementation +// Inline Functions //--------------------------------------------------------------------+ static inline bool tud_cdc_connected (void) { diff --git a/src/class/midi/midi_device.h b/src/class/midi/midi_device.h index 656fa4fb..6458a683 100644 --- a/src/class/midi/midi_device.h +++ b/src/class/midi/midi_device.h @@ -60,6 +60,8 @@ void tud_midi_n_read_flush (uint8_t itf, uint8_t jack_id); uint32_t tud_midi_n_write (uint8_t itf, uint8_t jack_id, uint8_t const* buffer, uint32_t bufsize); bool tud_midi_n_write_flush (uint8_t itf); +static inline uint32_t tud_midi_n_write24 (uint8_t itf, uint8_t jack_id, uint8_t b1, uint8_t b2, uint8_t b3); + //--------------------------------------------------------------------+ // Application API (Interface0) //--------------------------------------------------------------------+ @@ -68,6 +70,7 @@ static inline uint32_t tud_midi_available (void); static inline uint32_t tud_midi_read (void* buffer, uint32_t bufsize); static inline void tud_midi_read_flush (void); static inline uint32_t tud_midi_write (uint8_t jack_id, void const* buffer, uint32_t bufsize); +static inline uint32_t tudi_midi_write24 (uint8_t jack_id, uint8_t b1, uint8_t b2, uint8_t b3); static inline bool tud_midi_write_flush (void); //--------------------------------------------------------------------+ @@ -76,8 +79,15 @@ static inline bool tud_midi_write_flush (void); TU_ATTR_WEAK void tud_midi_rx_cb(uint8_t itf); //--------------------------------------------------------------------+ -// Application API (Interface0) Implementation +// Inline Functions //--------------------------------------------------------------------+ + +static inline uint32_t tud_midi_n_write24 (uint8_t itf, uint8_t jack_id, uint8_t b1, uint8_t b2, uint8_t b3) +{ + uint8_t msg[3] = { b1, b2, b3 }; + return tud_midi_n_write(itf, jack_id, msg, 3); +} + static inline bool tud_midi_connected (void) { return tud_midi_n_connected(0); @@ -103,6 +113,12 @@ static inline uint32_t tud_midi_write (uint8_t jack_id, void const* buffer, uint return tud_midi_n_write(0, jack_id, buffer, bufsize); } +static inline uint32_t tudi_midi_write24 (uint8_t jack_id, uint8_t b1, uint8_t b2, uint8_t b3) +{ + uint8_t msg[3] = { b1, b2, b3 }; + return tud_midi_write(jack_id, msg, 3); +} + static inline bool tud_midi_write_flush (void) { return tud_midi_n_write_flush(0);