Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const int channel = 1; // global midi channel
- const int buttonPinL = 3; // set array rows with easy naming
- const int buttonPinR = 14; // set array colums with easy naming
- int buttonPin[buttonPinL][buttonPinR] = {
- {0, 3, 6, 9, 12, 26, 29, 32, 21, 18, 15, 41, 38, 35}, // 1.65v comparaor threshold buttons
- {1, 4, 7, 10, 24, 27, 30, 23, 20, 17, 14, 40, 37, 34}, // 3.3v comparator threshold buttons
- {2, 5, 8, 11, 25, 28, 31, 22, 19, 16, 13, 39, 36, 33 } // damper off buttons
- };
- volatile unsigned long timerA [14] = {0, 3, 6, 9, 12, 26, 29, 32, 21, 18, 15, 41, 38, 35}; // 1.65v comparaor timing
- volatile unsigned long timerB [14] = {1, 4, 7, 10, 24, 27, 30, 23, 20, 17, 14, 40, 37, 34}; // 3.3v comparaor timing
- volatile unsigned long timerPassed [14] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};// timeb-timea
- volatile boolean triggerA [14] = {0, 3, 6, 9, 12, 26, 29, 32, 21, 18, 15, 41, 38, 35};// timer validation used to trigger sound
- volatile boolean triggerB [14] = {1, 4, 7, 10, 24, 27, 30, 23, 20, 17, 14, 40, 37, 34};
- float maxVelocityTime = 30000; // my slowest amount of time passed between 1.65 and 3.3v threshold
- int velocity1;
- float velocityFloat1;
- float velocityFloatCorrected1;
- void int1 () // ISR for threshold time stamps 1.65v
- {
- if (!triggerA [0])
- {
- timerA [0] = micros () ;
- triggerA [0] = true ;
- }
- }
- void int2 () // // ISR for threshold time stamps 3.3v
- {
- if (triggerA [0] && !triggerB [0])
- {
- timerB [0] = micros () ;
- triggerB [0] = true ;
- }
- }
- void int3 ()
- {
- if (!triggerA [1])
- {
- timerA [1] = micros () ;
- triggerA [1] = true ;
- }
- }
- void int4 ()
- {
- if (triggerA [1] && !triggerB [1])
- {
- timerB [1] = micros () ;
- triggerB [1] = true ;
- }
- }
- void int5 () // ISR for threshold time stamps 1.65v
- {
- if (!triggerA [2])
- {
- timerA [2] = micros () ;
- triggerA [2] = true ;
- }
- }
- void int6 () // // ISR for threshold time stamps 3.3v
- {
- if (triggerA [2] && !triggerB [2])
- {
- timerB [2] = micros () ;
- triggerB [2] = true ;
- }
- }
- void int7 () // ISR for threshold time stamps 1.65v
- {
- if (!triggerA [3])
- {
- timerA [3] = micros () ;
- triggerA [3] = true ;
- }
- }
- void int8 () // // ISR for threshold time stamps 3.3v
- {
- if (triggerA [3] && !triggerB [3])
- {
- timerB [3] = micros () ;
- triggerB [3] = true ;
- }
- }
- void int9 () // ISR for threshold time stamps 1.65v
- {
- if (!triggerA [4])
- {
- timerA [4] = micros () ;
- triggerA [4] = true ;
- }
- }
- void int10 () // // ISR for threshold time stamps 3.3v
- {
- if (triggerA [4] && !triggerB [4])
- {
- timerB [4] = micros () ;
- triggerB [4] = true ;
- }
- }
- void int11 ()
- {
- if (!triggerA [5])
- {
- timerA [5] = micros () ;
- triggerA [5] = true ;
- }
- }
- void int12 ()
- {
- if (triggerA [5] && !triggerB [6])
- {
- timerB [5] = micros () ;
- triggerB [5] = true ;
- }
- }
- void int13 () // ISR for threshold time stamps 1.65v
- {
- if (!triggerA [6])
- {
- timerA [6] = micros () ;
- triggerA [6] = true ;
- }
- }
- void int14 () // // ISR for threshold time stamps 3.3v
- {
- if (triggerA [6] && !triggerB [6])
- {
- timerB [6] = micros () ;
- triggerB [6] = true ;
- }
- }
- void int15 () // ISR for threshold time stamps 1.65v
- {
- if (!triggerA [7])
- {
- timerA [7] = micros () ;
- triggerA [7] = true ;
- }
- }
- void int16 () // // ISR for threshold time stamps 3.3v
- {
- if (triggerA [7] && !triggerB [7])
- {
- timerB [7] = micros () ;
- triggerB [7] = true ;
- }
- }
- void int17 () // ISR for threshold time stamps 1.65v
- {
- if (!triggerA [8])
- {
- timerA [8] = micros () ;
- triggerA [8] = true ;
- }
- }
- void int18 () // // ISR for threshold time stamps 3.3v
- {
- if (triggerA [8] && !triggerB [8])
- {
- timerB [8] = micros () ;
- triggerB [8] = true ;
- }
- }
- void int19 ()
- {
- if (!triggerA [9])
- {
- timerA [9] = micros () ;
- triggerA [9] = true ;
- }
- }
- void int20 ()
- {
- if (triggerA [9] && !triggerB [9])
- {
- timerB [9] = micros () ;
- triggerB [9] = true ;
- }
- }
- void int21 () // ISR for threshold time stamps 1.65v
- {
- if (!triggerA [10])
- {
- timerA [10] = micros () ;
- triggerA [10] = true ;
- }
- }
- void int22 () // // ISR for threshold time stamps 3.3v
- {
- if (triggerA [10] && !triggerB [10])
- {
- timerB [10] = micros () ;
- triggerB [10] = true ;
- }
- }
- void int23 () // ISR for threshold time stamps 1.65v
- {
- if (!triggerA [11])
- {
- timerA [11] = micros () ;
- triggerA [11] = true ;
- }
- }
- void int24 () // // ISR for threshold time stamps 3.3v
- {
- if (triggerA [11] && !triggerB [11])
- {
- timerB [11] = micros () ;
- triggerB [11] = true ;
- }
- }
- void int25 () // ISR for threshold time stamps 1.65v
- {
- if (!triggerA [12])
- {
- timerA [12] = micros () ;
- triggerA [12] = true ;
- }
- }
- void int26 () // // ISR for threshold time stamps 3.3v
- {
- if (triggerA [12] && !triggerB [12])
- {
- timerB [12] = micros () ;
- triggerB [12] = true ;
- }
- }
- void int27 ()
- {
- if (!triggerA [13])
- {
- timerA [13] = micros () ;
- triggerA [13] = true ;
- }
- }
- void int28 ()
- {
- if (triggerA [13] && !triggerB [13])
- {
- timerB [13] = micros () ;
- triggerB [13] = true ;
- }
- }
- void setup ()
- { for (int j = 0; j < buttonPinL ; j++) {
- for (int i = 0; i < buttonPinR ; i++) {
- pinMode(buttonPin[j][i] , INPUT_PULLUP);
- triggerA [i] = false ;// timing debounce
- triggerB [i] = false ;
- }
- }
- attachInterrupt (buttonPin[0][0] , int1, RISING) ;
- attachInterrupt (buttonPin[0][1] , int3, RISING) ;
- attachInterrupt (buttonPin[0][2] , int5, RISING) ;
- attachInterrupt (buttonPin[0][3] , int7, RISING) ;
- attachInterrupt (buttonPin[0][4] , int9, RISING) ;
- attachInterrupt (buttonPin[0][5] , int11, RISING) ;
- attachInterrupt (buttonPin[0][6] , int13, RISING) ;
- attachInterrupt (buttonPin[0][7] , int15, RISING) ;
- attachInterrupt (buttonPin[0][8] , int17, RISING) ;
- attachInterrupt (buttonPin[0][9] , int19, RISING) ;
- attachInterrupt (buttonPin[0][10] , int21, RISING) ;
- attachInterrupt (buttonPin[0][11] , int23, RISING) ;
- attachInterrupt (buttonPin[0][12] , int25, RISING) ;
- attachInterrupt (buttonPin[0][13] , int27, RISING) ;
- attachInterrupt (buttonPin[1][0] , int2, RISING) ;
- attachInterrupt (buttonPin[1][1] , int4, RISING) ;
- attachInterrupt (buttonPin[1][2] , int6, RISING) ;
- attachInterrupt (buttonPin[1][3] , int8, RISING) ;
- attachInterrupt (buttonPin[1][4] , int10, RISING) ;
- attachInterrupt (buttonPin[1][5] , int12, RISING) ;
- attachInterrupt (buttonPin[1][6] , int14, RISING) ;
- attachInterrupt (buttonPin[1][7] , int16, RISING) ;
- attachInterrupt (buttonPin[1][8] , int18, RISING) ;
- attachInterrupt (buttonPin[1][9] , int20, RISING) ;
- attachInterrupt (buttonPin[1][10] , int22, RISING) ;
- attachInterrupt (buttonPin[1][11] , int24, RISING) ;
- attachInterrupt (buttonPin[1][12] , int26, RISING) ;
- attachInterrupt (buttonPin[1][13] , int28, RISING) ;
- }
- void loop () {
- byte offButton[14] = {2, 5, 8, 11, 25, 28, 31, 22, 19, 16, 13, 39, 36, 33};
- byte midiNote[14] = {60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73};
- for (int i = 0; i < buttonPinR ; i++) {
- offButton[i] = digitalRead(buttonPin[2][i]);
- if (triggerB [i]) // when both thresholds are proven process note
- {
- timerPassed [i] = (timerB [i] - timerA [i]);
- //Serial.println (timePassed1) ;
- velocityFloat1 = 127 * maxVelocityTime / timerPassed [i];
- if (velocityFloat1 > 127)
- {
- velocity1 = 127;
- }
- else
- {
- velocityFloatCorrected1 = sqrt(127 * velocityFloat1);
- velocity1 = velocityFloatCorrected1;
- }
- usbMIDI.sendNoteOn(midiNote[i], velocity1, 1);
- noInterrupts () ;
- triggerB [i] = triggerA [i] = false ;
- interrupts () ;
- }
- if ( offButton[i] == LOW) {
- usbMIDI.sendNoteOff(midiNote[i], 0, 1);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement