mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-31 05:52:55 +08:00
tested midi example
This commit is contained in:
parent
62d3b91691
commit
1a0e02fa1b
@ -263,7 +263,7 @@ void led_blinking_task(void)
|
|||||||
static uint32_t start_ms = 0;
|
static uint32_t start_ms = 0;
|
||||||
static bool led_state = false;
|
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
|
if ( board_millis() - start_ms < blink_interval_ms) return; // not enough time
|
||||||
start_ms += blink_interval_ms;
|
start_ms += blink_interval_ms;
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ void led_blinking_task(void)
|
|||||||
static uint32_t start_ms = 0;
|
static uint32_t start_ms = 0;
|
||||||
static bool led_state = false;
|
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
|
if ( board_millis() - start_ms < blink_interval_ms) return; // not enough time
|
||||||
start_ms += blink_interval_ms;
|
start_ms += blink_interval_ms;
|
||||||
|
|
||||||
|
@ -30,6 +30,12 @@
|
|||||||
#include "bsp/board.h"
|
#include "bsp/board.h"
|
||||||
#include "tusb.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
|
// MACRO CONSTANT TYPEDEF PROTYPES
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
@ -48,6 +54,7 @@ enum {
|
|||||||
static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;
|
static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;
|
||||||
|
|
||||||
void led_blinking_task(void);
|
void led_blinking_task(void);
|
||||||
|
void midi_task(void);
|
||||||
|
|
||||||
/*------------- MAIN -------------*/
|
/*------------- MAIN -------------*/
|
||||||
int main(void)
|
int main(void)
|
||||||
@ -62,6 +69,8 @@ int main(void)
|
|||||||
tud_task();
|
tud_task();
|
||||||
|
|
||||||
led_blinking_task();
|
led_blinking_task();
|
||||||
|
|
||||||
|
midi_task();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -98,6 +107,49 @@ void tud_resume_cb(void)
|
|||||||
blink_interval_ms = BLINK_MOUNTED;
|
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
|
// BLINKING TASK
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
@ -106,7 +158,7 @@ void led_blinking_task(void)
|
|||||||
static uint32_t start_ms = 0;
|
static uint32_t start_ms = 0;
|
||||||
static bool led_state = false;
|
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
|
if ( board_millis() - start_ms < blink_interval_ms) return; // not enough time
|
||||||
start_ms += blink_interval_ms;
|
start_ms += blink_interval_ms;
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ void led_blinking_task(void)
|
|||||||
static uint32_t start_ms = 0;
|
static uint32_t start_ms = 0;
|
||||||
static bool led_state = false;
|
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
|
if ( board_millis() - start_ms < blink_interval_ms) return; // not enough time
|
||||||
start_ms += blink_interval_ms;
|
start_ms += blink_interval_ms;
|
||||||
|
|
||||||
|
@ -169,7 +169,7 @@ void led_blinking_task(void)
|
|||||||
|
|
||||||
static bool led_state = false;
|
static bool led_state = false;
|
||||||
|
|
||||||
// Blink every 1000 ms
|
// Blink every interval ms
|
||||||
if ( board_millis() - start_ms < interval_ms) return; // not enough time
|
if ( board_millis() - start_ms < interval_ms) return; // not enough time
|
||||||
start_ms += interval_ms;
|
start_ms += interval_ms;
|
||||||
|
|
||||||
|
@ -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);
|
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)
|
static inline bool tud_cdc_connected (void)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
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);
|
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)
|
// 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 uint32_t tud_midi_read (void* buffer, uint32_t bufsize);
|
||||||
static inline void tud_midi_read_flush (void);
|
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 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);
|
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);
|
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)
|
static inline bool tud_midi_connected (void)
|
||||||
{
|
{
|
||||||
return tud_midi_n_connected(0);
|
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);
|
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)
|
static inline bool tud_midi_write_flush (void)
|
||||||
{
|
{
|
||||||
return tud_midi_n_write_flush(0);
|
return tud_midi_n_write_flush(0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user