In seiner Funktionalität auf die Lehre in gestalterischen Studiengängen zugeschnitten... Schnittstelle für die moderne Lehre
In seiner Funktionalität auf die Lehre in gestalterischen Studiengängen zugeschnitten... Schnittstelle für die moderne Lehre
Der AS8 ist ein vier Step Hardware-Akkord-Sequencer. Er läuft synchron mit einer Sequencersoftware wie z.B. Ableton Live. Das spielerische Erforschen von Harmonien steht im Vordergrund.
Mein Ziel war es, einen Sequencer zu entwickeln, mit dem man auf spielerische Art und Weise Akkordfolgen bilden kann.
Traditionelle Sequencer senden oft nur eine Note pro Step, sprich der angesteuerte Synthesizer spielt seine Töne einstimmig. Es gibt Sequencer welche mehrere Noten, sogenannte Akkorde, per Step an Synthesizer senden, die Programmierung dieser ist oft mit Fleiß verbunden, außerdem werden Kenntnisse für die Bildung von Akkorden benötigt.
Der erste Schritt war die Entwicklung eines Papier-Prototyps um die Funktionsweise und den Funktionsumfang des Akkord-Sequencers zu klären. Nach der Vorstellung des Prototyps hat mich Stefan Hermann in Bezug zur technischen Realisierung beraten.
Durch eine 8 Bit Matrix soll der Sequencer die Möglichkeit bekommen zwischen 64 unterschiedlichen Akkorden zu unterscheiden. Sogenannte Präzisionsstifte werden eingesetzt um digitale Signale zu erzeugen. Acht Paare für jeden Step. Damit der Musiker weiß, an welchem Step der Sequencerlauf sich gerade befindet, kommen vier LEDs zum Einsatz. Das Gehäuse besteht aus Holz und Plexiglas. Die Akkorde sind aus Holz und besitzen einen Neodym-Magnet und werden vom Gehäuse angezogen um die Kontakte der Präzisionsprüfstifte, mit Hilfe von abgeschmirgeltem Stahlklebeband, zu schließen. Die Löcher für die Präzisionsstifte wurden ausgelasert. Das Gehäuse besteht aus zwei Ebenen Plexiglas um die Stifte zu justieren und zu stabilisieren. Die Befestigung der Prüfstifte ware eine große Herausforderung für mich. Letztendlich musste hierfür auch Heißkleber zum Einsatz kommen.
Technisch basiert der AS8 auf einem Teensy 3.1 Microcontroller. Die Eingänge wurden mit vier Multiplexern erweitert. Der Code für Midi-Sync stammt von [http://little-scale.blogspot.de/2011/08/how-to-deal-with-real-time-midi-beat.html](http://little-scale.blogspot.de/2011/08/how-to-deal-with-real-time-midi-beat.html „Sebastian Tomczak“)
Papierprototyp
Erste Umsetzung
byte counter;
byte CLOCK = 248;
byte START = 250;
byte CONTINUE = 251;
byte STOP = 252;
int pinC = 14;
int pinB = 15;
int pinA = 16;
int ledstep1 = 11;
int ledstep2 = 10;
int ledstep3 = 9;
int ledstep4 = 8;
int pinIn1 = 17;
int pinIn2 = 18;
int pinIn3 = 19;
int pinIn4 = 20;
int i = 0;
int buttonsM1[8];
int buttonsM2[8];
int buttonsM3[8];
int buttonsM4[8];
byte b1 =B111111;
byte b2 =B111111;
byte b3 =B111111;
byte b4 =B111111;
int velocity = 99;
int step = 0;
// Array für Akkorde, vorerst zum Teil für Präsentation gefüllt.
int datarray[46][4] = {
{60,62,66,0},
{64,68,71,0},
....
....
....
{52,55,59,62},
{57,60,64,0},
{64,68,71,0},
{60,62,66,0},
};
void setup(){
Serial.begin(9600);
pinMode(ledstep1, OUTPUT);
digitalWrite(ledstep1, LOW);
pinMode(ledstep2, OUTPUT);
digitalWrite(ledstep2, LOW);
pinMode(ledstep3, OUTPUT);
digitalWrite(ledstep3, LOW);
pinMode(ledstep4, OUTPUT);
digitalWrite(ledstep4, LOW);
usbMIDI.setHandleRealTimeSystem(RealTimeSystem);
pinMode(pinA,OUTPUT);
pinMode(pinB,OUTPUT);
pinMode(pinC,OUTPUT);
pinMode(pinIn1, INPUT_PULLUP);
pinMode(pinIn2, INPUT_PULLUP);
pinMode(pinIn3, INPUT_PULLUP);
pinMode(pinIn4, INPUT_PULLUP);
}
void loop(){
for (int a=0; a<2; a++){
for (int b=0; b<2; b++){
for (int c=0; c<2; c++){
Serial.print(a);Serial.print("\t");
Serial.print(b);Serial.print("\t");
Serial.print(c);Serial.print("\t");
digitalWrite(pinA,a);
digitalWrite(pinB,b);
digitalWrite(pinC,c);
// delay(30);
Serial.print("Bin= "); Serial.print(a+(b*2)+(c*4));
int myPosition= a+(b*2)+(c*4);
buttonsM1[myPosition]=digitalRead(pinIn1);
buttonsM2[myPosition]=digitalRead(pinIn2);
// bitSet(b1, digitalRead(pinIn1));
Serial.print("\t M1: ");
Serial.print(digitalRead(pinIn1));
Serial.print("\t M2: ");
Serial.print(digitalRead(pinIn2));
Serial.print("\t M3: ");
Serial.print(digitalRead(pinIn3));
Serial.print("\t M4: ");
Serial.print(digitalRead(pinIn4));
if (i < 8) {
i = i++;
} else {
i = 1;
}
if (digitalRead(pinIn1) == 0) {
bitSet(b1, i);
} else {
bitClear(b1, i);
}
if (digitalRead(pinIn2) == 0) {
bitSet(b2, i);
} else {
bitClear(b2, i);
}
if (digitalRead(pinIn3) == 0) {
bitSet(b3, i);
} else {
bitClear(b3, i);
}
if (digitalRead(pinIn4) == 0) {
bitSet(b4, i);
} else {
bitClear(b4, i);
}
Serial.print("\t B1: ");
Serial.print(b1);
Serial.print("\t B2: ");
Serial.print(b2);
Serial.print("\t B3: ");
Serial.print(b3);
Serial.print("\t B4: ");
Serial.println(b4);
}
}
}
Serial.println();
Serial.println(b2);
Serial.println();
// delay(10);
usbMIDI.read();
//Serial.println(velocity);
while (usbMIDI.read()){}
}
void RealTimeSystem(byte realtimebyte) {
if(realtimebyte == 248) {
counter++;
if(counter == 24) {
counter = 0;
step++;
//Serial.println(step);
if (step==1) {
digitalWrite(ledstep4, HIGH);
if (b4 > 1) {
usbMIDI.sendNoteOn(datarray[b4][1], velocity, 1);
usbMIDI.sendNoteOn(datarray[b4][2], velocity, 1);
usbMIDI.sendNoteOn(datarray[b4][3], velocity, 1);
usbMIDI.sendNoteOn(datarray[b4][4], velocity, 1);
}
}
if (step==2) {
digitalWrite(ledstep3, HIGH);
if (b3 > 1) {
usbMIDI.sendNoteOn(datarray[b3][1], velocity, 1);
usbMIDI.sendNoteOn(datarray[b3][2], velocity, 1);
usbMIDI.sendNoteOn(datarray[b3][3], velocity, 1);
usbMIDI.sendNoteOn(datarray[b3][4], velocity, 1);
}
}
if (step==3) {
digitalWrite(ledstep2, HIGH);
if (b2 > 1) {
usbMIDI.sendNoteOn(datarray[b2][1], velocity, 1);
usbMIDI.sendNoteOn(datarray[b2][2], velocity, 1);
usbMIDI.sendNoteOn(datarray[b2][3], velocity, 1);
usbMIDI.sendNoteOn(datarray[b2][4], velocity, 1);
}
}
if (step==4) {
digitalWrite(ledstep1, HIGH);
if (b1 > 1) {
usbMIDI.sendNoteOn(datarray[b1][1], velocity, 1);
usbMIDI.sendNoteOn(datarray[b1][2], velocity, 1);
usbMIDI.sendNoteOn(datarray[b1][3], velocity, 1);
usbMIDI.sendNoteOn(datarray[b1][4], velocity, 1);
}
}
}
if(counter == 12) {
digitalWrite(ledstep1 , LOW);
digitalWrite(ledstep2 , LOW);
digitalWrite(ledstep3 , LOW);
digitalWrite(ledstep4 , LOW);
usbMIDI.sendNoteOff(datarray[b1][1], 0, 1);
usbMIDI.sendNoteOff(datarray[b1][2], 0, 1);
usbMIDI.sendNoteOff(datarray[b1][3], 0, 1);
usbMIDI.sendNoteOff(datarray[b1][4], 0, 1);
usbMIDI.sendNoteOff(datarray[b2][1], 0, 1);
usbMIDI.sendNoteOff(datarray[b2][2], 0, 1);
usbMIDI.sendNoteOff(datarray[b2][3], 0, 1);
usbMIDI.sendNoteOff(datarray[b2][4], 0, 1);
usbMIDI.sendNoteOff(datarray[b3][1], 0, 1);
usbMIDI.sendNoteOff(datarray[b3][2], 0, 1);
usbMIDI.sendNoteOff(datarray[b3][3], 0, 1);
usbMIDI.sendNoteOff(datarray[b3][4], 0, 1);
usbMIDI.sendNoteOff(datarray[b4][1], 0, 1);
usbMIDI.sendNoteOff(datarray[b4][2], 0, 1);
usbMIDI.sendNoteOff(datarray[b4][3], 0, 1);
usbMIDI.sendNoteOff(datarray[b4][4], 0, 1);
}
if ( step == 4 ) {
step=0;
}
}
if(realtimebyte == START || realtimebyte == CONTINUE) {
counter = 0;
}
if(realtimebyte == STOP) {
}
}
Die Umsetzung des Prototyps war für mich eine intensive Lernerfahrung. Durch die gute Beratung seitens Stefan Hermann konnte ich die Realisierung des Projektes gezielt in Angriff nehmen. Es gab einige Durststrecken die zum Teil auch noch nicht überwunden sind. Ich werde das Projekt weiter voran treiben, da ich glaube, dass da noch einiges geht.