|  |  | @ -0,0 +1,49 @@ | 
			
		
	
		
			
				
					|  |  |  | #include <Wire.h>
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //helper to check if a bit is set
 | 
			
		
	
		
			
				
					|  |  |  | #define BIT_IS_SET(i, bits)  (1 << i & bits)
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //array for inputs on bank a of MCP23017 
 | 
			
		
	
		
			
				
					|  |  |  | boolean button[8]; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | void setup() { | 
			
		
	
		
			
				
					|  |  |  | 	//set MIDI bautdrate
 | 
			
		
	
		
			
				
					|  |  |  | 	Serial.begin(31250); | 
			
		
	
		
			
				
					|  |  |  | 	//start I2C
 | 
			
		
	
		
			
				
					|  |  |  | 	Wire.begin(); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | void loop() { | 
			
		
	
		
			
				
					|  |  |  | 	//0x20 hardware address of MCP23017 (A0,A1,A2 to ground)
 | 
			
		
	
		
			
				
					|  |  |  | 	Wire.beginTransmission(0x20); | 
			
		
	
		
			
				
					|  |  |  | 	Wire.write(0x12); // set MCP23017 memory pointer to GPIOA address
 | 
			
		
	
		
			
				
					|  |  |  | 	Wire.endTransmission(); | 
			
		
	
		
			
				
					|  |  |  | 	Wire.requestFrom(0x20, 1); // request one byte of data from MCP20317
 | 
			
		
	
		
			
				
					|  |  |  | 	int inputs = Wire.read(); | 
			
		
	
		
			
				
					|  |  |  | 	delayMicroseconds(10); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 	int i; | 
			
		
	
		
			
				
					|  |  |  | 	for(i=0;i<8;i++) { | 
			
		
	
		
			
				
					|  |  |  | 	//check if button is pressed
 | 
			
		
	
		
			
				
					|  |  |  | 		if (BIT_IS_SET(i,inputs)) { | 
			
		
	
		
			
				
					|  |  |  | 			//only send Note-on, when button was not pressed before
 | 
			
		
	
		
			
				
					|  |  |  | 			if(!button[i]) { | 
			
		
	
		
			
				
					|  |  |  | 				button[i] = true; | 
			
		
	
		
			
				
					|  |  |  | 				midiSignal(144,60+i,115); | 
			
		
	
		
			
				
					|  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  | 			//only send Note-off, when button was pressed before
 | 
			
		
	
		
			
				
					|  |  |  | 			if(button[i]) { | 
			
		
	
		
			
				
					|  |  |  | 				button[i] = false; | 
			
		
	
		
			
				
					|  |  |  | 				midiSignal(128,60+i,0); | 
			
		
	
		
			
				
					|  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  | 	}   | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //send MIDI signal through softwareserial
 | 
			
		
	
		
			
				
					|  |  |  | void midiSignal(byte b1, byte b2, byte b3) { | 
			
		
	
		
			
				
					|  |  |  | 	Serial.write(b1); | 
			
		
	
		
			
				
					|  |  |  | 	Serial.write(b2); | 
			
		
	
		
			
				
					|  |  |  | 	Serial.write(b2); | 
			
		
	
		
			
				
					|  |  |  | } |