0% found this document useful (0 votes)
146 views3 pages

Arduino Midi Piano Pull Up

This document defines constants and variables for a 6x11 key MIDI keyboard. It initializes a 2D array to map keys to MIDI notes and sets up pin definitions for the rows and shift register. In the setup, it configures the pins and initializes the MIDI connection. The main loop scans each column, checks for key presses and releases, and sends MIDI note on/off messages accordingly.

Uploaded by

Rolando Nina
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
146 views3 pages

Arduino Midi Piano Pull Up

This document defines constants and variables for a 6x11 key MIDI keyboard. It initializes a 2D array to map keys to MIDI notes and sets up pin definitions for the rows and shift register. In the setup, it configures the pins and initializes the MIDI connection. The main loop scans each column, checks for key presses and releases, and sends MIDI note on/off messages accordingly.

Uploaded by

Rolando Nina
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 3

#define NUM_ROWS 6

#define NUM_COLS 11

#define NOTE_ON_CMD 0x90


#define NOTE_OFF_CMD 0x80
#define NOTE_VELOCITY 127

//MIDI baud rate


#define SERIAL_RATE 31250

// Pin Definitions

// Row input pins


const int row1Pin = 2;
const int row2Pin = 3;
const int row3Pin = 4;
const int row4Pin = 5;
const int row5Pin = 6;
const int row6Pin = 7;

// 74HC595 pins
const int dataPin = 8;
const int latchPin = 9;
const int clockPin = 10;

boolean keyPressed[NUM_ROWS][NUM_COLS];
uint8_t keyToMidiMap[NUM_ROWS][NUM_COLS];

// bitmasks for scanning columns


int bits[] =
{
B11111110,
B11111101,
B11111011,
B11110111,
B11101111,
B11011111,
B10111111,
B01111111
};

void setup()
{
int note = 31;

for(int colCtr = 0; colCtr < NUM_COLS; ++colCtr)


{
for(int rowCtr = 0; rowCtr < NUM_ROWS; ++rowCtr)
{
keyPressed[rowCtr][colCtr] = false;
keyToMidiMap[rowCtr][colCtr] = note;
note++;
}
}

// setup pins output/input mode


pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(row1Pin, INPUT);
pinMode(row2Pin, INPUT);
pinMode(row3Pin, INPUT);
pinMode(row4Pin, INPUT);
pinMode(row5Pin, INPUT);
pinMode(row6Pin, INPUT);

Serial.begin(SERIAL_RATE);
}

void loop()
{
for (int colCtr = 0; colCtr < NUM_COLS; ++colCtr)
{
//scan next column
scanColumn(colCtr);

//get row values at this column


int rowValue[NUM_ROWS];
rowValue[0] = !digitalRead(row1Pin);
rowValue[1] = !digitalRead(row2Pin);
rowValue[2] = !digitalRead(row3Pin);
rowValue[3] = !digitalRead(row4Pin);
rowValue[4] = !digitalRead(row5Pin);
rowValue[5] = !digitalRead(row6Pin);

// process keys pressed


for(int rowCtr=0; rowCtr<NUM_ROWS; ++rowCtr)
{
if(rowValue[rowCtr] != 0 && !keyPressed[rowCtr][colCtr])
{
keyPressed[rowCtr][colCtr] = true;
noteOn(rowCtr,colCtr);
}
}

// process keys released


for(int rowCtr=0; rowCtr<NUM_ROWS; ++rowCtr)
{
if(rowValue[rowCtr] == 0 && keyPressed[rowCtr][colCtr])
{
keyPressed[rowCtr][colCtr] = false;
noteOff(rowCtr,colCtr);
}
}
}
}

void scanColumn(int colNum)


{
digitalWrite(latchPin, LOW);

if(0 <= colNum && colNum <= 7)


{
shiftOut(dataPin, clockPin, MSBFIRST, B11111111); //right sr
shiftOut(dataPin, clockPin, MSBFIRST, bits[colNum]); //left sr
}
else
{
shiftOut(dataPin, clockPin, MSBFIRST, bits[colNum-8]); //right sr
shiftOut(dataPin, clockPin, MSBFIRST, B11111111); //left sr
}
digitalWrite(latchPin, HIGH);
}

void noteOn(int row, int col)


{
Serial.write(NOTE_ON_CMD);
Serial.write(keyToMidiMap[row][col]);
Serial.write(NOTE_VELOCITY);
}

void noteOff(int row, int col)


{
Serial.write(NOTE_OFF_CMD);
Serial.write(keyToMidiMap[row][col]);
Serial.write(NOTE_VELOCITY);
}

You might also like