1 changed files with 92 additions and 0 deletions
			
			
		| @ -0,0 +1,92 @@ | |||||
|  | #include <SoftwareSerial.h>
 | ||||
|  | 
 | ||||
|  | // RX, TX for MIDI out
 | ||||
|  | SoftwareSerial MIDI(10, 11);  | ||||
|  | 
 | ||||
|  | //button pin
 | ||||
|  | const int switchPin = 6; | ||||
|  | //rotary encoder pins
 | ||||
|  | const int encAPin = 4; | ||||
|  | const int encBPin = 5; | ||||
|  | 
 | ||||
|  | //for sending note-off once after button is released
 | ||||
|  | boolean btnOff = false; | ||||
|  | 
 | ||||
|  | //old rotary encoder value
 | ||||
|  | int encA = LOW; | ||||
|  | //read rotary encoder value
 | ||||
|  | int enc = HIGH; | ||||
|  | 
 | ||||
|  | void setup()   | ||||
|  | { | ||||
|  |   //printing baudrate
 | ||||
|  |   Serial.begin(9600); | ||||
|  |   //MIDI baudrate for software serial (pin 10 & 11)
 | ||||
|  |   MIDI.begin(31250); | ||||
|  |   //button and encoder pins as input
 | ||||
|  |   pinMode(switchPin, INPUT); | ||||
|  |   pinMode(encAPin, INPUT); | ||||
|  |   pinMode(encBPin, INPUT); | ||||
|  |   //activate pullup-resistors (read value is inverted, so LOW is active)
 | ||||
|  |   digitalWrite(switchPin, HIGH); | ||||
|  |   digitalWrite(encAPin, HIGH); | ||||
|  |   digitalWrite(encBPin, HIGH); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void loop() // run over and over
 | ||||
|  | { | ||||
|  |   //print incoming bytes on softwareserial, just for checking MIDI-in, worked
 | ||||
|  |   if (MIDI.available()) | ||||
|  |     Serial.println(MIDI.read()); | ||||
|  |    | ||||
|  |   //check if button is pressed
 | ||||
|  |   if (digitalRead(switchPin) == LOW) | ||||
|  |   {   | ||||
|  |     if (!btnOff) { | ||||
|  |       //send note on
 | ||||
|  |       midiSignal(144,60,100); | ||||
|  |       btnOff = true; | ||||
|  |     } | ||||
|  |   }   | ||||
|  |   if (digitalRead(switchPin) == HIGH) | ||||
|  |     { | ||||
|  |     //send note off
 | ||||
|  |     if (btnOff) { | ||||
|  |         midiSignal(128,60,0); | ||||
|  |         btnOff = false; | ||||
|  |     } | ||||
|  |   } | ||||
|  |    | ||||
|  |   //read encoder pin A
 | ||||
|  |   enc = digitalRead(encAPin); | ||||
|  |   //check if rotary encoder is turned
 | ||||
|  |   if ((encA == HIGH) && (enc == LOW)) { | ||||
|  |       //check direction of turning
 | ||||
|  |       if (digitalRead(encBPin) == HIGH) { | ||||
|  |          //send note on and note off directly, so signal is send on every turn 
 | ||||
|  |          midiSignal(144,62,100); | ||||
|  |          midiSignal(128,62,100); | ||||
|  |        } else { | ||||
|  |          //other direction, other note value
 | ||||
|  |          midiSignal(144,61,100); | ||||
|  |          midiSignal(128,61,100); | ||||
|  |        } | ||||
|  |    }  | ||||
|  |    //save "old" encoder value
 | ||||
|  |    encA = enc; | ||||
|  | } | ||||
|  | 
 | ||||
|  | //send MIDI signal through softwareserial
 | ||||
|  | void midiSignal(byte b1, byte b2, byte b3) { | ||||
|  |   //debug printing
 | ||||
|  |   Serial.print("send: "); | ||||
|  |   Serial.print(b1); | ||||
|  |   Serial.print(" | "); | ||||
|  |   Serial.print(b2); | ||||
|  |   Serial.print(" | "); | ||||
|  |   Serial.print(b3); | ||||
|  |   Serial.println(""); | ||||
|  |   MIDI.write(b1); | ||||
|  |   MIDI.write(b2); | ||||
|  |   MIDI.write(b2); | ||||
|  | } | ||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue