├── README.md ├── MidiPiano_PullDown └── MidiPiano_PullDown.ino └── MidiPiano_PullUp └── MidiPiano_PullUp.ino /README.md: -------------------------------------------------------------------------------- 1 | # ArduinoMidiPiano 2 | - Author: Evan Kale 3 | - Email: evankale91@gmail.com 4 | - Web: ISeeDeadPixel.com 5 | - Blog: evankale.blogspot.ca 6 | 7 | See a demo video here: 8 | 9 | Turn an old piano keyboard into a MIDI keyboard with the help of an Arduino! 10 | 11 | Blog post: 12 | http://evankale.blogspot.ca/2014/10/how-to-add-midi-port-to-keyboard.html 13 | 14 | Instructables post: 15 | http://www.instructables.com/id/Add-MIDI-port-to-Keyboard/ 16 | 17 | 18 | -------------------------------------------------------------------------------- /MidiPiano_PullDown/MidiPiano_PullDown.ino: -------------------------------------------------------------------------------- 1 | #define NUM_ROWS 6 2 | #define NUM_COLS 11 3 | 4 | #define NOTE_ON_CMD 0x90 5 | #define NOTE_OFF_CMD 0x80 6 | #define NOTE_VELOCITY 127 7 | 8 | //MIDI baud rate 9 | #define SERIAL_RATE 31250 10 | 11 | // Pin Definitions 12 | 13 | // Row input pins 14 | const int row1Pin = 2; 15 | const int row2Pin = 3; 16 | const int row3Pin = 4; 17 | const int row4Pin = 5; 18 | const int row5Pin = 6; 19 | const int row6Pin = 7; 20 | 21 | // 74HC595 pins 22 | const int dataPin = 8; 23 | const int latchPin = 9; 24 | const int clockPin = 10; 25 | 26 | boolean keyPressed[NUM_ROWS][NUM_COLS]; 27 | uint8_t keyToMidiMap[NUM_ROWS][NUM_COLS]; 28 | 29 | // bitmasks for scanning columns 30 | int bits[] = 31 | { 32 | B00000001, 33 | B00000010, 34 | B00000100, 35 | B00001000, 36 | B00010000, 37 | B00100000, 38 | B01000000, 39 | B10000000 40 | }; 41 | 42 | void setup() 43 | { 44 | int note = 31; 45 | 46 | for(int colCtr = 0; colCtr < NUM_COLS; ++colCtr) 47 | { 48 | for(int rowCtr = 0; rowCtr < NUM_ROWS; ++rowCtr) 49 | { 50 | keyPressed[rowCtr][colCtr] = false; 51 | keyToMidiMap[rowCtr][colCtr] = note; 52 | note++; 53 | } 54 | } 55 | 56 | // setup pins output/input mode 57 | pinMode(dataPin, OUTPUT); 58 | pinMode(clockPin, OUTPUT); 59 | pinMode(latchPin, OUTPUT); 60 | 61 | pinMode(row1Pin, INPUT); 62 | pinMode(row2Pin, INPUT); 63 | pinMode(row3Pin, INPUT); 64 | pinMode(row4Pin, INPUT); 65 | pinMode(row5Pin, INPUT); 66 | pinMode(row6Pin, INPUT); 67 | 68 | Serial.begin(SERIAL_RATE); 69 | } 70 | 71 | void loop() 72 | { 73 | for (int colCtr = 0; colCtr < NUM_COLS; ++colCtr) 74 | { 75 | //scan next column 76 | scanColumn(colCtr); 77 | 78 | //get row values at this column 79 | int rowValue[NUM_ROWS]; 80 | rowValue[0] = digitalRead(row1Pin); 81 | rowValue[1] = digitalRead(row2Pin); 82 | rowValue[2] = digitalRead(row3Pin); 83 | rowValue[3] = digitalRead(row4Pin); 84 | rowValue[4] = digitalRead(row5Pin); 85 | rowValue[5] = digitalRead(row6Pin); 86 | 87 | // process keys pressed 88 | for(int rowCtr=0; rowCtr