Created
October 6, 2015 15:41
-
-
Save YuuichiAkagawa/58dfa6ad1fb7a979c241 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <usbh_midi.h> | |
#include <usbhub.h> | |
#ifdef dobogusinclude | |
#include <spi4teensy3.h> | |
#include <SPI.h> | |
#endif | |
USB Usb; | |
USBH_MIDI Midi(&Usb); | |
#define BUFSIZE 99 | |
volatile byte midiFlag = 0; | |
int timer1_counter; | |
//MIDI VARIABLES | |
byte recButtonID = 2; | |
byte recButton = 0; | |
byte recButtonState = 0; | |
unsigned long recStartTime = 0; | |
int recPointer = 0; | |
byte red = 5; | |
byte green = 6; | |
byte blue = 20; | |
byte rec[BUFSIZE + 1]; | |
unsigned long recTime[BUFSIZE + 1]; | |
long recButtonTimer = 0; | |
byte thresh = 0; | |
//byte thresh = 200; | |
byte recFlag = 0; | |
void setup() { | |
Serial.begin(115200); | |
setIntervalTimer(); | |
//Workaround for non UHS2.0 Shield | |
pinMode(7, OUTPUT); | |
digitalWrite(7, HIGH); | |
if (Usb.Init() == -1) { | |
while (1); //halt | |
}//if (Usb.Init() == -1... | |
delay( 200 ); | |
pinMode(recButtonID, INPUT_PULLUP); | |
pinMode(red, OUTPUT); | |
pinMode(green, OUTPUT); | |
pinMode(blue, OUTPUT); | |
digitalWrite(red, LOW); | |
digitalWrite(green, LOW); | |
digitalWrite(blue, HIGH); | |
} | |
void loop() { | |
uint8_t msg[4]; | |
uint8_t outBuf[3]; | |
uint8_t msgSize; | |
Usb.Task(); | |
/* Process midi data according to timer event for | |
* more accurate timing on playback. | |
*/ | |
if (midiFlag == 1) { | |
if (recButtonState == 1) { | |
/* If max record length is reached, automatically | |
* start playing. | |
*/ | |
if (recPointer >= (BUFSIZE - 1)) { | |
recButtonState = 2; | |
recFlag = 1; | |
digitalWrite(red, LOW); | |
digitalWrite(green, HIGH); | |
digitalWrite(blue, LOW); | |
} | |
else { | |
if ( Usb.getUsbTaskState() == USB_STATE_RUNNING ) { | |
int x = micros() - recStartTime; | |
msgSize = Midi.RecvData(outBuf); | |
if ( (msgSize) > 0 ) { | |
if (outBuf[0] < 240) { | |
Serial.print(recButtonState); | |
Serial.print(" "); | |
Serial.print(outBuf[0]); | |
Serial.print(" "); | |
Serial.print(outBuf[1]); | |
Serial.print(" "); | |
Serial.println(outBuf[2]); | |
recTime[recPointer] = x; | |
rec[recPointer] = outBuf[0]; | |
recPointer++; | |
recTime[recPointer] = x; | |
rec[recPointer] = outBuf[1]; | |
recPointer++; | |
recTime[recPointer] = x; | |
rec[recPointer] = outBuf[2]; | |
recPointer++; | |
} | |
} | |
} | |
} | |
} | |
if (recButtonState == 2) { | |
if (recFlag == 1) { | |
rec[recPointer] = 255; | |
recTime[recPointer] = micros() - recStartTime; | |
recStartTime = micros(); | |
recPointer = 0; | |
recFlag = 0; | |
digitalWrite(red, LOW); | |
digitalWrite(green, HIGH); | |
digitalWrite(blue, LOW); | |
} | |
byte f = 0; | |
// while ((micros() - recStartTime > recTime[recPointer]) && (f == 0)){ | |
while (f == 0) { | |
if (rec[recPointer] == 255) { | |
recStartTime = micros(); | |
recPointer = 0; | |
f = 1; | |
} | |
else { | |
msg[0] = rec[recPointer]; | |
recPointer++; | |
msg[1] = rec[recPointer]; | |
recPointer++; | |
msg[2] = rec[recPointer]; | |
recPointer++; | |
Midi.SendData(msg, 0); | |
Serial.print(recButtonState); | |
Serial.print(" "); | |
Serial.print(msg[0]); | |
Serial.print(" "); | |
Serial.print(msg[1]); | |
Serial.print(" "); | |
Serial.println(msg[2]); | |
} | |
} | |
} | |
noInterrupts(); | |
midiFlag = 0; | |
interrupts(); | |
} | |
/* Process Button Push | |
* | |
*/ | |
int b1 = !digitalRead(recButtonID); | |
delay(50); | |
if (micros() - recButtonTimer > 50000) { | |
if (b1 > thresh) { | |
recButtonTimer = micros(); | |
recButtonState++; | |
if (recButtonState > 2) { | |
recButtonState = 0; | |
} | |
if (recButtonState == 2) { | |
recFlag = 1; | |
digitalWrite(red, LOW); | |
digitalWrite(green, HIGH); | |
digitalWrite(blue, LOW); | |
} | |
else if (recButtonState == 0) { | |
digitalWrite(red, LOW); | |
digitalWrite(green, LOW); | |
digitalWrite(blue, HIGH); | |
} | |
else { | |
digitalWrite(red, HIGH); | |
digitalWrite(green, LOW); | |
digitalWrite(blue, LOW); | |
recStartTime = micros(); | |
recPointer = 0; | |
} | |
Serial.print("recButtonState:"); | |
Serial.println(recButtonState); | |
} | |
} | |
} | |
void setIntervalTimer() | |
{ | |
// initialize timer1 | |
noInterrupts(); // disable all interrupts | |
TCCR1A = 0; | |
TCCR1B = 0; | |
// Set timer1_counter to the correct value for our interrupt interval | |
//timer1_counter = 3036; // preload timer 65536-16MHz/256/1Hz | |
timer1_counter = 65473; // preload timer 65536-16MHz/256/1000Hz | |
TCNT1 = timer1_counter; // preload timer | |
TCCR1B |= (1 << CS12); // 256 prescaler | |
TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt | |
interrupts(); // enable all interrupts | |
} | |
ISR(TIMER1_OVF_vect) // interrupt service routine | |
{ | |
TCNT1 = timer1_counter; // preload timer | |
midiFlag = 1; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment