aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libmaple/MidiSpecs.h7
-rw-r--r--libmaple/MinSysex.c94
-rw-r--r--libmaple/MinSysex.h17
-rw-r--r--libmaple/usb/stm32f1/usb_midi_device.c7
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
*/