Hi Leute!
Ich brauch mal eure programier Hilfe!
Ich bin gerade dabei mir ein Midikeyboard aus den Tasten einer alten E-Orgel zu bauen.
(44 Tasten, 4x12 Matrix)
Im internet bin ich auf verschiedene Codes gestoßen, aus denen ich mir einen zusammengeschustert habe und so weit klappt auch alles ganz gut.
Bis jetzt kann mein Keyboard alle Töne von F2 bis C6 als Midi Signal ausgeben.
Mein Wunsch/Plan ist es jetzt zwei Knöpfe zu installieren, die die Oktaven verändern.
Die Knöpfe sollen also das komplette Keyboard entweder beliebig viele Oktaven höher( je nach dem wie oft man drückt) oder niedriger stimmen.
Da ich in Sachen Programmieren ein totaler Neuling bin, bitte ich euch nun um Lösungsvorschläge oder Tipps
Ich habe viel rumprobiert mit schaltern, was auch einigermaßen funktioniert hat, allerdings fände ich die Lösung mit Knöpfen den zwei Knöpfen doch um einiges cooler.
hier der Code mit dem ich arbeite:
#define NUM_ROWS 4
#define NUM_COLS 12
#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;
// 74HC595 pins
const int dataPin = 6;
const int latchPin = 7;
const int clockPin = 8;
boolean keyPressed[NUM_ROWS][NUM_COLS];
uint8_t keyToMidiMap[4][12] =
{
36,37,38,39,
40,41,42,43,
44,45,46,47,
48,49,50,51,
52,53,54,55,
56,57,58,59,
60,61,62,63,
64,65,66,67,
68,69,70,71,
72,73,74,75,
76,77,78,79,
80,81,82,83,
};
// bitmasks for scanning columns
int bits[] =
{
B11111110,
B11111101,
B11111011,
B11110111,
B11101111,
B11011111,
B10111111,
B01111111
};
void setup()
{
// 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);
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);
// 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);
}
Hoffe ihr könnt mir helfen.
David