aboutsummaryrefslogtreecommitdiff
path: root/libmaple/MinSysex.c
diff options
context:
space:
mode:
authorDonald Delmar Davis <don@suspectdevices.com>2013-04-17 17:58:34 -0700
committerDonald Delmar Davis <don@suspectdevices.com>2013-04-17 17:58:34 -0700
commitd00237f1bd8cf886d4b4662c7c4c2cb037e1a431 (patch)
tree9bf77e8e07cb7a07e0ac6c2d33717d9a01c9a593 /libmaple/MinSysex.c
parenta4b5f3e31c44c3d471683f20a5ccb35a018ae688 (diff)
Basic sysex parser to determine if its mine.
Diffstat (limited to 'libmaple/MinSysex.c')
-rw-r--r--libmaple/MinSysex.c94
1 files changed, 94 insertions, 0 deletions
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