#include "midi.h" #include #include #include #include #ifdef MIDI_DYNAMIC_MEMORY_ALLOC midi_message_t *midi_alloc_message(size_t data_size) { return (midi_message_t *) malloc(sizeof(midi_message_t) + data_size); } void midi_free_message(midi_message_t *pkt) { if (pkt == NULL) { return; } free(pkt); pkt = NULL; } size_t midi_message_size(const midi_message_t *pkt) { if (pkt == NULL) { return 0; } switch (pkt->status) { case NOTE_ON: return sizeof(midi_message_t) + 2; case NOTE_OFF: return sizeof(midi_message_t) + 1; default: return sizeof(midi_message_t); } } #endif int midi_set_status(midi_message_t *pkt, midi_status_t status) { if (pkt == NULL) { return -1; } pkt->status = status & 0x0F; return 0; } int midi_set_channel(midi_message_t *pkt, unsigned channel) { if (pkt == NULL) { return -1; } pkt->channel = channel & 0x0F; return 0; } int midi_note_on(midi_message_t *pkt, unsigned channel, unsigned note, uint8_t velocity) { if (pkt == NULL) { return -1; } #ifdef MIDI_DYNAMIC_MEMORY_ALLOC if (pkt->data == NULL) { return -2; } #endif midi_set_status(pkt, NOTE_ON); midi_set_channel(pkt, channel); pkt->data[0] = note; pkt->data[1] = velocity; #ifndef MIDI_DYNAMIC_MEMORY_ALLOC pkt->data_size = 2; #endif return 0; } int midi_note_off(midi_message_t *pkt, unsigned channel, unsigned note, uint8_t velocity) { if (pkt == NULL) { return -1; } #ifdef MIDI_DYNAMIC_MEMORY_ALLOC if (pkt->data == NULL) { return -2; } #endif midi_set_status(pkt, NOTE_OFF); midi_set_channel(pkt, channel); pkt->data[0] = note; pkt->data[1] = velocity; #ifndef MIDI_DYNAMIC_MEMORY_ALLOC pkt->data_size = 2; #endif return 0; }