Auf dieser Seite stelle ich Module und Hardware-Erweiterungen für den ZX Spectrum vor. Für den Aufbau sind gute Kenntnisse in der Elektronik und auch etwas Erfahrung erforderlich, denn obwohl die Spectrum-Computer recht robust sind, kann eine kleine Unachtsamkeit den Computer durchaus beschädigen. Bevor eine der folgenden Schaltungen an den Spectrum angeschlossen wird, sollte man alle Verbindungen genau prüfen und kontrollieren, dass keine Kurzschlüsse vorhanden sind. Ich hafte nicht für Schäden!
ZX Interface 2 - ROM-Modul mit 32 Speicherbänken |
ZX Spectrum 128k - MIDI-Kabel |
Next MIDI Box - MIDI-Interface für den ZX Spectrum Next |
Das ZX Interface 2 stellt neben 2 Joystickanschlüssen auch einen ROM-Port zur Verfügung, welcher unter einem Klappdeckel versteckt ist. Hier lassen sich Module mit Spielen einstecken, die den großen Vorteil haben, dass man beim Einschalten des Computers sofort losspielen kann. Insgesamt wurden 10 Spiele als ROM-Modul veröffentlicht, die allerdings gegenüber der Kassettenversion relativ teuer waren. Leider kommt man heute nur schwer an diese Module heran, aber das ist nicht schlimm, da man sich solch ein Modul selbst bauen kann. An dieser Stelle möchte ich auf die Seite www.fruitcake.plus.com verweisen, die viele Informationen über die damals erhältlichen ROM-Module und den Selbstbau von Modulen zur Verfügung stellt. Diese Seite hat mich auch zu meiner Modulversion inspiriert, welche mit einem 29F040 Flash-ROM bestückt ist und Platz für 32 ROM-Bänke bietet:
Das nebenstehende Bild zeigt den Schaltplan für das ROM-Modul. Die Technik ist relativ einfach erklärt: Alle Datenleitungen vom ROM-Port D0-D7 sind mit den gleichnamigen Anschlüssen des Flash-ROMs verbunden, ebenso die Adressleitungen A0-A13 sowie die Masse und die Stromversorgung +5V. Die beiden Adressleitungen A14 und A15 führen zu einem OR-Gatter (IC2), welches als Adressdecoder arbeitet. Der Ausgang führt zum ROM-Anschluss /CE und schaltet nur dann das ROM frei, wenn A14 und A15 auf Low-Pegel liegen. Somit arbeitet das ROM immer im Adressbereich von 0-3FFFH (0-16383) - ebenso wie das interne ROM des Spectrum. Damit es keine Konflikte mit diesem gibt, wird die Leitung ROMCS auf +5V gesetzt und damit das interne ROM des Spectrum abgeschaltet. Erwähnenswert ist noch die Leitung /MREQ - diese führt an /OE des ROMs und bewirkt, dass die Ausgänge des ROMs nur bei Speicherzugriffen aktiviert werden.
Im Gegensatz zu den originalen ROM-Modulen, die mit einem 16kB ROM bestückt sind, wird hier ein Flash-ROM mit einer Speicherkapazität von 512kB verwendet. Damit können 32 Speicherbänke mit jeweils
16kB realisiert werden. Zur Umschaltung der Speicherbänke werden die oberen Adressleitungen A14-A18 des Flash-ROM an Schalter geführt. Hier hat sich ein Codierschalter mit 16
Stellungen bewährt, der die aktuelle Schalterstellung als Hexadezimalwert ausgibt - also genau richtig zur Ansteuerung der Adressleitungen A14-A17. Die übrige Leitung
A18 kann über einen Dip-Schalter umgeschaltet werden. Somit stehen 2 Bereiche mit jeweils 16 Bänken zur Verfügung.
Anzahl | Bauteil | Nummer | Bemerkung |
---|---|---|---|
1 | IC 29F040B | IC1 | Flash-ROM, z.B. AM29F040B, DIP-Version |
1 | IC 74LS32 | IC2 | DIP-Version |
5 | Widerstand 5,6kΩ | R1-R5 | Metall |
2 | Kondensator 100nF | C1, C2 | Keramik |
1 | Kodierschalter | S1-S4 | Kodierschalter mit 16 Stufen, z.B. Reichelt „KMR 16“ |
1 | DIP-Schalter | S5 | Mini-DIP-Schalter, z.B. Reichelt „NT 02“ |
1 | IC-Fassung 32-polig | (IC1) | DIL 32-polig |
1 | IC-Fassung 14-polig | (IC2) | DIL 14-polig |
1 | Platinenmaterial | Lochraster-Platinenmaterial 2,54mm, ca. 50mm x 50mm | |
1 | Kontaktstreifen | kann von einer alten PC-ISA-Platine abgesaegt werden |
Anstatt des 29F040B können auch andere Flash-ROMs oder EPROMs verwendet werden, da die Anschlussbelegung meist kompatibel ist. Im Zweifelsfall sollte man das Datenblatt studieren. Ich habe mich für dieses Flash-ROM entschieden, weil es günstiger als ein vergleichbares EPROM ist. Außerdem lassen sich Flash-ROMs viel einfacher löschen und neu programmieren, sofern ein geeignetes Programmiergerät vorhanden ist.
Anstatt des Kodierschalters können auch einzelne Schalter verwendet werden, auch Kippschalter sind möglich. Hier muss man allerdings die gewünschte Speicherbank im Hexcode auswählen, was aber für den
echten Spectrum-Freund kein Problem darstellen sollte :-)
Ich habe das ROM-Modul auf einer kleinen Lochrasterplatine aufgebaut. Etwas problematisch ist der Steckverbinder: Hier hatte ich aus früherer Zeit passende Leiterstreifen zur Verfügung. Einer davon wurde einfach an die Lochrasterplatine angeklebt (mit Zweikomponenten-Kleber). Wer solche Leiterstreifen nicht zur Verfügung hat, kann diese von alten PC-ISA-Steckkarten recyceln. Am besten sind diejenigen dran, die selbst Platinen ätzen können. Hier werden die Streifen einfach ins Platinenlayout integriert. Auf der weiter oben genannten Seite wird ein Layout vorgestellt, welches aber etwas modifiziert werden müsste.
Damit die Platine möglichst klein wird, habe ich einige Bauteile unter dem ROM platziert. Das betrifft die 5 Widerstände und den Kondensator C1.
Dieses Bild zeigt das fertige Modul mit aufgestecktem ROM. Links neben dem ROM ist IC2 zu sehen und darüber befinden sich die Schalter zur Bankauswahl. Die Dip-Schalter gab es leider nur im
Doppelpack und so bleibt eben einer davon ungenutzt.
Hier ist die Leiterseite der Platine zu sehen. Zur Verdrahtung wurde 0,3mm Kupferlackdraht verwendet. Die Verarbeitung ist etwas gewöhnungsbedürftig, aber mit etwas Übung lässt sich auch das
schaffen. Alternativ kann man auch dünnen „Klingeldraht“ benutzen.
Jetzt muss noch das Flash-ROM mit Daten gefüllt werden, damit man das Modul verwenden kann. Dazu wird neben dem Datenfile ein Programmiergerät benötigt. Auf meinen Elektronik-Seiten stelle ich ein EPROM-Programmiergerät vor, welches auch den hier verwendeten 29F040B programmieren kann.
Den Inhalt der einzelnen Speicherbänke kann man beliebig zusammenstellen. Dazu muss man sich zunächst die benötigten ROM-Files beschaffen. Auf der bereits erwähnten Seite www.fruitcake.plus.com findet man neben den 10 Original-Spielen weitere ROMs wie z.B. Emulatoren für ZX80 und ZX81 oder Test-ROMs. Hat man die gewünschten ROMs im Binärformat, also als Datei mit 16384 Bytes Länge vorliegen, dann kann man diese auf folgende Weise zu einem EPROM-File zusammenkopieren:
- Windows-Eingabeaufforderung öffnen
- In das Laufwerk wechseln, wo die ROM-Files gespeichert sind, z.B.: d:
- Ins Verzeichnis wechseln, wo sich die ROM-Files befinden, z.B.: cd \spectrum\roms
- Es sollen beispielsweise die ROMs rom1.bin, rom2.bin, rom8.bin und rom7.bin verwendet werden.
- Eingabe: copy /b rom1.bin + rom2.bin + rom8.bin + rom7.bin eprom.bin
- Die erzeugte Datei eprom.bin muss jetzt in das Flash-ROM programmiert werden.
Ich hatte da schon mal etwas vorbereitet:
Bank 0 | Space Raiders |
Bank 1 | Masterchess |
Bank 2 | Planetoids |
Bank 3 | Hungry Horace |
Bank 4 | Backgammon |
Bank 5 | Horace & The Spider |
Bank 6 | Jet Pac |
Bank 7 | Pssst |
Bank 8 | Tranz Am |
Bank 9 | Cookie |
Bank A | ZX81 Emulator (für Spectrum 128k) |
Bank B | Sinclair System Test ROM Cartridge |
Bank C | Spectrum 128 RAM Tester |
Bank D | HDT-ROM (weitere Infos) |
Bank E | ISO-ROM (weitere Infos) |
Bank F | ZX Spectrum ROM (normales 48k ROM) |
Bei diesem ROM-File werden nur 16 der 32 verfügbaren Bänke genutzt. Leider sind hier ROM-Files enthalten, die nicht kopiert werden dürfen. Aus diesem Grund habe ich den ursprünglich vorhandenen Download-Link entfernt.
Der ZX Spectrum 128k und die Nachfolge-Modelle +2, +2A, +2B und +3 besitzen einen Anschluss für eine RS-232-Schnittstelle. Diese ermöglicht die Kommunikation mit anderen seriellen Geräten wie Computer, Modems oder Drucker. Diese Schnittstelle kann man auch für MIDI-Daten verwenden, allerdings nur in eine Richtung: Es ist nur das Senden von Daten möglich (MIDI Out). Leider verwendet Sinclair (und später auch Amstrad) die etwas unpraktischen Steckverbinder mit der Bezeichnung BT 631W (right-handed). Diese sind insbesondere in Deutschland fast nicht zu bekommen. Nur den ähnlichen Typ BT 631A kann man relativ günstig z.B. über Ebay kaufen. Damit lässt sich aber schon etwas anfangen, denn mit etwas Geschick lassen sich diese Stecker so bearbeiten, dass sie in die entsprechende Buchse am Spectrum passen. Am besten bestellt man gleich ein komplettes Kabel, dann erspart man sich das Crimpen und hat gleich 2 Stecker zur Verfügung. Hier sollte man unbedingt darauf achten, die 6-polige Kabelvariante zu bestellen.
Ich habe ein fertiges Kabel mit einer Länge von 3m und einem BT 631A Stecker an beiden Enden verwendet. Dieses wurde dann in der Mitte durchgeschnitten. Das nebenstehende
Bild zeigt auf der linken Seite einen solchen Stecker mit Kabel im Original und rechts daneben den gleichen Stecker nach der Bearbeitung. Hier wurde eine der Führungen mit einer Feile abgeschliffen
und so passt der Stecker nahezu perfekt in die eigentlich für den BT 631W vorgesehene Buchse des Spectrum 128k. Das Ergebnis sieht zwar nicht schön aus, funktioniert aber
hervorragend.
Für ein vollständiges MIDI-Kabel wird jetzt noch ein 5-poliger DIN-Stecker (180°) benötigt. Dieser wird entsprechend der nebenstehenden Schaltung an das Kabelende angelötet. Alternativ lässt sich
auch eine 5-polige Buchse oder Kupplung verwenden, dann braucht man allerdings noch ein MIDI-Patch-Kabel. Wie auch immer man sich entscheidet, wichtig ist der Widerstand R1 von 1kΩ. Die MIDI-Norm
sieht eine Stromschleife von 5 mA vor und berücksichtigt man den Ausgangspegel von 12V sowie den internen Widerstand von 1kΩ in der CTS-Leitung, dann passt das recht gut.
Die MIDI-Schnittstelle des ZX Spectrum 128k kann man übrigens im 128k BASIC verwenden. Hier gibt es den zusätzlichen Befehl PLAY, mit dem man Töne und Geräusche 3-stimmig über den internen AY-Soundchip abspielen kann. Mit entsprechender Programmierung werden die Notenwerte auch über MIDI ausgegeben und das funktioniert sogar mit bis zu 8 Stimmen gleichzeitig. Dazu muss ein geeignetes MIDI-Instrument angeschlossen werden, z.B. ein General MIDI Synthesizer. Falls ein solches Instrument nicht vorhanden sein sollte, dann genügt für den Einstieg ein preiswertes Gerät auf der Basis des IC SAM2695:
- GM-Minimodul
- GuMP - General midi player
- MIDI Synthesizer Unit von M5Stack (benötigt noch einen Optokoppler und einige Bauteile für MIDI In)
Wie schon erwähnt, kann man die MIDI-Schnittstelle im 128k-BASIC verwenden. Der Befehl PLAY wird sehr gut im Handbuch des ZX Spectrum 128k beschrieben, allerdings wird nur wenig auf die MIDI-Funktion eingegangen. Deshalb folgen hier einige ergänzende Informationen:
- Um die MIDI-Ausgabe zu aktivieren, muss in den Noten-String das Kommando Y und eine nachfolgende Zahl zwischen 1 und 16 eingefügt werden. Diese Zahl bestimmt den MIDI-Kanal, für den die nachfolgenden Noten bestimmt sind. Idealerweise sollte das Y-Kommando am Anfang des String stehen. Es kann aber an beliebiger Stelle verwendet werden, um z.B. den MIDI-Kanal zu wechseln.
- Insgesamt können 8 Strings definiert werden, um gleichzeitig 8 Stimmen über MIDI zu spielen. Dazu muss in jedem String mit dem Kommando Y der MIDI-Kanal festgelegt werden. Die Kanalnummern können dabei beliebig zwischen 1 und 16 gewählt werden. So kann man z.B. für Akkorde in 3 Strings den gleichen MIDI-Kanal verwenden. Weitere Strings nutzen dann andere MIDI-Kanäle für Bass, Melodie und Schlagzeug.
- Bei aktivierter MIDI-Ausgabe werden alle Noten über die MIDI-Kommandos Note On und Note Off an angeschlossene Instrumente gesendet. Dabei wird auch die mit dem String-Kommando V eingestellte Lautstärke berücksichtigt. Dieser Lautstärkewert (0-15) wird mit 8 multipliziert und dann im MIDI-Kommando Note On als Velocity-Byte (Anschlagstärke) ausgegeben. Auf die MIDI-Kommandos Note Off hat die Lautstärke keinen Einfluss, hier wird immer der Wert 64 als Release-Byte (Geschwindigkeit des Loslassens) ausgegeben.
- Ein weiteres String-Kommando Z steht zur Verfügung, um beliebige Bytes über MIDI auszugeben. Nach dem Z muss eine Zahl zwischen 0 und 255 folgen und genau diese Zahl wird dann als Byte über MIDI ausgegeben. Hier hat man alle Freiheiten, denn es können beliebige MIDI-Kommandos generiert werden, z.B. Program Change, Controller Change, Pitch Bend oder auch System Exclusive. Man sollte allerdings die MIDI-Datenstruktur kennen, denn unsinnige oder fehlerhafte MIDI-Kommandos richten zwar keinen Schaden an, führen aber auch nicht zum gewünschten Ergebnis.
- Wichtig: Das String-Kommando Z funktioniert nur, wenn die MIDI-Ausgabe zuvor mit dem String-Kommando Y aktiviert wurde. Allerdings gilt der mit Y gesetzte MIDI-Kanal nur für die Noten im String und nicht für das Z-Kommando. Hier muss beim Ermitteln des Wertes der MIDI-Kanal berücksichtigt werden.
Das Paket zx128-midi.zip enthält 3 Beispiele, mit denen die MIDI-Funktion getestet werden kann. Leider können einige der aktuellen Speicherlösungen wie DivIDE oder DivMMC nicht im 128k-BASIC arbeiten. Aus diesem Grund habe ich jedes Beispiel in 3 Varianten (BAS, TAP, SNA) erstellt und man muss probieren, was davon funktioniert. Die 3 Beispiele tun folgendes:
midi1 | Spielt ein kleines Demostück ab und verwendet dafür nur den AY-Soundchip. Hier erfolgt noch keine MIDI-Ausgabe. |
midi2 | Spielt das gleiche Stück über MIDI ab. Gegenüber dem AY-Sound von midi1 sollte ein deutlicher Unterschied zu hören sein. |
Crockett | Spielt den Song Crockett's Theme (Jan Hammer) 8-stimmig über MIDI ab. |
Noch mehr MIDI ist mit dem ZX MIDI Player möglich. Viel Spaß.
Please click here for the English version.
Der ZX Spectrum Next ist im Vergleich mit seinen Vorgängern mit relativ vielen Schnittstellen ausgestattet, MIDI-Anschlüsse wird man allerdings nicht finden. Die Hardware des Next bringt aber viele Voraussetzungen mit, um mit relativ wenig Aufwand einen vollwertigen MIDI-Anschluss nachzurüsten. Dazu gehören auch 2 UART-Einheiten (Universal Asynchronous Receiver Transmitter), die im normalen Betrieb für die Kommunikation mit dem WiFi-Modul (ESP8266) und dem Accelerator-Board (Raspberry Pi) zuständig sind. Über ein spezielles Next Register lassen sich die UART-Leitungen RX und TX auf die Joystick-Ports umrouten und stehen dort direkt zur Verfügung. Wichtig zu wissen: Der modifizierte UART kann jetzt nicht mehr das ursprüngliche Gerät (WiFi oder Accelerator) bedienen. Das ist aber kein Problem - nach einem Reset des ZX Spectrum Next wird der ursprüngliche Zustand wiederhergestellt.
Die MIDI-Schnittstelle arbeitet seriell und überträgt die Informationen über ein Leitungspaar mit einer Geschwindigkeit von 31250 Baud. Der Sender (MIDI OUT) bildet dabei eine Stromquelle, die im Empfänger (MIDI IN) die LED eines Optokopplers ansteuert. Am Ausgang des Optokopplers stehen die empfangenen Daten zur Verfügung und können ausgewertet und über eine weitere Stromquelle (MIDI THRU) an andere Geräte weitergegeben werden.
Das nebenstehende Bild zeigt die Schaltung für die Next MIDI Box, welche weitgehend der Empfehlung der MIDI Association folgt. Das Sendesignal vom Joystick-Anschluss 7 (UART TX) wird zunächst über 2 Logik-Inverter geführt und gelangt dann zur Buchse X2 (MIDI OUT). Die Inverter IC1.4 und IC1.5 dienen nicht nur als Treiber für den MIDI-Ausgang, sondern auch zur Pegelanpassung für das TX-Signal des Spectrum Next, welches mit 3,3V arbeitet. Ein weiterer Inverter IC1.6 dient als Treiber für die LED D1, die zur Kontrolle der Datenübertragung an MIDI OUT dient.
Auf der Empfängerseite gelangt das Signal von der Buchse X3 (MIDI IN) zur LED des Optokopplers IC2. Das Empfangssignal wird dann am Ausgang des Fototransistors (Pin 6) abgegriffen und zum
Joystick-Anschluss 9 (UART RX) geführt. Gleichzeitig geht dieses Signal über die Logik-Inverter IC1.1 und IC1.2 zur Buchse X4 (MIDI THRU) und ermöglicht die Ausgabe der empfangenen Daten an weitere
Geräte. Auch hier dient ein weiterer Inverter IC1.3 als Treiber für die LED D3 zur Kontrolle der empfangenen Daten an MIDI IN.
Falls man den Next nur als MIDI-File-Player verwenden möchte, dann kann auf den gesamten Schaltungsteil für den MIDI-Daten-Empfang verzichtet werden. Übrig bleiben die Bauteile IC1, D1, R1, R2, R3,
C1, C2, X1 und X2. Diese Schaltung kann in einem sehr kleinen Gehäuse untergebracht werden.
Beide Schaltpläne können auch als PDF-Datei geladen werden: next-midi-box.pdf.
Anzahl | Bauteil | Nummer | Bemerkung |
---|---|---|---|
1 | IC 74LS04 | IC1 | DIP-Version |
1 | IC 6N137 | IC2 | DIP-Version |
1 | LED Rot | D1 | beliebiger Typ |
1 | LED Grün | D3 | beliebiger Typ |
1 | Diode 1N4148 | D2 | |
5 | Widerstand 220Ω | R1, R2, R4, R6, R7 | Metall |
2 | Widerstand 1kΩ | R3, R8 | Metall, an LED D1 und D3 anpassen |
1 | Widerstand 4,7kΩ | R5 | Metall |
2 | Kondensator 100nF | C2, C3 | Keramik |
1 | Kondensator 10µF/16V | C1 | Elko radial |
1 | D-Sub-Buchse 9-polig | X1 | |
3 | DIN-Buchse 5-polig | X2-X4 | 180°, Printausführung |
Ein Hinweis zur D-Sub-Buchse: Die Joystick-Anschlüsse des ZX Spectrum Next sind so konstruiert, dass nur ein flacher D-Sub-Steckverbinder verwendet werden kann. Mit den handelsüblichen
Schalengehäusen passen die Stecker nicht, auch dürfen keine Sicherungsschrauben vorhanden sein. Ich habe hier eine Buchse mit Schneidklemm-Anschlüssen und ein Flachbandkabel verwendet. Alternativ
kann man ein fertiges Joystickkabel mit Stecker verwenden, welches man z.B. als Ersatzteil bei
Sintech bestellen kann.
Die gesamte Schaltung wurde auf einer Lochrasterplatine aufgebaut. Unschwer zu erkennen sind die 3 großen DIN-Buchsen am unteren Rand. Links und rechts daneben habe ich die beiden LEDs angeordnet. Hier war ich etwas verschwenderisch und habe 5mm RGB-LEDs verwendet, die gerade vorhanden waren. Bei der linken LED wurde nur die Farbe Rot (MIDI OUT) und bei der rechten LED die Farbe Grün (MIDI IN) genutzt. Es können hier beliebige LEDs verwendet werden, man kann diese auch einfach weglassen.
Für die Verbindung zum ZX Spectrum Next habe ich einen 10-poligen Wannenstecker verwendet, der sich auf der linken Platinenseite befindet. Hier wird später die Buchsenleiste in Schneidklemm-Technik
mit einem Flachbandkabel eingesteckt. Falls man sich hier für ein vorkonfektioniertes Joystickkabel entscheidet, braucht man die Steckverbinder nicht. In diesem Fall kann man die Kabeladern direkt
auf die Platine löten.
Dieses Bild zeigt die Platine von unten. Die meisten Verbindungen wurden mit verzinntem Kupferdraht (0,6mm) hergestellt. Für den Rest habe ich Kupferlackdraht (0,3mm) verwendet.
Auf diesem Bild wurde die Platine ins Gehäuseunterteil eingebaut. Ich habe ein Kunststoff-Gehäuse (123mm x 70mm x 30mm) verwendet, welches aus 2 Halbschalen besteht, die einfach zusammengesteckt werden können. Hier sind auch jeweils 4 Dome für die Auflage und Befestigung der Platine vorhanden. Passende Schrauben muss man allerdings selbst organisieren.
Für die DIN-Buchsen, die LEDs und das Kabel müssen passende Aussparungen gesägt bzw. gebohrt werden. Für LEDs und Kabel genügt die Bearbeitung der unteren Gehäusehälfte, bei den DIN-Buchsen muss auch
die obere Hälfte bearbeitet werden.
Hier ist die komplette Next MIDI Box mit dem Anschlusskabel zu sehen. Hier wäre ein wesentlich kleineres Gehäuse möglich, dieses war jedoch gerade nicht verfügbar.
Wie schon erwähnt, kann die Buchse für den Joystick-Anschluss nicht in ein Gehäuse eingebaut werden. Die hier verwendete Buchse in Schneidklemm-Technik lässt sich aber auch ohne Gehäuse gut greifen.
Noch ein Hinweis: Wenn eins der nachfolgenden MIDI-Programme auf dem ZX Spectrum Next gestartet wird, dann ist die MIDI-Funktion auf dem Joystick-Anschluss 2 aktiv und dort sollte die Next MIDI Box
auch angeschlossen werden. Es gibt allerdings eine Besonderheit: Der Next gibt serielle Daten immer an beiden Joystick-Anschlüssen aus, das Lesen von seriellen Daten funktioniert aber nur am aktiven
Anschluss. Das bedeutet in der Praxis, dass die Next MIDI Box an beiden Joystick-Anschlüssen verwendet werden kann, wenn nur Daten über MIDI OUT gesendet werden. Der Empfang über MIDI IN funktioniert
jedoch nur am Joystick-Anschluss 2.
Zurzeit gibt es 2 Anwendungen für die Next MIDI Box:
- Simple MIDI Monitor - Dieses in NextBASIC geschriebene Programm demonstriert den Empfang von Daten über MIDI IN, wertet diese aus und zeigt sie übersichtlich in Form einer Liste an.
- ZX MIDI Player - Dieser Player kann Standard-MIDI-Files auf dem ZX Spectrum 128 und auch auf einem ZX Spectrum Next über diese Box abspielen. Weitere Informationen sind auf der Seite Software zu finden.
Für diejenigen, die selbst mit MIDI am Next experimentieren möchten, stelle ich das Paket midiuart.zip zum Download zur Verfügung. Dieses enthält alle wichtigen Elemente, die für die MIDI-Kommunikation notwendig sind und auch 2 Beispiele. Der auf dem Bild dargestellte Programmteil ist für die Initialisierung der MIDI-Funktion zuständig.
In der Zeile 9010 wird der Joystick-Anschluss 2 (Joy 2) in den so genannten I/O-Modus gesetzt und der UART des WiFi-Moduls (UART0) auf diesen Anschluss umgeleitet. Die nächste Zeile bewirkt, dass die weitere Kommunikation mit dem UART0 erfolgt (UART0 und UART1 verwenden gemeinsame I/O-Ports). Außerdem werden die höchstwertigen 3 Bit (Bit 16, 15 und 14) für den Vorteiler gesetzt, die bei der MIDI-Baudrate von 31250 immer 0 sind. Zeile 9030 setzt die UART-Funktion zurück und löscht Sende- sowie Empfangspuffer. Die nächste Zeile stellt die Übertragung auf 8N1 (1 Startbit, 8 Datenbits, 1 Stoppbit; keine Parität) ein.
Bei der Einstellung der Baudrate gibt es noch eine Besonderheit. Der Takt für den UART wird vom Takt des Videosignals abgeleitet und dieser kann zwischen 27 MHz und 33 MHz liegen. Zunächst muss also
der aktuelle Video-Modus gelesen und die zugeordnete Taktfrequenz ermittelt werden. Das passiert ab Zeile 9050 und in Zeile 9140 kann der Wert für den
UART-Vorteiler berechnet werden. Dieser muss nun in 2 7-Bit-Werte umgerechnet werden, was in den Zeilen 9150 und 9160 passiert. Die beiden 7-Bit-Werte
werden dann in den Zeilen 9170 und 9180 nacheinander an den entsprechenden Port gesendet. Vorher ist es notwendig, den höherwertigen 7-Bit-Wert durch
Setzen von Bit 7 zu markieren.
Dieses Bild zeigt 3 Unterprogramme, die für die MIDI-Kommunikation zuständig sind. Mit dem Programm in den Zeilen 9200-9220 kann man ermitteln, ob der UART-Empfangspuffer Daten enthält. Dazu wertet man nach Aufruf des Unterprogramms die Variable %x aus. Hier bedeutet der Wert 0, dass der Puffer leer ist und der Wert 1, dass mindestens ein Byte über MIDI In empfangen wurde und abgeholt werden muss.
Mit dem Unterprogramm auf den Zeilen 9230-9250 wird ein Byte aus dem UART-Empfangspuffer gelesen und in der Variable %r übergeben. Das ist natürlich nur sinnvoll, wenn zuvor der UART-Empfangspuffer geprüft wurde und Daten vorhanden sind. Anderenfalls wird der Wert 0 zurückgegeben, welcher dann aber nicht von einem echten empfangenen 0-Wert unterschieden werden kann.
Das letzte Unterprogramm in den Zeilen 9270-9300 ist für das Senden eines Bytes über MIDI Out zuständig. Hier muss vor dem Aufruf das zu sendende Byte
in der Variable %t abgelegt werden. Vor der Ausgabe an den UART wird in Zeile 9280 zunächst geprüft, ob noch Platz im UART-Sendepuffer vorhanden ist
und gegebenenfalls gewartet.
Auf diesem Bild sind 2 Beispiele für die Übertragung von MIDI-Daten zu sehen. Das Programm ab Zeile 100 demonstriert den Empfang von Daten über MIDI In. Startet man das Programm mit GOTO 100, dann erfolgt zuerst die Initialisierung des UART für die MIDI-Funktion. In der Zeile 120 wird anschließend geprüft, ob der UART-Empfangspuffer Daten enthält. Liegen keine Daten vor, dann wird wieder zur Prüfung gesprungen und das Programm in einer Schleife ausgeführt. Anderenfalls holt die Zeile 140 ein Byte aus dem Puffer. Die nachfolgende Zeile gibt dieses Byte auf dem Bildschirm aus und die Schleife beginnt von vorn.
Das Programm ab Zeile 200 demonstriert das Senden von Daten über MIDI Out und startet ebenfalls mit der Initialisierung des UART. In den Zeilen 220-240 werden 3 Bytes gesendet, die folgendem MIDI-Kommando entsprechen: Note On, Kanal 1, Ton C4, Anschlag 127. Dann wird 200 ms gewartet und es erfolgt wiederum eine Sendung von 3 Bytes mit folgendem MIDI-Kommando: Note Off, Kanal 1, Ton C4, Loslassen 64. Beim Start des Programms mit GOTO 200 sollte ein an MIDI Out angeschlossenes MIDI-Instrument den Ton C4 (mittleres C) kurz anspielen.
Hinweis: Die Programm-Beispiele dienen nur zur Demonstration und sind nicht besonders performant. Insbesondere beim Empfang können Daten durch Überlaufen des UART-Puffers
verloren gehen.