Last active
October 6, 2015 15:15
-
-
Save YuuichiAkagawa/72ae1d33e0f76f341e43 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
/* | |
* A piezo transducer is wired to pins 19 and 18 to trigger | |
* cycling through the Record/Play/Stop modes. The code can | |
* be altered to also work with a simple push button. | |
*/ | |
#include <usbh_midi.h> | |
#include <usbhub.h> | |
#ifdef dobogusinclude | |
#include <spi4teensy3.h> | |
#include <SPI.h> | |
#endif | |
USB Usb; | |
USBH_MIDI Midi(&Usb); | |
IntervalTimer tmrMIDI; | |
volatile byte midiFlag = 0; | |
//MIDI VARIABLES | |
byte recButtonID = 19; | |
byte recButton = 0; | |
byte recButtonState = 0; | |
unsigned long recStartTime = 0; | |
int recPointer = 0; | |
byte red = 5; | |
byte green = 6; | |
byte blue = 20; | |
byte rec[3000+1]; | |
unsigned long recTime[3000+1]; | |
long recButtonTimer = 0; | |
byte thresh = 200; | |
byte recFlag = 0; | |
void setup() { | |
Serial.begin(38400); | |
//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); | |
pinMode(recButtonID - 1,INPUT_PULLUP); | |
pinMode(red,OUTPUT); | |
pinMode(green,OUTPUT); | |
pinMode(blue,OUTPUT); | |
digitalWrite(red,LOW); | |
digitalWrite(green,LOW); | |
digitalWrite(blue,HIGH); | |
tmrMIDI.begin(procMIDI, 1000); | |
} | |
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>=2999){ | |
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 = analogRead(recButtonID-1) - analogRead(recButtonID); | |
if (b1<0) b1 = -b1; | |
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.println(recButtonState); | |
} | |
} | |
} | |
void procMIDI(void){ | |
midiFlag = 1; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment