summaryrefslogtreecommitdiff
path: root/usb-midi/usb-midi.c
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2014-03-13 19:33:09 +0000
committerChristian Pointner <equinox@spreadspace.org>2014-03-13 19:33:09 +0000
commit75b81e47e350d88dcbfa0d60ae482aa2890a3797 (patch)
treeb3c8ff5a9fb2dc9b25a1d47b274954d827a6faea /usb-midi/usb-midi.c
parentadded midi example device (diff)
added one button to the simple midi controller
git-svn-id: https://svn.spreadspace.org/avr/trunk@252 aa12f405-d877-488e-9caf-2d797e2a1cc7
Diffstat (limited to 'usb-midi/usb-midi.c')
-rw-r--r--usb-midi/usb-midi.c82
1 files changed, 61 insertions, 21 deletions
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();