init repo
This commit is contained in:
commit
68dce97d9d
198
sketch.ino
Normal file
198
sketch.ino
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
/*
|
||||||
|
* @NAME: MIDI-Controller Arduino Nano Software
|
||||||
|
* @AUTHOR: <admin@gurkengewuerz.de> Gurkengewuerz
|
||||||
|
* @REVIEW: 08.06.2017
|
||||||
|
* @VCS: https://git.ita15b.de/schuetrumpf/midi_controller
|
||||||
|
*/
|
||||||
|
|
||||||
|
// http://computermusicresource.com/MIDI.Commands.html
|
||||||
|
boolean debug = false;
|
||||||
|
|
||||||
|
byte midi_cmd_key_on = 144;
|
||||||
|
byte midi_cmd_key_off = 128;
|
||||||
|
byte midi_cmd_controll = 176;
|
||||||
|
|
||||||
|
byte potis[] = {
|
||||||
|
16,
|
||||||
|
17,
|
||||||
|
18,
|
||||||
|
19
|
||||||
|
};
|
||||||
|
// http://www.wavosaur.com/download/midi-note-hex.php
|
||||||
|
byte midiNote[] = {
|
||||||
|
0x0C,
|
||||||
|
0x0D,
|
||||||
|
0x0E,
|
||||||
|
0x0F,
|
||||||
|
0x10,
|
||||||
|
0x11,
|
||||||
|
0x12,
|
||||||
|
0x13
|
||||||
|
}; // 8 notes
|
||||||
|
byte lastPotiStates[] = {
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
byte channel_count = 5;
|
||||||
|
byte channel_leds[] = {
|
||||||
|
8,
|
||||||
|
9,
|
||||||
|
10,
|
||||||
|
11,
|
||||||
|
12
|
||||||
|
};
|
||||||
|
byte channel_current = 1;
|
||||||
|
|
||||||
|
// Keypad
|
||||||
|
const byte ROWS = 3;
|
||||||
|
const byte COLS = 3;
|
||||||
|
|
||||||
|
int col[] = {
|
||||||
|
3,
|
||||||
|
15,
|
||||||
|
2
|
||||||
|
}; // Input
|
||||||
|
int row[] = {
|
||||||
|
6,
|
||||||
|
4,
|
||||||
|
5
|
||||||
|
}; // Output
|
||||||
|
|
||||||
|
int last_row = -1;
|
||||||
|
int last_cols = -1;
|
||||||
|
unsigned long last = millis();
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
pinMode(LED_BUILTIN, OUTPUT);
|
||||||
|
|
||||||
|
// LEDS
|
||||||
|
for (byte i = 0; i < channel_count; ++i) {
|
||||||
|
pinMode(channel_leds[i], OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < ROWS; i++) {
|
||||||
|
pinMode(row[i], OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < COLS; i++) {
|
||||||
|
pinMode(col[i], INPUT_PULLUP);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If Debug Mode: enter USB Mode
|
||||||
|
if (debug) {
|
||||||
|
Serial.begin(9600);
|
||||||
|
} else {
|
||||||
|
// MIDI baud rate 31250
|
||||||
|
Serial.begin(31250);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
for (int i = 0; i < channel_count; ++i) {
|
||||||
|
if (i == (channel_current - 1)) {
|
||||||
|
digitalWrite(channel_leds[i], HIGH);
|
||||||
|
} else {
|
||||||
|
digitalWrite(channel_leds[i], LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Potis abfragen
|
||||||
|
// TODO: Potis Testen
|
||||||
|
for (byte i = 0; i < (sizeof(potis) / sizeof(byte)); ++i) {
|
||||||
|
int val = getDebouncedAnalog(potis[i]);
|
||||||
|
int perc = map(val, 0, 1023, 0, 127);
|
||||||
|
// debugMsg("Poti (" + String(i) + "): " + String(potis[i]));
|
||||||
|
if (!(lastPotiStates[i] > perc - 3 && lastPotiStates[i] < perc + 3)) {
|
||||||
|
debugMsg("Poti => " + String(perc));
|
||||||
|
sendMIDI(midi_cmd_controll + channel_current, midiNote[i], perc);
|
||||||
|
lastPotiStates[i] = perc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < ROWS; i++) {
|
||||||
|
digitalWrite(row[0], HIGH);
|
||||||
|
digitalWrite(row[1], HIGH);
|
||||||
|
digitalWrite(row[2], HIGH);
|
||||||
|
digitalWrite(row[i], LOW);
|
||||||
|
for (int j = 0; j < COLS; j++) {
|
||||||
|
int col_scan = digitalRead(col[j]);
|
||||||
|
if (col_scan == LOW) {
|
||||||
|
keypress(i, j);
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void keypress(int i, int j) {
|
||||||
|
String val = "x";
|
||||||
|
|
||||||
|
debugMsg(String(i) + " => " + String(j));
|
||||||
|
|
||||||
|
if (last_row == i && last_cols == j && millis() - last < 150) {
|
||||||
|
val = "r";
|
||||||
|
debugMsg("MILLIS: " + String(last) + " / " + String(millis()) + " = " + String(millis() - last) + "ms");
|
||||||
|
last = millis();
|
||||||
|
} else if (i == 0 && j == 0) {
|
||||||
|
val = "1";
|
||||||
|
channel_current = 1;
|
||||||
|
} else if (i == 0 && j == 1) {
|
||||||
|
val = "2";
|
||||||
|
channel_current = 2;
|
||||||
|
} else if (i == 0 && j == 2) {
|
||||||
|
val = "3";
|
||||||
|
channel_current = 3;
|
||||||
|
} else if (i == 1 && j == 0) {
|
||||||
|
val = "4";
|
||||||
|
channel_current = 4;
|
||||||
|
} else if (i == 1 && j == 1) {
|
||||||
|
val = "5";
|
||||||
|
channel_current = 5;
|
||||||
|
} else if (i == 1 && j == 2) {
|
||||||
|
val = "6";
|
||||||
|
sendMIDI(midi_cmd_key_on + channel_current, midiNote[4], 0x45);
|
||||||
|
} else if (i == 2 && j == 0) {
|
||||||
|
val = "7";
|
||||||
|
sendMIDI(midi_cmd_key_on + channel_current, midiNote[5], 0x45);
|
||||||
|
} else if (i == 2 && j == 1) {
|
||||||
|
val = "8";
|
||||||
|
sendMIDI(midi_cmd_key_on + channel_current, midiNote[6], 0x45);
|
||||||
|
} else if (i == 2 && j == 2) {
|
||||||
|
val = "9";
|
||||||
|
sendMIDI(midi_cmd_key_on + channel_current, midiNote[7], 0x45);
|
||||||
|
}
|
||||||
|
|
||||||
|
debugMsg(val);
|
||||||
|
|
||||||
|
last = millis();
|
||||||
|
last_row = i;
|
||||||
|
last_cols = j;
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://forum.arduino.cc/index.php?topic=190305.msg1408310#msg1408310
|
||||||
|
int getDebouncedAnalog(const byte pin) {
|
||||||
|
static int previousReading = 0; // static is better than a global
|
||||||
|
int newReading = analogRead(pin);
|
||||||
|
if ((newReading - 1 > previousReading) || (newReading + 1 < previousReading)) {
|
||||||
|
previousReading = newReading;
|
||||||
|
}
|
||||||
|
|
||||||
|
return previousReading;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://www.arduino.cc/en/Tutorial/Midi
|
||||||
|
// cmd - pitch - velocity
|
||||||
|
void sendMIDI(byte statusByte, byte dataByte1, byte dataByte2) {
|
||||||
|
Serial.write(statusByte);
|
||||||
|
Serial.write(dataByte1);
|
||||||
|
Serial.write(dataByte2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void debugMsg(String msg) {
|
||||||
|
if (debug) {
|
||||||
|
Serial.println(msg);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user