Skip to content

Instantly share code, notes, and snippets.

@YuuichiAkagawa
Created October 6, 2015 15:41
Show Gist options
  • Save YuuichiAkagawa/58dfa6ad1fb7a979c241 to your computer and use it in GitHub Desktop.
Save YuuichiAkagawa/58dfa6ad1fb7a979c241 to your computer and use it in GitHub Desktop.
#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