erschienen in: GO64! - Das Magazin für wahre Computerfreaks, Ausgabe 4/98
 

MIDIBASIC V5

von Rainer Buchty
MIDI ist heute mehr denn je ein Schlagwort. Jede PC-Soundkarte ist MIDI-kompatibel, was bedeutet, daß man mit ihrer Hilfe Synthesizer und Sampler quasi fernsteuern kann. Was heute kaum noch jemand weiß - auch für den C64 wurden einmal MIDI-Interfaces verkauft, denn (und das wissen noch viel weniger Leute) der C64 spielte noch vor 13 Jahren eine sehr große Rolle im Musikbusiness. Klangvolle Namen wie Emagic und Steinberg starteten ihre Karriere auf dem C64, bevor sie sich Atari ST, Mac und PC zuwandten. Heute fristet der einstmals so hochgelobte Musikcomputer ein Schattendasein und das MIDI-Interface verstaubt, denn es gibt kaum noch Software, die es unterstützt. Auch fehlt seit je her eine einfache Möglichkeit, das Interface anzusprechen - neidvoll blickt man da beispielsweise auf den Atari ST, dessen BASIC-Dialekt das eingebaute MIDI-Interface unterstützt. Aus diesen Gründen heraus entstand MIDIBASIC, welches neben einem speziellen MIDI-Befehlssatz SID-spezifische Befehle sowie einige immer wieder benötigte Anweisungen bietet.
 

Risiken und Nebenwirkungen...

Nahezu alle gängigen MIDI-Interfaces liegen im I/O1-Bereich und werden über die Adressen $DE04 bis $DE06 angesprochen - vorsicht: Hier liegt ein Adreßkonflikt mit den Ram Expansion Units (REU) vor. Bei Verwendung von MIDI-Software stets die REU vorher ausstecken!
 

Der Befehlssatz

MIDIBASIC wartet mit 44 neuen Befehlen auf, die sich in folgende Kategorien aufteilen:

(1) MIDI-Support
Für alle Befehle gilt:
  0<=c<=15 MIDI-Kanal
  0<=x<=127  Datum
an
Initialisiert das MIDI-Interface und startet die Empfangsroutine. Jedes empfangene Datenbyte löst einen Interrupt aus.

aUs
Schaltet das Interface und die Empfangsroutine ab.

bEnd c,v
Simuliert die Betätigung des Pitch-Bend-Wheels auf MIDI Kanal c, für den Wert von v gilt: v=64: Grundstellung (Nullpunkt) v<64: Pitch-Bending nach unten v>64: Pitch-Bending nach oben

bRc c,v
Simuliert den Breath-Controller

cln c,v
Hiermit wird auf Kanal c v-mal der NOTE-OFF-Befehl für die Tasten 0-127 gesendet. Dieser Befehl wurde implementiert, da nicht alle Geräte den ALL-NOTES-OFF-Befehl verstehen.

cPr c,v
Kanal-Aftertouch (Channel-Pressure)

cTrl c,ct,v
Mittels dieses Befehls kann ein beliebieger Controller ct erzeugt werden. Die Nummern einiger Controller sind dem Anhang zu entnehmen.

kEy c,k,v
Anschlag der Taste k auf Kanal c mit Anschlagstärke (Velocity) v

mOno c,v
Schaltet das auf Kanal c empfangende Gerät in den Mono-Mode. V gibt hierbei die Anzahl der benötigten Stimmen an, d.h. es werden auch die Kanäle c+1 bis c+v in den Mono-Mode geschaltet. Jeder dieser Kanäle ist nur monophon spielbar (Gitarren-Mono-Mode).

mWl c,v
Simuliert die Betätigung des Modulationsrades (modulation wheel)

noKey c,k,v
Loslassen der Taste k mit Release-Velocity v

oFf
Sendet den ALL-NOTES-OFF-Befehl

oMni c,1/0
Wählt bei dem auf Kanal c empfangenden Gerät den Omni-mode an (1) oder schaltet diesen ab (0). Ist der Parameter 1, so empfängt das Gerät auf allen 16 Kanälen, ist er 0, so empfängt es nur auf dem am Gerät eingestellten Kanal.

oUt c,b
Gibt ein Datenbyte b auf Kanal c aus. Mit diesem Befehl kann jeder andere Befehl emuliert werden (0<=b<=255).

pEdal c,v
Simuliert die Betätigung des Sustain-Pedals.

poLy c
Schaltet das auf Kanal c empfangende Gerät in den Poly-Modus

pPr c,k,v
Polyphoner Aftertouch der Taste k mit Stärke v

resEt
Sendet den RESET-Befehl; dieser Befehl wird nicht von allen Geräten erkannt.

vol c,v
Setzt die Lautstärke auf Kanal c auf den Wert v

var=usr(0)
Weist der Variablen var den Wert eines empfangenen Datenbytes zu. Da die eingehenden Daten gepuffert werden, ist der zugewiesene Wert nicht notwendigerweise das aktuelle Datenbyte. Ist seit der letzten Abfrage nichts empfangen worden, so wird var der Wert 255 zugewiesen.
 

(2) Utility
cls
Löscht den Bildschirm

col rf,hf,zf
Setzt die Farben für Rahmen (rf), Hintergrund (hf) und Zeichen (zf)

deVice d
Wählt Device d als aktives Gerät für LOAD, SAVE, VERIFY, DIR und FLOPPY. Ist d=1, so wird für DIR und FLOPPY Device 8 gesetzt. Es werden folgende Devices akzeptiert:
d=1: Datasette 8<=d<=11: Floppy 1-4

dir
Gibt das Directory des aktuellen Diskettenlaufwerks aus

exIt
Deaktiviert das MIDI-Interface, entfernt den Reset-Schutz und verläßt MIDIBASIC. Gegen ungewolltes Verlassen ist eine Sicherheitsabfrage eingebaut.

fKoff
Schaltet die F-Tasten-Belegung aus

fkon
Schaltet die F-Tasten-Belegung ein

flOppy "..."
Befehlsübermittlung an das aktuelle Diskettenlaufwerk

hElp
Gibt die Befehlsliste aus

loCate z,s
Positioniert den Cursor in Zeile z, Spalte s

oLd
Re-New

rePeat 1/0
Schaltet die automatische Tastenwiederholung ein (1) bzw. aus (0)

restArt
Initialisiert MIDIBASIC sowie das MIDI-Interface neu

stAtus
Gibt den Status des aktuellen Diskettenlaufwerkes aus
 

(3) SID-Support
aDsr v,a,d,s,r
Bestimmt die Hüllkurve für Stimme v; a, d, s und r können jeweils Werte von 0-15 annehmen.

fReq f
Stellt die Filterfrequenz ein, 0<=f<=2047

fMode m
Legt den Filtermodus fest, der Parameter fm (0<=m<=15) errechnet sich analog zum C64-Handbuch.

fq q
Bestimmt die Filterresonanz (0<=q<=15)

pw v,w
Bestimmt die Pulsbreite von Oszillator v bei eingestellter Pulswelle (0<=w<=4096)

siDres
Setzt den SID zurück

sWitch 0-15
Legt fest, welche Stimmen durch das Filter geleitet werden; der Parameter errechnet sich analog zum C64-Handbuch.

vOice v,k
Wählt für Oszillator v die Frequenz der MIDI-Taste k. Aufgrund des eingeschränkten Tonumfangs des SID kann k nur Werte von 0 bis 96 annehmen.

waVe v,w
Bestimmt die Wellenform des Oszillators v; w errechnet sich wie gewohnt.
 

Diese Befehle können wie das normale BASIC V2 gehandhabt werden, einzige Ausnahme: Hinter THEN einer IF-Anweisung muß ein Doppelpunkt vor einem MIDIBASIC-Befehl stehen, andernfalls wird dieser nicht erkannt. Wie die neuen Befehle abzukürzen sind, erkennt man an der Position des Großbuchstabens innerhalb des Befehlsnamens. Ein Befehl läßt sich nicht abkürzen, wenn kein Buchstabe groß geschrieben ist.
 

Speicherverwaltung

Benutzte Zeropage-Adressen
$00fb/$00fc  Zeiger für Schreiben der empfangenen Daten
$00fd/$00fe Zeiger für Lesen der empfangenen Daten
Speicheraufteilung (RAM)
$0801-$7fff freier BASIC-Speicher
$8000-$8a8b  MIDIBASIC (resetfest)
$8a8c-$9fff frei
$a000-$bfff modifiziertes BASIC V2
$c000-$dfff frei
$e000-$ffff MIDI-Datenpuffer

Anpassung von MIDIBASIC an eigene Bedürfnisse

Um die Startumgebung von MIDIBASIC an die eigenen Bedürfnisse anzupassen, wurde das Programm CONFIG.MBS geschrieben. Nach dem Laden und Starten von MIDIBASIC lädt und startet man CONFIG.MBS. Mit Hilfe dieses Programmes lassen sich Bildschirmfarben, F-Tastenbelegung und Tastenwiederholung sowie das nach dem Starten aktuelle Datenlaufwerk einstellen. Das veränderte MIDIBASIC wird dann unter neuem Namen gespeichert, ggf. ist das Programm LOADER.BAS an den neuen Namen anzupassen.
 

Anhang A: Übersicht über einige MIDI-Befehle

(1) Kanaldaten (x=0..f: Kanal 1..16)
 
Befehl  Datum 1 Datum 2 Bedeutung
$8x Taste Anschlag  Note off
$9x Taste Anschlag Note on
$Ax Taste Stärke Polyphonic Aftertouch
$Bx Controller Wert Controller (siehe unten)
$Cx Programm  - Program Change
$Dx Stärke - Channel Aftertouch
$Ex MSB LSB Pitch-Bend
(2) System Common Events (global, kanalunabhängig)
 
Befehl  Datum 1 Datum 2 Bedeutung
$F0 Hersteller-ID  Datenbytes...  SysEx-Datenübertragung
$F2 LSB MSB Sequencer-Positionierung auf Takt n (14 Bit)
$F3 Song Number Anwahl Song s (0-127)
$F6 - - Tune-Befehl
$F7 - - End of SysEx
$F8 - - Timing Clock (in play)
$FA - - Sequencer Start
$FB - - Sequencer Continue
$FC - - Sequencer Stop
$FD - - Timing Clock (in stop)
$FE - - Active Sensing
$FF - - System Reset

Anhang B: Übersicht über einige Controller

Controller  Wertebereich  Bedeutung
$01 $00-$7f Modulation Wheel
$02 $00-$7f Breath Controller
$04 $00-$7f Modulation Pedal
$05 $00-$7f Portamento Time
$06 $00-$7f Data Entry
$07 $00-$7f Volume
$40 $00/$7f Sustain off/on
$41 $00/$7f Portamento off/on
$60 $7f Data Entry +1
$61 $7f Data Entry -1
$7a $00/$7f Local Keyboard off/on
$7b $7f All notes off
$7c $00 Omni Mode off / Poly Mode on
$7d $00 Omni Mode on / Poly Mode off
$7e $0x Mono Mode on / Poly Mode off 
x = Anzahl benötigter Kanäle ab Startkanal
$7f $00 Modo Mode off / Poly Mode on