diff options
| author | Donald Delmar Davis <don@suspectdevices.com> | 2013-04-17 17:58:34 -0700 |
|---|---|---|
| committer | Donald Delmar Davis <don@suspectdevices.com> | 2013-04-17 17:58:34 -0700 |
| commit | d00237f1bd8cf886d4b4662c7c4c2cb037e1a431 (patch) | |
| tree | 9bf77e8e07cb7a07e0ac6c2d33717d9a01c9a593 /libmaple | |
| parent | a4b5f3e31c44c3d471683f20a5ccb35a018ae688 (diff) | |
Basic sysex parser to determine if its mine.
Diffstat (limited to 'libmaple')
| -rw-r--r-- | libmaple/MidiSpecs.h | 7 | ||||
| -rw-r--r-- | libmaple/MinSysex.c | 94 | ||||
| -rw-r--r-- | libmaple/MinSysex.h | 17 | ||||
| -rw-r--r-- | libmaple/usb/stm32f1/usb_midi_device.c | 7 |
4 files changed, 124 insertions, 1 deletions
diff --git a/libmaple/MidiSpecs.h b/libmaple/MidiSpecs.h index 008f460..0cc618c 100644 --- a/libmaple/MidiSpecs.h +++ b/libmaple/MidiSpecs.h @@ -127,6 +127,13 @@ typedef struct // may need to be adjusted for other compilers and bitfield order #define MIDIv1_ACTIVE_SENSE 0xFE /* no data -- CIN_1BYTE */ #define MIDIv1_RESET 0xFF /* no data -- CIN_1BYTE */ +/* + * sysex universal id's + */ +#define MIDIv1_UNIVERSAL_REALTIME_ID 0x7F +#define MIDIv1_UNIVERSAL_NON_REALTIME_ID 0x7E +#define MIDIv1_UNIVERSAL_ALL_CHANNELS 0x7F + #endif diff --git a/libmaple/MinSysex.c b/libmaple/MinSysex.c index a6af76d..350ebb6 100644 --- a/libmaple/MinSysex.c +++ b/libmaple/MinSysex.c @@ -5,11 +5,105 @@ // Created by Donald D Davis on 4/11/13. // Copyright (c) 2013 Suspect Devices. All rights reserved. // +/* + 0xF0 SysEx + 0x7E Non-Realtime + 0x7F The SysEx channel. Could be from 0x00 to 0x7F. + Here we set it to "disregard channel". + 0x06 Sub-ID -- General Information + 0x01 Sub-ID2 -- Identity Request + 0xF7 End of SysEx +*/ #include <libmaple/usb_midi_device.h> #include <MinSysex.h> +#define MAX_SYSEX_SIZE 256 +typedef enum {NOT_IN_SYSEX=0,IN_SYSEX,COULD_BE_MY_SYSEX,YUP_ITS_MY_SYSEX,ITS_NOT_MY_SYSEX,I_GOT_MY_SYSEX} sysexStates; +volatile uint8 sysexBuffer[MAX_SYSEX_SIZE]; +volatile sysexStates sysexState; +volatile int sysexFinger=0; +void dealWithItQuickly(){ + ;//turn the led on? +} void LglSysexHandler(uint8 *midiBufferRx,uint32 *rx_offset,uint32 *n_unread_bytes) { + MIDI_EVENT_PACKET_t * midiPackets = (MIDI_EVENT_PACKET_t *) (midiBufferRx+(*rx_offset)); + uint8 nPackets=(*n_unread_bytes)-(*rx_offset); + int cPacket; + /********************************* ACHTUNG! ignores usbmidi cable ********************************/ + MIDI_EVENT_PACKET_t *packet; + for (cPacket=0;cPacket<nPackets;cPacket++){ + packet=midiPackets+cPacket; + if (!CIN_IS_SYSEX(packet->cin)) { + continue; + } // else { + switch (packet->cin) { + case CIN_SYSEX: + switch (sysexState) { + case NOT_IN_SYSEX : // new sysex. + sysexFinger=0; + if (packet->midi0 == MIDIv1_SYSEX_START) { + if (packet->midi1==MIDIv1_UNIVERSAL_REALTIME_ID + ||packet->midi1==MIDIv1_UNIVERSAL_NON_REALTIME_ID) { + if ((packet->midi2==myMidiChannel) + ||(packet->midi2==MIDIv1_UNIVERSAL_ALL_CHANNELS) + ) { + sysexState=YUP_ITS_MY_SYSEX; + sysexBuffer[sysexFinger++]=MIDIv1_SYSEX_START; + sysexBuffer[sysexFinger++]=packet->midi1; + sysexBuffer[sysexFinger++]=packet->midi2; + break; + } + } else if ((packet->midi1==myMidiID[0]) + && (packet->midi2==myMidiID[1]) + ){ + sysexState=COULD_BE_MY_SYSEX; + sysexBuffer[sysexFinger++]=MIDIv1_SYSEX_START; + sysexBuffer[sysexFinger++]=packet->midi1; + sysexBuffer[sysexFinger++]=packet->midi2; + break; + } + } + break; + + case COULD_BE_MY_SYSEX: + if (packet->midi0==myMidiID[2]) { + sysexState=YUP_ITS_MY_SYSEX; + sysexBuffer[sysexFinger++]=packet->midi0; + sysexBuffer[sysexFinger++]=packet->midi1; + sysexBuffer[sysexFinger++]=packet->midi2; + } else { + sysexState=ITS_NOT_MY_SYSEX; + sysexFinger=0; + } + break; + default: + break; + + } + + break; + case CIN_SYSEX_ENDS_IN_1: + case CIN_SYSEX_ENDS_IN_2: + case CIN_SYSEX_ENDS_IN_3: + sysexBuffer[sysexFinger++]=packet->midi0; + sysexBuffer[sysexFinger++]=packet->midi1; + sysexBuffer[sysexFinger++]=packet->midi2; + // sysexState=I_GOT_MY_SYSEX; + // flag it or something for retrieval later. + dealWithItQuickly(); + sysexFinger=0; + sysexState=NOT_IN_SYSEX; + + break; + default: + return; + } + //} + + + + } // its our sysex and we will cry if we want to return; }
\ No newline at end of file diff --git a/libmaple/MinSysex.h b/libmaple/MinSysex.h index 368eaa3..c882d74 100644 --- a/libmaple/MinSysex.h +++ b/libmaple/MinSysex.h @@ -5,6 +5,12 @@ // Created by Donald D Davis on 4/11/13. // Copyright (c) 2013 Suspect Devices. All rights reserved. // +#ifndef __LETS_MIN_SYSEX_H__ +#define __LETS_MIN_SYSEX_H__ 1 + + +#include "MidiSpecs.h" + #define LEAFLABS_MMA_VENDOR_1 0x7D #define LEAFLABS_MMA_VENDOR_2 0x1E @@ -14,4 +20,13 @@ #define DEFAULT_MIDI_DEVICE 0x0A #define DEFAULT_MIDI_CABLE 0x00 -void LglSysexHandler(uint8 *midiBufferRx,uint32 *rx_offset,uint32 *n_unread_bytes);
\ No newline at end of file +// eventually all of this should be in a place for settings which can be written to flash. +extern volatile uint8 myMidiChannel; +extern volatile uint8 myMidiDevice; +extern volatile uint8 myMidiCable; +extern volatile uint8 myMidiID[]; + + +void LglSysexHandler(uint8 *midiBufferRx,uint32 *rx_offset,uint32 *n_unread_bytes); + +#endif
\ No newline at end of file diff --git a/libmaple/usb/stm32f1/usb_midi_device.c b/libmaple/usb/stm32f1/usb_midi_device.c index efc7a9d..c38bbf1 100644 --- a/libmaple/usb/stm32f1/usb_midi_device.c +++ b/libmaple/usb/stm32f1/usb_midi_device.c @@ -350,6 +350,13 @@ static volatile uint8 transmitting = 0; /* Number of unread bytes */ static volatile uint32 n_unread_bytes = 0; + +// eventually all of this should be in a place for settings which can be written to flash. +volatile uint8 myMidiChannel = DEFAULT_MIDI_CHANNEL; +volatile uint8 myMidiDevice = DEFAULT_MIDI_DEVICE; +volatile uint8 myMidiCable = DEFAULT_MIDI_CABLE; +volatile uint8 myMidiID[] = { LEAFLABS_MMA_VENDOR_1,LEAFLABS_MMA_VENDOR_2,LEAFLABS_MMA_VENDOR_3,0}; + /* * Endpoint callbacks */ |
