Skip to content

Instantly share code, notes, and snippets.

@YuuichiAkagawa
Last active October 6, 2015 15:15
Show Gist options
  • Save YuuichiAkagawa/72ae1d33e0f76f341e43 to your computer and use it in GitHub Desktop.
Save YuuichiAkagawa/72ae1d33e0f76f341e43 to your computer and use it in GitHub Desktop.
/*
* 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