Freitag, 22. Februar 2013

Musik - Schritt für Schritt (Teil 1)

Langweilige oder sich ständig wiederholende Tätigkeiten überlässt man gerne schon mal Anderen. In der elektronischen Musik gibt es dafür z.B. den Step-Sequenzer. Die Grundfunktion des Step-Sequenzers ist simple: in einstellbaren Schrittlängen ein Steuersignal an einen Tonerzeuger senden, der diesen dazu bewegt, einen Ton bzw. Tonfolge bestimmter Höhe, Lautstärke und Länge zu spielen – sich wiederholend und veränderbar, immer und immer wieder. 

Der Markt ist klein, die Anzahl der Anbieter übersichtlich, die Geräte sind entsprechend teuer. Was liegt also näher, als über einen Selbstbau nachzudenken?

Da ich keinen analogen Synthesizer besitze, bietet sich zum Austausch der Steuersignale das MIDI Protokoll an, zum Erzeugen dieser Signale mein neuestes „Spielzeug“, mit dem ich mich seit ein paar Wochen beschäftige: der Arduino Uno.


Erstes Ziel: die Hardware möglichst so festlegen, dass sie für einfache bis umfangreiche Softwareentwicklungen offen ist, ohne sie nachträglich umbauen zu müssen.

Hier das Arbeitsmodell (ich nenne es CSQ-1):



Beim Design habe ich mich etwas an aktuellen Step Sequenzer Modellen, wie Doepfer Dark TimeManikin Schrittmacher und Analogue Solutions Europa inspirieren lassen.

Register:
So bezeichne ich eine Einheit aus den Bedienelementen für 8 Steps, hier bestehend aus LEDs, Drehregler und Umschalter. Es gibt also 2 Register. Die LEDs zeigen wie üblich den aktuellen Step an. Sie sind zweifarbig und können auch für andere Statusanzeigen (Stop-Punkte, ...) genutzt werden. Als Drehregler nehme ich Encoder mit Tastfunktion. Die Tastfunktion kann z.B. zum Setzen von Stop und Jump genutzt werden.  Die Umschalter sollen On/Off/Skip für den jeweiligen Step einstellen. 

Instruction Panel:
So nenne ich die Ansammlung an Bedienelementen unterhalb der beiden Register. Über die 4 Umschalter soll man die Laufrichtung und Transponierung einstellen können. Über die Klaviatur kann die Tonhöhe eingegeben werden oder eine Patternauswahl erfolgen. Mit Hilfe des Displays können weitere Konfigurationen vorgenommen, gespeichert oder geladen werden. Zum Navigieren dienen die 6 Taster und der Encoder (ebenfalls mit Tastfunktion), der auch für die Geschwindigkeitseinstellung (Clock) genutzt wird.

Eine ganze Menge an Bedien- und Anzeigeelementen, die eine entsprechende Anzahl von I/O-Pins am Controller erfordern.

Kurz überschlagen:

31 LEDs, teils 2-farbig -----> 50 Pins
17 Encoder + Tastfunktion ---> 51 Pins
20 Umschalter ---------------> 40 Pins
Klaviatur -------------------> 12 Pins
Display + Taster ------------> 12 Pins
Ablaufsteuerungstaster ------>  3 Pins
                            ==========
                      Summe = 168 Pins

... etwas zu viel für meinen kleinen Arduino.

Multiplexen? 
Die Schalter und LEDs wären also nicht permanent mit einem Pin verbunden, sondern nur zeitweise und in geregelter Abfolge. Die Zustandsabfrage der Elemente durch den Controller erfolgt damit nicht parallel, sondern seriell. Das Mittel der Wahl sind Schieberegister oder sog. serielle Port-Expander. Ich versuche es mit dem SPI-Bus - der Geschwindigkeit wegen. 

Im ersten Entwurf sieht der Systemaufbau dann wie folgt aus:




Also erst einmal die SPI-Geschichte zum Laufen bringen. Bei den Bausteinen fällt meine Wahl auf den MCP23S17. 
Die Vorteile: 8 dieser Bausteine können 128 I/O-Pins zur Verfügung stellen. Da jeder Pin bis zu 25 mA Strom liefern bzw. abführen kann, können die LEDs ohne Treiberbaustein angeschlossen werden. Er besitzt interne Pull-Up-Widerstände, wodurch man sich bei Schaltern diese zusätzlichen Bauelemente sparen kann. Der MCP23S17 wird über den SPI-Bus mit dem Controller verbunden. Da man den Bausteinen feste 3-bit Adressen zuweisen kann, kann man die Chip Select Pins zusammenfassen und benötigt nur 4 I/O-Pins. Möchte man die Möglichkeit zum Reset haben und evtl. auch die beiden Interuptausgänge nutzen, belegt der SPI-Bus 7 Pins am Controller.

Beim Multiplexen bleiben die Encoder außen vor und werden direkt am Controller angeschlossen. Ich befürchte, dass sonst Impulse vom Encoder verloren gehen und die Drehrichtung evtl. nicht richtig ausgewertet werden kann. Auch die 6 I/O-Pins des Displays sollen direkt angeschlossen werden. Dadurch sind 40 I/O-Pins per se belegt. Die restlichen 128 Pins benötigen dank SPI-Bus am Controller nur 7 I/O-Pins.
Summa summarum werden 47 I/O-Pins benötigt.

Das Aus für den kleinen Arduino Uno - Upgrade: Arduino Mega 2560



Nach ein paar Entwurfsstunden mit Schaltplanzeichnen, wieder verwerfen, optimieren, und Gedanken-machen, ob eine gedruckte Schaltung oder eine Streifenrasterplatine ausreichend sei, kam endlich ein recht kompakter Entwurf zustande, bei dem alle 8 SPI-Bausteine auf einer Platine untergebracht sind, ohne unter einem Berg von Kabelbrücken zu ersaufen.

Auch das lästige Leiterbahnunterbrechen konnte ich Dank einer RE315-HP Laborkarte von Roth-Elektronik auf ein Minimum reduzieren.



Die Bedienelemente werden über 8-polige Pfostenleisten angeschlossen. Der SPI-Bus über einen 10-poligen Wannenstecker. Neben den 8 ICs sind lediglich noch 8 Entstörkondensatoren, die Vorwiderstände für die LEDs und die Steckkontakte auf der Platine.



Bevor ich jetzt den Adressierungsplan aufstelle, erst einmal die  Platine mit ICs bestücken, LEDs und Schalter anschließen und anschließend die Funktion testen.
[... wird fortgesetzt]