summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usb-midi/Makefile2
-rw-r--r--usb-midi/usb-midi.c82
2 files changed, 62 insertions, 22 deletions
diff --git a/usb-midi/Makefile b/usb-midi/Makefile
index 08bbdb8..f7c6cd8 100644
--- a/usb-midi/Makefile
+++ b/usb-midi/Makefile
@@ -39,6 +39,6 @@ LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
LUFA_OPTS += -D USB_MANUFACTURER="L\"Radio Helsinki\""
LUFA_OPTS += -D USB_PRODUCT="L\"$(NAME)\""
-LUFA_COMPONENTS := USB USBCLASS
+LUFA_COMPONENTS := USB USBCLASS SERIAL
include ../include.mk
diff --git a/usb-midi/usb-midi.c b/usb-midi/usb-midi.c
index 47e06fa..c305462 100644
--- a/usb-midi/usb-midi.c
+++ b/usb-midi/usb-midi.c
@@ -37,6 +37,7 @@
#include <LUFA/Version.h>
#include <LUFA/Drivers/USB/USB.h>
#include "lufa-descriptor-midi.h"
+#include "LUFA/Drivers/Peripheral/Serial.h"
/** LUFA MIDI Class driver interface configuration and state information. This structure is
* passed to all MIDI Class driver functions, so that multiple instances of the same class
@@ -77,6 +78,21 @@ void EVENT_USB_Device_ControlRequest(void)
#include "util.h"
#include "led.h"
+static FILE serial_stream;
+
+#define KEY_PIN PINF
+#define KEY_PORT PORTF
+#define KEY_DDR DDRF
+#define KEY_BIT 0
+
+#define KEY_LP_MAX 255
+
+void key_init(void)
+{
+ KEY_DDR = KEY_DDR & ~(1<<KEY_BIT);
+ KEY_PORT |= (1<<KEY_BIT);
+}
+
int main(void)
{
MCUSR &= ~(1 << WDRF);
@@ -84,33 +100,57 @@ int main(void)
cpu_init();
led_init();
+ key_init();
+
+ Serial_Init(38400, 0);
+ Serial_CreateStream(&serial_stream);
+ stdin = stdout = stderr = &serial_stream;
+
USB_Init();
sei();
- uint8_t MIDICommand = MIDI_COMMAND_NOTE_ON;
+ MIDI_EventPacket_t MIDIEventOn = (MIDI_EventPacket_t)
+ {
+ .CableNumber = 0,
+ .Command = (MIDI_COMMAND_NOTE_ON >> 4),
+ .Data1 = MIDI_COMMAND_NOTE_ON | 0,
+ .Data2 = 0,
+ .Data3 = 0x7F,
+ };
+ MIDI_EventPacket_t MIDIEventOff = (MIDI_EventPacket_t)
+ {
+ .CableNumber = 0,
+ .Command = (MIDI_COMMAND_NOTE_OFF >> 4),
+ .Data1 = MIDI_COMMAND_NOTE_OFF | 0,
+ .Data2 = 0,
+ .Data3 = 0,
+ };
+
+ static uint8_t last_state = (1<<KEY_BIT);
+ static uint8_t lp_cnt = 0;
for(;;) {
MIDI_EventPacket_t ReceivedMIDIEvent;
- while(MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent)) { }
-
-
- _delay_ms(1000);
-
- led_on();
- MIDICommand = (MIDICommand!=MIDI_COMMAND_NOTE_ON) ? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF;
- MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t)
- {
- .CableNumber = 0,
- .Command = (MIDICommand >> 4),
-
- .Data1 = MIDICommand | 1,
- .Data2 = 0,
- .Data3 = 0,
- };
- MIDI_Device_SendEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent);
- MIDI_Device_Flush(&Keyboard_MIDI_Interface);
-
- led_off();
+ while(MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent)) {
+ led_on();
+ printf("%02X %02X %02X\r\n", ReceivedMIDIEvent.Data1, ReceivedMIDIEvent.Data2, ReceivedMIDIEvent.Data3);
+ led_off();
+ }
+
+ uint8_t state = KEY_PIN & (1<<KEY_BIT);
+ if(state != last_state)
+ lp_cnt++;
+ else
+ lp_cnt += lp_cnt ? -1 : 0;
+
+ if(lp_cnt >= KEY_LP_MAX) {
+ MIDI_EventPacket_t* MIDIEvent = state ? &MIDIEventOff : &MIDIEventOn;
+ MIDI_Device_SendEventPacket(&Keyboard_MIDI_Interface, MIDIEvent);
+ MIDI_Device_Flush(&Keyboard_MIDI_Interface);
+
+ last_state = state;
+ lp_cnt = 0;
+ }
MIDI_Device_USBTask(&Keyboard_MIDI_Interface);
USB_USBTask();