C 64
Musik-Kurs

Dem Klang auf der Spur (Teil 7)

Die praktische Anwendung der bisher erarbeiteten Kenntnisse steht im Mittelpunkt dieser Folge: Ein universelles Synthesizer-Programm bringt den SID auf Trab.

Die meisten modernen digitalen Synthesizer haben eine Gemeinsamkeit: eine fast unüberschaubare Vielzahl von Einstellmöglichkeiten. Das in den letzten Folgen beschriebene Programm Modulator ist da keine Ausnahme. Um die reichhaltigen Möglichkeiten auszuloten, die dieses Programm bietet, benötigt man ein komfortables Editorprogramm, sonst läßt die Motivation beim Jonglieren mit Bits, Bytes, PEEK und POKE bald nach. Ein solches Programm wird hier vorgestellt. Es zeigt die über 70 Parameter des SID und von Modulator, übersichtlich nach Funktionsgruppen geordnet, auf dem Bildschirm an und erlaubt einen schnellen Zugriff auf alle Einstellwerte. Diese Einstellwerte können geändert werden, während ein Ton klingt, so daß die Wirkung der Einstellung unmittelbar überprüft werden kann. Zudem kann man Töne im Bereich von zwei Oktaven direkt über die Tastatur anspielen. Dabei können zwar nicht mehrere Tasten gleichzeitig gespielt werden, man kann aber zwei oder drei SID-Stimmen mit einem Tastendruck gleichzeitig erklingen lassen. Darüber hinaus verwaltet das Programm 24 Parametersätze, im folgenden Sounds genannt, im Arbeitsspeicher. Diese 24 Sounds können als eine Datei von Diskette geladen, bearbeitet und wieder abgespeichert werden.

Wie man den Sound-Editor zum Laufen bringt

Das abgedruckte Programm kann man beim Listing-Service bestellen oder auch selbst abtippen, was bei 107 Blöcken leider etwas mühsam ist. Dabei kann man die Kommentare natürlich weglassen, denn man hat sie im Heft ja bereits vor sich. Man sollte dann aber trotzdem alle Zeilennummern eintippen, da viele Zeilen angesprungen werden, auch wenn sie nur Kommentare enthalten. Reine Kommentarzeilen kann man mit: »(Zeilennummer) REM« oder »(Zeilennummer) : « abkürzen. Man hüte sich aber davor, eine RENUMBER-Utility auf das Programm anzuwenden. Die meisten Sprünge werden nämlich nicht über die Basic-Befehle GOTO und GOSUB abgewickelt, sondern über zwei Maschinenprogramme GT und GS (darüber später mehr). Diesen Umstand kann eine RENUMBER-Utility natürlich nicht berücksichtigen.

Der Sound-Editor ist nur zusammen mit dem in Ausgabe 4/85 (MSE-Listing) und in Ausgabe 5/84 (Assembler-Listing) veröffentlichten Programm Modulator lauffähig. Dieses Programm muß auf Diskette als absolut zu ladende Datei (Bereich $0075 bis $C422) unter dem Namen »MODULATOR« vorliegen.

Im Programm Modulator steckt leider noch ein kleiner Bug: Es wird der Zeropage-Speicherplatz $FF verwendet, was hin und wieder den Basic-Interpreter stören kann. Wenn man statt $FF den vom Betriebssystem nicht verwendeten Speicherplatz $02 verwendet, treten keine Probleme mehr auf. Im Modulator-Code sind zehn Zeropage-Adressen von dieser Änderung betroffen. Die folgenden vier Basic-Zeilen enthalten die zehn Adressen und nehmen auch gleich die Änderung vor:

10FORI=1 TO 10
20READ AD:POKE AD,2:NEXT I
30DATA 49339,49344,49734,49744,50115
40DATA 50129,50162,50168,50173,50178

Der geänderte Modulator-Code sollte dann unter dem Namen »MODULATOR« auf Diskette zurückgespeichert werden. Jetzt müßte der Sound-Editor, sofern er fehlerfrei eingetippt wurde, laufen. Da es sich hier um ein Programm handelt, das überwiegend in Basic geschrieben ist, ist ein umfangreicher Setup-Teil, der etwa 30 Sekunden beansprucht, leider unvermeidbar. Das Warten wird dann allerdings durch Komfort und durchaus akzeptable Geschwindigkeit belohnt.

Mit 8 Menüs über 70 Parameter im Griff

Zum Verständnis der Parameter sei auf Ausgabe 4/85 verwiesen, wo die Funktionen der Modulatorkomponenten beschrieben sind. Der Sound-Editor meldet sich mit dem Hauptmenü (Bild 1) mit dem Namen MODULATOR. Damit soll betont werden, daß Modulator der eigentliche Kern des Programms ist. Der Sound-Editor wird ausschließlich über die Tastatur bedient, wobei sich die meisten Funktionen mit einem einzigen Tastendruck auslösen lassen. Es ist durchgehend das WYSIWYG-Konzept (What You See Is What You Get) verwirklicht, das heißt, alle in einer Situation verfügbaren Kommandos werden am Bildschirm angezeigt. Eine Ausnahme bilden die sieben Kommandos zur Auswahl der Untermenüs, die zwar nur im Hauptmenü angezeigt werden, aber auch in jedem Untermenü funktionieren. Man kann also direkt von einem Untermenü ins andere springen. Den Umweg über das Hauptmenü benötigt man eigentlich nur, wenn man die Kommandos nicht mehr weiß.

Bild 1. Hauptmenü

Das untere Drittel des Bildschirms ist in allen Menüs identisch. Es zeigt eine stilisierte Klaviatur über zwei Oktaven, der auf dem Computer die oberen beiden Tastenreihen entsprechen. Mit diesen Tasten kann man bis zu drei SID-Stimmen mit einem Tastendruck anspielen. Mit dem Kommando V und einer Ziffer 1, 2 oder 3 können die zu spielenden Stimmen aktiviert oder desaktiviert werden. Angezeigt wird das rechts neben der Klaviatur. Die Funktion SUSTAIN bewirkt, daß der Ton nach dem Loslassen einer Ton-Taste weiterklingt, sofern ein SUSTAIN-Pegel größer als Null eingestellt ist. Die GATE-Bits des SID werden bei aktivierter SUSTAIN-Funktion nicht zurückgesetzt. Mit dem Drücken der Space-Taste wird das GATE-Bit des Software-Hüllkurvengenerators (Soft-EG) gesetzt, durch Loslassen zurückgesetzt. Der Soft-EG wird also durch SPACE ausgelöst, vorausgesetzt, seine Parameter haben sinnvolle Werte. Das Auslösen des Soft-EG kann man mit Shift Space an die Tontasten koppeln, was bei den meisten Soft-EG-Anwendungen sinnvoll sein dürfte. Auch die SUSTAIN-Funktion und die Koppelung des Soft-EG werden rechts neben der Klaviatur angezeigt.

Die Beeinflussung der Parameter in den Untermenüs erfolgt nach einheitlichem Schema: Der zu ändernde Parameter wird mit den Cursor-Tasten angewählt und mit den f-Tasten verstellt. Je nach Anzahl der Parameter sind dabei alle vier Cursortasten oder nur die Tasten Cursor-Links und Cursor-Rechts wirksam. Auch die Funktionsweise der f-Tasten ist einheitlich: Numerische Parameter werden durch f1 und f7 in großer und durch f3 und f5 in kleiner Schrittweite verstellt. Bei nichtnumerischen Parametern wird die Funktion der f-Tasten am Bildschirm angezeigt.

Bei numerischen Parametern werden bis auf eine Ausnahme direkt die Werte der SID- oder Modulator-Register angezeigt. Bei der Ausnahme handelt es sich um die Basisfrequenzen der drei Stimmen (Bild 2, Parameter F). Bei dieser Basisfrequenz handelt es sich um die Frequenz des tiefsten spielbaren Tones (Taste Q). Sie wird nicht in Hertz, sondern in einer musikalisch sinnvollen Notation angegeben. Sie besteht aus Notennamen, einer Oktavnummer und einer Verstimmung in Cent. Die Oktavnummern bewegen sich im Bereich 0 bis 5. Dabei entspricht A 4 dem 440-Hz-Ton, der in der Musik korrekt »eingestrichenes a« heißt. Ein Cent ist ein hundertstel Halbton. Der Parameter bewegt sich von —49 bis +50. Die etwas komplizierte Berechnung der Basisfrequenz in Hz und in SID-Registerwerten findet man in den Programmzeilen ab 3110.

Alle anderen Sound-Parameter sind anhand der Menübilder, in denen sie auftreten (Bild 2 bis 6), leicht identifizierbar und bedürfen keiner weiteren Erläuterung.

Bild 2. Untermenü Stimmen-Parameter
Bild 3. Untermenü Filter/Lautstärke
Bild 4. Untermenü LFO
Bild 5. Untermenü Software-EG
Bild 6. Untermenü KSV

Im Menü SOUNDS (Bild 7) können ganze Parametersätze (jeweils 107 Byte, siehe auch Tabelle 4) mit Namen versehen und im Speicher abgelegt werden. Angewählt werden die Sounds hier nicht über die Cursor-Tasten, sondern über die Tastenkombinationen A1 bis C8. Die 24 Sounds sind alle mit der Parametereinstellung, die beim Programmstart vorliegt, vorbesetzt. Eine Gruppe von 24 Sounds kann im Menü DISK (Bild 8) auf Diskette abgespeichert und wieder geladen werden.

Bild 7. Untermenü Sounds
Bild 8. Untermenü Disk

Bemerkungen zum Programm

Es soll hier nicht die Arbeitsweise des Sound-Editors im Detail beschrieben, sondern nur einige Bemerkungen zum Stil des Programms gemacht werden. In dem Programm werden sehr viele Tastenkommandos akzeptiert, die in verschiedenen Menüs und bei den verschiedenen Parametern auch noch unterschiedliche Bedeutung haben. Um in dieser Situation die Übersicht zu behalten (Anliegen des Programmierers) und um das Programm trotz Realisierung in Basic akzeptabel schnell zu halten (Anliegen des Anwenders), werden die vielen Einzelroutinen von zentraler Stelle aus über variable Vektoren angesprungen. Zwar unterstützt Basic mit den Befehlen ON GOTO und ON GOSUB Mehrfachverzweigungen, diese sind aber bei der hier in Frage kommenden sehr großen Zahl von Sprungzielen schlecht einzusetzen. Die beiden Maschinenprogramme GS und GT (siehe auch Tabelle 2) erlauben dagegen (Unterprogramm-) Sprünge zu Zeilen, deren Nummer ein beliebiger arithmetischer Ausdruck oder eine Variable, der Sprungvektor, sein kann.

Die Tastenkommandos werden nun sehr schnell und auf einfache Weise interpretiert. Der ASCII-Code A der zuletzt gedrückten Taste und die Nummer M des gerade aktiven Menüs (0 bis 7) werden als Indizes in eine Sprungvektor-Tabelle V% verwendet. Der gefundene Eintrag ist die Zeilennummer der Routine, die den Tastendruck bearbeitet. Diese Routine wird als Unterprogramm aufgerufen. Für diesen Vorgang benötigt man nur einen einzigen Befehl: SYSGS,V%(M,A) (Zeile 1550).

Allen nicht definierten Tasten wird über die Tabelle der Sprungvektor 0 zugeordnet. Er führt in das leere Unterprogramm ganz am Anfang des Listings. Die Sprung-Tabelle wird über die Inhalte der DATA-Zeilen ab 9500 im Programm-Setup besetzt. Vierstellige DATAs stehen für Zeilennummern, dreistellige für ASCII-Codes, zweistellige wählen ein Menü (dabei bedeutet zum Beispiel M1 »Menü Nr. 1« und MA »alle Menüs«) und einstellige sind ASCII-Zeichen. »ENDE« schließt die Tabellen-DATAs ab. Der Programmteil ab Zeile 8110 interpretiert diese DATAs und besetzt die Tabelle.

Eine Ergänzung des Programms um weitere Funktionen gestattet sich mit diesem Konzept sehr einfach. Man schreibt ein Unterprogramm und trägt die Zeilennummer des Unterprogramm-Starts zusammen mit der Taste, durch die das Unterprogramm aufgerufen werden soll, in die Tabelle ein. Die Hardcopys entstanden auf diese Weise: Ab Zeile 7900 stand eine Hardcopy-Routine (im Listing hier nicht enthalten). Durch: 9760 DATA MA,7900,Z wurde bewirkt, daß in allen Menüs durch den Tastendruck Z ein Hardcopy-Ausdruck ausgelöst werden konnte.

Im Sound-Editor werden noch weitere Sprungvektoren angewendet: Eine f-Taste führt grundsätzlich in die Dummy-Routine (leeres Unterprogramm) oder in eine der vier Zeilen 2550, 2560, 2570, 2580. Dort wird ein aktueller numerischer Parameterwert erhöht oder erniedrigt. Anschließend wird in eine der 21 Routinen ab Zeile 2600 weiterverzweigt. Die zugehörige Vektorvariable ist PV. Die 21 Einzelroutinen bringen den geänderten Parameter an seinen Platz in ein SID- oder ein Modulator-Register und geben ihn zudem an der richtigen Stelle am Bildschirm aus.

Der Parameter-Vektor PV wird von Parameter-Anwahl-Routinen gesetzt, von denen es in jedem Menü für jede Parameterart eine gibt, zum Beispiel »Filterfrequenz« wählen, Zeile 5200. Der Aufruf einer Parameter-Anwahl-Routine wird durch die Cursor-Tasten ausgelöst und geschieht durch einen weiteren Vektor AV. Beispiel: »Parameterwahl durch Cursor«, Zeile 5130. Von diesen Cursor-Routinen gibt es fünf Ausführungen, für jedes Menü, in denen die Cursor-Tasten wirksam sind, eine.

Einige Maschinenprogramme machen den Sound-Editor schneller und übersichtlicher. Erwähnt seien dabei Unterprogramme zum Zugriff auf Doppelbytes von Basic aus (»DEEK« und »DOKE«). Das lästige Berechnen von Low- und High-Byte entfällt so. Der »PRINT AT«-Befehl gestattet es, den Cursor an jede Stelle des Bildschirms zu positionieren, um dort etwas auszugeben. Die Tabellen 1 bis 4 sollen eine kleine Dokumentation des Sound-Editors darstellen. Der Leser, der das Programm selbst modifizieren oder erweitern will (zum Beispiel andere oder mehr Farben), findet dort die gesuchte Information.

Das Tabellen- und Vektor-Konzept wird einen weiteren Ausbau des Programms sehr erleichtern. Das schon einmal angekündigte Sequenzer-Programm wird bis zum Ende dieses Kurses den Sound-Editor zu einem kompletten Synthesizer-Programm erweitern, mit dem man dann auch virtuose Melodien mit Modulator-Sounds spielen lassen kann.

(Thomas Krätzig/ev)
Real
A allgemeine Verwendung. ASCII-Codes
AD allgemeine Adresse
AN Auswahl-Nummer bei EG
(0=A 1=D 2=S 3=R 4=EGA)
AV Auswahl-Vektor bei Parameterwahl durch Cursor
B allgemeine Verwendung
CL Startadresse CLEAR (Zeile 0-14)
DO Startadresse DOKE
EG Status des Soft-EG (0 = abgekoppelt, —1 = angekoppelt)
F allgemeiner Farbcode
F1 Code für Normalfarbe
F2 Code für Hervorhebungsfarbe
FA Basisadresse Farb-RAM
GS Startadresse berechnetes GOSUB
GT Startadresse berechnetes GOTO
U,K allgemeine Laufvariablen
L Stringlänge
LN Nummer des aktuellen LFO
M aktuelles Untermenü (0 bis 7)
MO Basisadresse Modulator
NS Sound-Nummer (0 bis 23)
O Oktave (temporär) 0 bis 5
OF Tonhöhen-Offset (temporär) 49 bis +50
PA Parameter-Zieladresse
PB Farb-RAM-Adresse des aktuellen Parameterfeldes
PM Maximum+1 des aktuellen (numerischen) Parameters
PR Startadresse PRINT AT
PV Sprungvektor zur Weiterverarbeitung des aktuellen Parameters
PW Wert des aktuellen Parameters
P1 Schrittweite langsam
P2 Schrittweite schnell
RF RES/FILT Inhalt von SID $17
S Spalte allgemein
SA Sound-Adresse (Anfang eines Parameterblocks)
SI Basisadresse SID
SN Nummer dor aktuellen Stimme
SO Basisadresse Sounds
T Tonnummer (temporär) 0 — 11
X,Y allgemeine Verwendung
Z Zeile allgemein
ZN Zeilennummer allgemein

Strings
A$ Eingabezeichen, allgemeine Verwendung
F1$ Steuerzeichen Normalfarbe
F2$ Steuerzeichen Hervorhebungsfarbe
DN$ Dateiname

Zahlen-Arrays
AD(2) Attack/Decay für 3 Stimmen
BF(2) Basisfrequenz für 3 Stimmen
C(2) Controlbyte (GATE aus) für 3 Stimmen
C1(2) Controlbyte (GATE an) für 3 Stimmen
O(2) Oktaven für 3 Stimmen 0 bis 3
OF(2) Tonhöhen-Offset für 3 Stimmen -49 bis +50
S(2) Status der Stimmen (0 = inaktiv, —1 = aktiv)
SR(2) Sustain/Release für 3 Stimmen
T(2) Tonhöhen-Nummer für 3 Stimmen 0 bis 11
TH(24) relative Tonhöhen
TN%(255) Tonnummern (0 bis 24)
TN%(A) - Nummer des Tones bei Tastendruck CHR$(A)
V%(7,255) Sprungvektoren

String-Arrays
BL$(6) 0 bis 6 Blanks
KF$(3) LFO-Kurvenformen grafisch
KV$(3) Namen der LFO-Kurvenformen
MD$(3) Namen der Modulationsquellen-Modi: RESET, HOLD, RUN
TN$(11) Namen der Töne: C, C#, D, D#, E, F, F#, G, G#, A, A#, H
Tabelle 1. Variablen des Sound-Editors
Name Startadresse Aufruf Funktion
GS 828 SYSGS, Zeilennummer Berechnetes GOSUB
GT 857 SYSGT, Zeilennummer Berechnetes GOTO
PR 869 SYSPR, Zeile, Spalte, Printliste PRINT AT: Positioniert den Cursor an der Position Zeile (0-24), Spalte (0-39) und geht über zum Basic-PRINT
DO 897 SYSDO, Adresse, Wert DOKE: Doppelbyte-POKE Schreibt einen 16-Bit-Wert (0-65536) ab Adresse in den Speicher, niederwertiges Byte zuerst
USR 937 USR (Adresse) DEEK: Doppelbyte-PEEK Liefert 16-Bit-Wert der Speicherstellen-Adresse und Adresse +1
CL 959 SYSCL CLEAR: Löscht Bildschirm Zeilen 0-14
NA 50229 SYSNA, Adresse NAME: Ausgabe von 10 Zeichen, deren ASCII-Codes ab Adresse im Speicher stehen. Dient zur Ausgabe von Soundnamen
GE 50245 SYSGE, Adresse GET: Belegt SID und MODULATOR mit Parametersatz, der ab Adresse im Speicher steht (siehe Tabelle 4)
PU 50276 SYSPU, Adresse PUT: Kopiert Parameter von MODULATOR (aber keine SID-Parameter!) in Parameterblock ab Adresse (siehe Tabelle 4)
Alle hier aufgeführten Unterprogramme ermitteln ihre Parameter mit Hilfe des Basic-Interpreters. Es sind daher beliebige arithmetische Ausdrücke (beziehungsweise String-Ausdrücke bei PR) möglich. Es wird ein »Illegal Quantity Error« ausgelöst, wenn die Parameter ihren zugelassenen Bereich (0-255 beziehungsweise 0-65535) überschreiten.
Tabelle 2. Unterprogramme zum Sound-Editor in Maschinensprache
Zero-Page $02
$9B von MODULATOR benutzt
$FB-$FE
$9E-$9F von NA, GE und PU benutzt
USR-Vektor $311-$312 belegt mit Startadresse von DEEK ($03A9)
Kassetten-Puffer $33C-$3D4 Maschinenprogramme GS, GT, PR, DO, USR (DEEK), CL
Basic $0800-$08FF (obere Speichergrenze heruntergesetzt)
Sounds $9000-$9A07 24 Parameter-Blöcke à 107 Byte
Freier RAM-Bereich $C000-$C070 MODULATOR-Parameter
$C071-$C074 MODULATOR-interne Variablen
$C075-$C422 MODULATOR-Code
$C423-$C473 Maschinenprogramme NA, GE, PU
Tabelle 3. Speicherbelegung durch den Sound-Editor
Es werden 24 Parameter-Blöcke der Länge 107 Byte im Bereich $9000 bis $9A08 verwaltet.

Struktur eines Parameter-Blocks
RelativadresseParameterVariable in Basic (falls vorhanden)
dezimalhex
0 — 72$00 — $48Modulator-Parameterkeine
73 — 74$49 — $4ABasisfrequenz Stimme 1BF(2)
75$4BStatus Stimme 1
(0 = inaktiv, 1 = aktiv)
S(2)
76$4Cunbenutzt
77$4DControl Register Stimme 1C(2)
78$4EAttach/Decay Stimme 1AD(2)
79$4FSustain/Release Stimme 1SR(2)
80 — 86$50 — $56analog Stimme 2 (7 Byte)
87 — 93$57 — $5Danalog Stimme 3 (7 Byte)
94$5EResonanz/FilterRF
95$5FStatus des Soft-EG
(0 - abgekoppelt, 1 = angekoppelt)
EG
96$60Status Sustain
(0 = aus, 1 = an)
SU
97 — 106$61 — $6AName des Sounds (10 Byte)keine
Tabelle 4. Speicherung der Sound-Parameter
|
0 if a>1 then return :rem dummy-routine
1000 rem ******************************
1005 rem ***                        ***
1010 rem ***    sound - editor      ***
1015 rem ***                        ***
1020 rem ***  fuer die parameter    ***
1025 rem *** von sid und modulator  ***
1030 rem ***                        ***
1035 rem *** t. kraetzig      1985  ***
1040 rem ***                        ***
1045 rem ******************************
1050 rem
1055 rem falls von menue 7 gekommen,
1060 rem dorthin zurueck
1065 if m=7 then 7665
1070 rem
1120 rem modulator laden
1130 if a=0then a=1:load"modulator",8,1
1140 rem
1150 rem dimensionierungen
1155 poke 56,144:clr:rem b.-grenze $9000
1160 dim v%(7,255),tn%(255),th(24)
1165 dim bf(2),t(2),o(2),of(2),s(2)
1170 dim c1(2),c(2),ad(2),sr(2)
1175 dim bl$(6),kv$(3),kf$(6),md$(3)
1180 dim tn$(11)
1185 rem
1190 gosub 8000  :rem initialisierungen
1200 gosub 4000  :rem hauptmenue
1210 rem
1500 rem===============================
1510 rem hauptschleife, sprungverteiler
1520 rem===============================
1530 get a$:if a$="" then 1530
1540 a=asc(a$)
1550 sys gs,v%(m,a) :rem berechn. gosub
1560 goto 1530
2000 rem===============================
2010 rem noten spielen
2020 rem===============================
2025 poke 650,0
2030 f=th(tn%(a)):ad=mo+72:x=peek(ad)
2035 if s(0) then sysdo,mo   ,f*bf(0):poke si+4 ,c1(0)
2040 if s(1) then sysdo,mo+7 ,f*bf(1):poke si+11,c1(1)
2050 if s(2) then sysdo,mo+14,f*bf(2):poke si+18,c1(2)
2090 if eg then poke ad,x or 1
2110 if su then poke 650,128:return
2120 if peek(203)<>64 and peek(198)=0 then 2120
2130 poke ad,x and 254
2140 poke si+4 ,c(0)
2150 poke si+11,c(1):poke si+18,c(2)
2160 poke 650,128:return
2500 rem===============================
2510 rem numerische parameter aendern,
2520 rem verteiler einzelroutinen
2530 rem===============================
2550 pw=pw+p2:if pw>=pm then pw=pw-pm
2555 sysgt,pv
2560 pw=pw+p1:if pw>=pm then pw=pw-pm
2565 sysgt,pv
2570 pw=pw-p1:if pw< 0  then pw=pw+pm
2575 sysgt,pv
2580 pw=pw-p2:if pw< 0  then pw=pw+pm
2585 sysgt,pv
2600 rem-------------------------------
2605 rem lfof
2610 sysdo,pa,pw:l=len(str$(pw))
2620 syspr,3+ln,4,bl$(6-l);f2$;pw
2625 return
2630 rem-------------------------------
2635 rem lfop
2640 poke pa,pw:l=len(str$(pw))
2650 syspr,3+ln,11,bl$(4-l);f2$;pw
2655 return
2660 rem-------------------------------
2665 rem lfoa
2670 poke pa,pw:l=len(str$(pw))
2680 syspr,3+ln,16,bl$(4-l);f2$;pw
2685 return
2690 rem-------------------------------
2695 rem lfo kurve
2700 if a>136 or a<133 then return
2705 b=a-133  :rem b=0,1,2,3
2710 poke pa,(peek(pa)and231)or(b*8)
2715 syspr,3+ln,21,f2$;kv$(b)
2717 syspr,6   ,34,f2$;kf$(b):return
2720 rem-------------------------------
2725 rem lfo modus
2730 if a>135 or a<133 then return
2735 b=a-132  :rem b=1,2,3
2740 poke pa,(peek(pa)and249)or(b*2)
2745 syspr,3+ln,28,f2$;md$(b):return
2750 rem-------------------------------
2755 rem eg a d s r ega (an=0-4)
2760 poke pa,pw:l=len(str$(pw))
2765 syspr,7,s,bl$(4-l);f2$;pw:return
2770 rem-------------------------------
2775 rem eg form
2780 b=-(a>134):rem f1,f3 b=0 f5,f7 b=1
2785 poke pa,(peek(pa)and247)or(b*8)
2790 syspr,7,29,f2$;chr$(43+2*b)
2795 return
2810 rem-------------------------------
2815 rem eg modus
2820 if a>135 or a<133 then return
2825 b=a-132  :rem b=1,2,3
2830 poke pa,(peek(pa)and249)or(b*2)
2835 syspr,7,33,f2$;md$(b):return
2840 rem-------------------------------
2845 rem filter frequenz
2850 poke pa,pwand7:poke pa+1,int(pw/8)
2855 l=len(str$(pw))
2860 syspr,5,2,bl$(5-l);f2$;pw:return
2865 rem-------------------------------
2870 rem filter resonanz
2875 rf=(rf and 15)+16*pw:poke pa,rf
2880 l=len(str$(pw))
2885 syspr,5,9,bl$(3-l);f2$;pw:return
2890 rem-------------------------------
2895 rem filter schalter
2900 if a>136 or a<133 then return
2905 b=a-133  :rem b=0,1,2,3
2910 x=2^b:x1=255-x:rem masken
2915 y=rf and x
2920 rf=(rf and x1)or(x-y):poke pa,rf
2925 y=-128*(y=0):ad=1024+(5+b)*40+15
2930 for i=ad to ad+5
2935 : poke i,(peek(i)and127)or y
2940 next:return
2945 rem-------------------------------
2950 rem filter modus
2955 if a>136 or a<133 then return
2960 b=a-129  :rem b=4,5,6,7
2965 x=2^b:x1=255-x:rem masken
2970 pw=peek(pa):y=pw and x
2975 poke pa,(pw and x1)or(x-y)
2980 y=-128*(y=0):ad=1024+(1+b)*40+25
2985 for i=ad to ad+3
2990 : poke i,(peek(i)and127)or y
2995 next:return
3000 rem-------------------------------
3005 rem lautstaerke
3010 poke pa,(peek(pa) and 240) or pw
3015 l=len(str$(pw))
3020 syspr,5,31,bl$(3-l);f2$;pw:return
3050 rem-------------------------------
3052 rem basisfrequenz
3054 if a<>134 then 3064
3056 rem f3 offset erhoehen
3058 of=of+1:if of<=50 then 3110
3062 of=-49:goto 3076
3064 if a<>135 then 3074
3066 rem f5 offset erniedrigen
3068 of=of-1:if of>=-49 then 3110
3072 of=50:goto 3084
3074 if a<>133 then 3082
3076 rem tonnummer erhoehen
3078 t=t+1:if t<=11 then 3110
3080 t=0:goto 3090
3082 if a<>136 then return
3084 rem tonnummer erniedrigen
3086 t=t-1:if t>=0 then 3110
3088 t=11:goto 3096
3090 rem oktave erhoehen
3092 o=o+1:if o<=5 then 3110
3094 o=0:goto 3110
3096 rem oktave erniedrigen
3098 o=o-1:if o>=0 then 3110
3100 o=5:t=10
3110 rem basisfrequenz berechnen
3112 if t=11 and o=5 then t=0:o=0
3114 bf=440*2^(o-4+(t-9)/12+of/1200)
3116 o(sn)=o:t(sn)=t:of(sn)=of
3118 bf(sn)=bf*17.0327
3120 sysdo,mo+7*sn,f*bf(sn)
3122 rem anzeigen
3124 syspr,3+sn,3,f2$;o
3126 syspr,3+sn,2,tn$(t)
3128 syspr,3+sn,5,right$(" "+str$(of),3)
3130 return
3150 rem-------------------------------
3155 rem pulsweite stimme
3160 sysdo,pa,pw
3165 syspr,3+sn,9,f2$;right$("  "+str$(pw),4)
3170 return
3175 rem-------------------------------
3180 rem a
3185 ad(sn)=(ad(sn)and15) or pw*16
3190 poke pa,ad(sn)
3195 syspr,3+sn,14,f2$;right$(str$(pw),2)
3200 return
3205 rem-------------------------------
3210 rem d
3215 ad(sn)=(ad(sn)and240) or pw
3220 poke pa,ad(sn)
3225 syspr,3+sn,17,f2$;right$(str$(pw),2)
3230 return
3235 rem-------------------------------
3240 rem s
3245 sr(sn)=(sr(sn)and15) or pw*16
3250 poke pa,sr(sn)
3255 syspr,3+sn,20,f2$;right$(str$(pw),2)
3260 return
3265 rem-------------------------------
3270 rem r
3275 sr(sn)=(sr(sn)and240) or pw
3280 poke pa,sr(sn)
3285 syspr,3+sn,23,f2$;right$(str$(pw),2)
3290 return
3300 rem-------------------------------
3305 rem control (bit 7-s)
3310 if a<>133 and a<>134 then 3335
3315 rem bit setzen
3320 c(sn)=c(sn) or 2^(7-s)
3325 c1(sn)=c(sn) or 1
3330 syspr,3+sn,26+s,f2$;"1":goto 3355
3335 rem bit ruecksetzen
3340 c(sn)=c(sn) and 255-2^(7-s)
3345 c1(sn)=c(sn) or 1
3350 syspr,3+sn,26+s,f2$;"0"
3355 rem control-byte zum sid
3360 x=c(sn):if su then x=c1(sn)
3365 poke si+7*sn+4,x:return
3370 rem-------------------------------
3375 rem porta
3380 poke pa,pw:l=len(str$(pw))
3385 syspr,3+sn,34,bl$(4-l);f2$;pw
3390 return
3500 rem===============================
3510 rem stimme (des-)aktivieren
3520 rem===============================
3525 syspr,15,10,f2$;"stimme 1,2,3"
3530 get a$:if a$=""then 3530
3540 ifa$="1"ora$="2"ora$="3"then 3560
3550 goto 3590
3560 i=val(a$)-1 :s(i)=not s(i)
3570 if s(i) then print chr$(18);
3580 syspr,21,31+2*i,f1$;a$;chr$(146);
3590 syspr,15,10,f1$;"stimme 1,2,3"
3595 return
3600 rem===============================
3610 rem software-eg ausloesen
3620 rem===============================
3630 poke 650,64
3640 ad=mo+72:x=peek(ad):poke ad,x or 1
3650 if peek(203)<>64 and peek(198)=0 then 3650
3660 poke ad,xand254:poke650,128:return
3700 rem===============================
3710 rem software-eg an-/abkoppeln
3720 rem===============================
3730 eg=not eg
3740 if eg then print chr$(18);
3750 syspr,23,31,f1$;"soft-eg{rvof}":return
3800 rem===============================
3810 rem sustain-modus ein/aus
3820 rem===============================
3830 su=not su
3840 if su then print chr$(18);
3850 syspr,22,31,f1$;"sustain{rvof}"
3860 if not su then 2140
3870 return
4000 rem===============================
4010 rem hauptmenue
4020 rem===============================
4030 m=0:pv=0:syscl:print "{home}";f1$
4040 print" {CBM-A}CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC{CBM-S}"
4045 print" B{rvon}         m o d u l a t o r          {rvof}B"
4050 print" B{rvon}     thomas kraetzig       1985     {rvof}B"
4055 print" {CBM-Z}CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC{CBM-X}"
4100 syspr,6,1,f2$;"sh v";f1$;" stimmen"
4105 syspr,7,1,f2$;"   f";f1$;" filter/lautstaerke"
4110 syspr,8,1,f2$;"   l";f1$;" lfo"
4115 syspr,9,1,f2$;"   h";f1$;" huellkurve (soft-eg)"
4120 syspr,10,1,f2$;"   k";f1$;" ksv"
4125 syspr,11,1,f2$;"sh s";f1$;" sounds"
4130 syspr,12,1,f2$;"   d";f1$;" disk"
4135 return
4200 rem-------------------------------
4210 rem bild zeilen 15-23
4220 rem-------------------------------
4240 syspr,15,1, f2$;"v  1,2,3"
4245 syspr,15,10,f1$;"stimme 1,2,3
4250 syspr,15,26,f2$;"s"
4255 syspr,15,32,f1$;"sustain"
4260 syspr,16,1, f2$;"sh space"
4270 syspr,16,10,f1$;"eg (ab-)koppeln"
4280 syspr,16,26,f2$;"space"
4290 syspr,16,32,f1$;"eg gate"
4292 syspr,17,1, f2$;"x"
4294 syspr,17,10,f1$;"hauptmenue"
4300 syspr,19,0,f2$;
4310 for i=1 to 4
4320 : print" {rvon} B B B B B B B B B B B B B B {rvof}":next
4330 print" {rvon}qBwBeBrBtByBuBiBoBpB@B*B^B;B="
4340 syspr,19,0,;
4350 for i=1 to 2
4360 : print" {rght} {rght} {rght}{rght}{rght} {rght} {rght} {rght}{rght}{rght} {rght} {rght}{rght}{rght} {rght} {rght} ":next
4370 print" {rght}2{rght}3{rght}{rght}{rght}5{rght}6{rght}7{rght}{rght}{rght}9{rght}0{rght}{rght}{rght}-{rght}\{rght}c"
4380 syspr,19,31,f1$;"aktiv:"
4390 for i=0 to 2
4400 : a$=right$(str$(i+1),1)
4410 : gosub 3570:next i
4420 gosub 3840:gosub 3740
4430 return
4500 rem===============================
4505 rem untermenue stimme
4510 rem===============================
4515 m=1:pv=3050:syscl:print"{home}{rvof}";f1$
4520 print"     f    pw   a  d  s  r control porta"
4525 print" {CBM-A}CCCCCC{CBM-R}CCCC{CBM-R}CC{CBM-R}CC{CBM-R}CC{CBM-R}CC{CBM-R}CCCCCCC{CBM-R}CCCC{CBM-S}"
4530 for i=1 to 3
4535 print" B      B    B  B  B  B  B       B    B"
4540 next i
4545 print" {CBM-Z}CCCCCC{CBM-E}CCCC{CBM-E}CC{CBM-E}CC{CBM-E}CC{CBM-E}CC{CBM-E}{CBM-R}{CBM-R}{CBM-R}{CBM-R}{CBM-R}{CBM-R}{CBM-R}{CBM-E}CCCC{CBM-X}"
4550 syspr,7,26,"BBBBBB{CBM-Z}CCsync"
4555 syspr,8,26,"BBBBB{CBM-Z}CCring"
4560 syspr,9,1,f2$;"f1  ++";f1$
4565 syspr,9,26,"BBBB{CBM-Z}CCtest"
4570 syspr,10,1,f2$;"f3  +";f1$
4575 syspr,10,26,"BBB{CBM-Z}CCtrian"
4580 syspr,11,1,f2$;"f5  -";f1$
4585 syspr,11,26,"BB{CBM-Z}CCsawtooth"
4590 syspr,12,1,f2$;"f7  --";f1$
4595 syspr,12,26,"B{CBM-Z}CCsquare"
4600 syspr,13,26,"{CBM-Z}CCnoise"
4602 rem parameter anzeigen
4604 a$=f2$:f2$=f1$
4606 for sn=0 to 2
4608 : t=t(sn):o=o(sn):of=of(sn)
4610 : gosub 3122:rem f
4612 : pw=(usr(mo+7*sn+2)):gosub 3165
4614 : pw=int(ad(sn)/16)  :gosub 3195
4616 : pw=ad(sn)and15     :gosub 3225
4618 : pw=int(sr(sn)/16)  :gosub 3255
4620 : pw=sr(sn)and15     :gosub 3285
4622 : rem control-byte (7 bit)
4624 : b=c(sn):a=128
4626 : syspr,3+sn,26,f1$;"0000000"
4628 : for s=7 to 1 step -1
4630 : if(banda)thensyspr,3+sn,33-s,"1"
4632 : a=a/2:next s
4634 : pa=mo+7*sn+4:pw=peek(pa)
4636 : gosub 3370:rem porta
4638 next sn
4640 f2$=a$
4642 sn=0:av=4700:sysgs,av:return
4650 rem-------------------------------
4652 rem parameterwahl durch cursor
4654 rem hoch
4656 sn=sn-1:if sn<0 then sn=2
4658 gosub 5815:sysgt,av
4660 rem runter
4662 sn=sn+1:if sn>2 then sn=0
4664 gosub 5815:sysgt,av
4666 rem rechts
4668 if av<>4880 then 4674
4670 s=s+1:if s>6 then av=4910
4672 goto 4678
4674 av=av+30:if av>4910 then av=4700
4676 if av=4880 then s=0
4678 gosub 5815:sysgt,av
4680 rem links
4682 if av<>4880 then 4688
4684 s=s-1:if s<0 then av=4850
4686 goto 4692
4688 av=av-30:if av<4700 then av=4910
4690 if av=4880 then s=6
4692 gosub 5815:sysgt,av
4700 rem-------------------------------
4702 rem basisfrequenz waehlen
4704 pb=fa+40*(sn+3)+2
4706 for i=pb to pb+5:poke i,f2:next
4708 t=t(sn):o=o(sn):of=of(sn)
4710 pa=mo+7*sn:pv=3050:return
4730 rem-------------------------------
4732 rem pulsweite waehlen
4734 pb=fa+40*(sn+3)+9
4736 for i=pb to pb+3:poke i,f2:next
4738 pa=mo+7*sn+2:pw=usr(pa):pm=4096
4740 p1=1:p2=50:pv=3150:return
4760 rem-------------------------------
4762 rem attack waehlen
4764 pb=fa+40*(sn+3)+14
4766 poke pb,f2:poke pb+1,f2
4768 pa=si+7*sn+5:pw=int(ad(sn)/16)
4770 pm=16:p1=1:p2=1:pv=3175:return
4790 rem-------------------------------
4792 rem decay waehlen
4794 pb=fa+40*(sn+3)+17
4796 poke pb,f2:poke pb+1,f2
4798 pa=si+7*sn+5:pw=ad(sn)and15
4800 pm=16:p1=1:p2=1:pv=3205:return
4820 rem-------------------------------
4822 rem sustain waehlen
4824 pb=fa+40*(sn+3)+20
4826 poke pb,f2:poke pb+1,f2
4828 pa=si+7*sn+6:pw=int(sr(sn)/16)
4830 pm=16:p1=1:p2=1:pv=3235:return
4850 rem-------------------------------
4852 rem release waehlen
4854 pb=fa+40*(sn+3)+23
4856 poke pb,f2:poke pb+1,f2
4858 pa=si+7*sn+6:pw=sr(sn)and15
4860 pm=16:p1=1:p2=1:pv=3265:return
4880 rem-------------------------------
4882 rem control-byte waehlen
4884 pb=fa+40*(sn+3)+26+s
4886 poke pb,f2
4888 pa=si+7*sn+4:pv=3300:return
4910 rem-------------------------------
4912 rem porta waehlen
4914 pb=fa+40*(sn+3)+35
4916 for i=0 to 2:poke pb+i,f2:next
4918 pa=mo+7*sn+4:pw=peek(pa):pm=256
4920 p1=1:p2=10:pv=3370:return
5000 rem===============================
5005 rem untermenue filter/laut
5010 rem===============================
5015 m=2:pv=0:syscl:print"{home}{rvof}";f1$
5020 print" filter/lautstaerke"
5025 print" {CBM-A}CCCCC{CBM-R}CCCCC{CBM-R}CCCCCCCC{CBM-R}CCCCCCC{CBM-R}CCCC{CBM-S}"
5030 print" BfiltfB res BschalterB modus BlautB"
5035 print" {CBM-Q}CCCCC{SHIFT-+}CCCCC{SHIFT-+}CCCCCCCC{SHIFT-+}CCCCCCC{SHIFT-+}CCCC{CBM-W}"
5040 print" B     B     B filt1  B   lp  B    B"
5045 print" {CBM-Q}CCCCC{CBM-E}CCCCC{CBM-W} filt2  B   bp  {CBM-Q}CCCC{CBM-X}"
5050 print" B           B filt3  B   hp  B"
5055 print" B           B filtex B  3off B"
5060 print" {CBM-Z}CCCCCCCCCCC{CBM-E}CCCCCCCC{CBM-E}CCCCCCC{CBM-X}"
5065 print f2$;" f1";f1$;"    ++      filt1      lp    ++"
5070 print f2$;" f3";f1$;"    +       filt2      bp    +"
5075 print f2$;" f5";f1$;"    -       filt3      hp    -"
5080 print f2$;" f7";f1$;"    -       filtex    3off   --"
5085 pw=(peek(mo+21)and7)+8*peek(mo+22)
5090 syspr,5, 7-len(str$(pw)),pw
5095 pw=int(rf/16)
5100 syspr,5,12-len(str$(pw)),pw
5102 ifrfand1then syspr,5,15,"{rvon}filt1 {rvof}"
5104 ifrfand2then syspr,6,15,"{rvon}filt2 {rvof}"
5106 ifrfand4then syspr,7,15,"{rvon}filt3 {rvof}"
5108 ifrfand8then syspr,8,15,"{rvon}tiltex{rvof}"
5110 pw=peek(mo+23)
5112 ifpwand 16then syspr,5,25,"{rvon} lp {rvof}"
5114 ifpwand 32then syspr,6,25,"{rvon} bp {rvof}"
5116 ifpwand 64then syspr,7,25,"{rvon} hp {rvof}"
5118 ifpwand128then syspr,8,25,"{rvon}3off{rvof}"
5120 pw=peek(mo+23)and15
5122 syspr,5,34-len(str$(pw)),pw
5125 av=5200:sysgs,av:return
5130 rem-------------------------------
5135 rem parameterwahl durch cursor
5140 rem rechts
5145 av=av+50:if av>5400 then av=5200
5150 goto 5165
5155 rem links
5160 av=av-50:if av<5200 then av=5400
5165 gosub 5815:a=pb-fa-200
5170 if a<>15 and a<>25 then sysgt,av
5175 for j=1to3:pb=pb+40:gosub5815:next
5180 pb=pb-120:sysgt,av
5200 rem-------------------------------
5205 rem filterfrequenz anwaehlen
5210 pb=fa+203
5215 for i=pb to pb+3:poke i,f2:next
5220 pa=mo+21:pw=peek(pa)+8*peek(pa+1)
5225 pm=2048:p1=1:p2=50:pv=2850:return
5250 rem-------------------------------
5255 rem resonanz anwaehlen
5260 pb=fa+210
5265 poke pb,f2:poke pb+1,f2
5270 pa=si+23:pw=int(rf/16)
5275 pm=16:p1=1:p2=1:pv=2875:return
5300 rem-------------------------------
5305 rem schalter anwaehlen
5310 pb=fa+215
5315 for i=0 to 120 step40:for j=0 to 5
5320 : poke pb+i+j,f2:next:next
5325 pa=si+23:pw=rf and 15
5330 pv=2900:return
5350 rem-------------------------------
5355 rem modus anwaehlen
5360 pb=fa+225
5365 for i=0 to 120 step40:for j=0 to 3
5370 : poke pb+i+j,f2:next:next
5375 pa=mo+23
5380 pv=2955:return
5400 rem-------------------------------
5405 rem lautstaerke anwaehlen
5410 pb=fa+232
5415 poke pb,f2:poke pb+1,f2
5420 pa=mo+23:pw=peek(pa) and 15
5425 pm=16:p1=1:p2=1:pv=3010:return
5500 rem===============================
5505 rem untermenue lfo
5510 rem===============================
5515 m=3:syscl:print"{home}{rvof}";f1$;
5520 print"   {CBM-A}CCCCCC{CBM-R}CCCC{CBM-R}CCCC{CBM-R}CCCCCC{CBM-R}CCCCC{CBM-S}"
5525 print"   B lfof BlfopBlfoaBkurve BmodusB"
5530 print" {CBM-A}C{SHIFT-+}CCCCCC{SHIFT-+}CCCC{SHIFT-+}CCCC{SHIFT-+}CCCCCC{SHIFT-+}CCCCC{SHIFT-+}CCCC{CBM-S}"
5535 for z=3 to 9
5540 : syspr,z,1,"B B      B    B    B      B     B    B"
5545 next z
5550 syspr,10,1,"{CBM-Z}C{CBM-E}CCCCCC{CBM-E}CCCC{CBM-E}CCCC{CBM-E}CCCCCC{CBM-E}CCCCC{CBM-E}CCCC{CBM-X}
5555 print f2$;" f1";f1$;"  ++     ++   ++  trian  reset"
5560 print f2$;" f3";f1$;"  +      +    +   sawup  hold"
5565 print f2$;" f5";f1$;"  -      -    -   sawdwn run"
5570 print f2$;" f7";f1$;"  --     --   --  square"
5575 for ln=0 to 6
5580 : z=3+ln
5585 : syspr,z,2,chr$(48+ln)
5590 : pw=usr(mo+32+5*ln)     :rem lfof
5595 : syspr,z,10-len(str$(pw)),pw
5600 : pw=peek(mo+34+5*ln)    :rem lfop
5605 : syspr,z,15-len(str$(pw)),pw
5610 : pw=peek(mo+35+5*ln)    :rem lfoa
5615 : syspr,z,20-len(str$(pw)),pw
5620 : pw=peek(mo+36+5*ln)    :rem lfoc
5625 : syspr,z,21,kv$((pw and 24)/8)
5630 : syspr,z,28,md$((pw and  6)/2)
5640 next ln
5645 ln=0:av=5830:sysgs,av:return
5650 rem-------------------------------
5655 rem parameterwahl durch cursor
5670 rem hoch
5675 ln=ln-1:if ln<0 then ln=6
5680 gosub 5815:sysgt,av
5685 rem runter
5690 ln=ln+1:if ln>6 then ln=0
5695 gosub 5815:sysgt,av
5700 rem rechts
5705 av=av+30:if av>5950 then av=5830
5710 gosub 5810:sysgt,av
5715 rem links
5720 av=av-30:if av<5830 then av=5950
5725 gosub 5810:sysgt,av
5800 rem-------------------------------
5805 rem aktueles parameterfeld farbe 1
5810 syspr,6,34,"    "
5815 fori=pbtopb+6:pokei,f1:next:return
5820 rem-------------------------------
5825 rem lfof anwaehlen
5830 pb=fa+40*(ln+3)+4
5835 for i=pb to pb+5:poke i,f2:next
5840 pa=mo+32+5*ln:pw=usr(pa):pm=65536
5845 p1=1:p2=200:pv=2610:return
5850 rem-------------------------------
5855 rem lfop anwaehlen
5860 pb=fa+40*(ln+3)+11
5865 for i=pb to pb+3:poke i,f2:next
5870 pa=mo+34+5*ln:pw=peek(pa):pm=256
5875 p1=1:p2=10 :pv=2640:return
5880 rem-------------------------------
5885 rem lfoa waehlen
5890 pb=fa+40*(ln+3)+16
5895 for i=pb to pb+3:poke i,f2:next
5900 pa=mo+35+5*ln:pw=peek(pa):pm=256
5905 p1=1:p2=10 :pv=2670:return
5910 rem-------------------------------
5915 rem lfo kurve waehlen
5920 pb=fa+40*(ln+3)+21
5925 for i=pb to pb+5:poke i,f2:next
5930 pa=mo+36+5*ln:pv=2700
5935 b=(peek(pa) and 24)/8:goto 2717
5940 rem-------------------------------
5945 rem lfo modus waehlen
5950 pb=fa+40*(ln+3)+28
5955 for j=pb to pb+4:poke j,f2:next
5960 pa=mo+36+5*ln
5965 pv=2730:return
6000 rem===============================
6010 rem untermenue eg
6020 rem===============================
6030 m=4:syscl:print"{home}{rvof}";f1$
6040 print" software-eg":print:print
6050 print" {CBM-A}CCCC{CBM-R}CCCC{CBM-R}CCCC{CBM-R}CCCC{CBM-R}CCCC{CBM-R}CCCCC{CBM-R}CCCCC{CBM-S}"
6060 print" B  a B  d B  s B  r B egaB formBmodusB"
6070 print" {CBM-Q}CCCC{SHIFT-+}CCCC{SHIFT-+}CCCC{SHIFT-+}CCCC{SHIFT-+}CCCC{SHIFT-+}CCCCC{SHIFT-+}CCCCC{CBM-W}"
6080 print" B    B    B    B    B    B     B     B"
6090 print" {CBM-Z}CCCC{CBM-E}CCCC{CBM-E}CCCC{CBM-E}CCCC{CBM-E}CCCC{CBM-E}CCCCC{CBM-E}CCCCC{CBM-X}"
6100 syspr,10,1,f2$;"f1":print" f3"
6110 print" f5":print" f7";f1$
6120 syspr,10,13,"++                  reset"
6130 syspr,11,13,"+               +   hold"
6140 syspr,12,13,"-               -   run"
6150 syspr,13,13,"--"
6160 for i=0 to 4
6170 : pw=peek(mo+67+i)
6180 : syspr,7,6+5*i-len(str$(pw)),pw
6190 next i
6210 pw=peek(mo+72)
6220 syspr,7,29,chr$(43+(pw and 8)/4)
6230 syspr,7,33,md$((pw and 6)/2)
6240 av=6310:an=0:sysgt,av
6300 rem-------------------------------
6305 rem a d s r ega (an=0-4) waehlen
6310 pb=fa+282+5*an:s=2+5*an
6315 for i=pb to pb+3:poke i,f2:next
6320 pa=mo+67+an  :pw=peek(pa)
6325 pm=256:if an=0 then pm=129
6330 p1=1:p2=10:pv=2760:return
6335 rem-------------------------------
6340 rem eg form waehlen
6345 pb=fa+280+27:poke pb+2,f2
6350 pa=mo+72:pv=2780:return
6370 rem-------------------------------
6375 rem eg modus waehlen
6380 pb=fa+280+33
6385 for i=pb to pb+4:poke i,f2:next
6390 pa=mo+72:pv=2820:return
6395 rem-------------------------------
6400 rem parameterwahl durch cursor
6405 rem links
6410 if av<>6310 then 6420
6415 an=an-1:if an>=0 then 6430
6420 av=av-35:an=4
6425 if av<6310 then av=6380
6430 gosub 5815:sysgt,av
6435 rem rechts
6440 if av<>6310 then 6450
6445 an=an+1:if an<=4 then 6460
6450 av=av+35
6455 if av>6380 then av=6310:an=0
6460 gosub 5815:sysgt,av
6500 rem===============================
6510 rem untermenue ksv
6520 rem===============================
6530 m=5:pv=0:print"{rvof}";:syscl
6540 syspr,1,1,f1$;"kreuzschienen-verteiler"
6550 syspr,3,1,"e    lfo"
6560 syspr,4,1,"g6543210"
6570 syspr,5,1,f2$;"{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}"
6580 a$=f2$+"{CBM-M}"+f1$+"        "+f2$+"T "+f1$
6590 print a$;"f1";f2$;"     cursortasten"
6600 print a$;"f2"
6610 print a$;"f3"
6620 print a$;"p1";f2$;"     f1 ";f1$;"verbindung"
6630 print a$;"p2"
6640 print a$;"p3";f2$;"     f7 ";f1$;"keine verbindung"
6650 print a$;"filt"
6660 print a$;"laut"
6670 print f2$;" {CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}"
6680 for z=0 to 7:gosub 6730:next
6685 z=0:s=7:poke 55296+40*(6+z)+8-s,f2
6690 return
6700 rem-------------------------------
6710 rem ksv-byte z anzeigen
6720 rem-------------------------------
6730 b=peek(mo+24+z):a=128
6740 syspr,6+z,1,f1$;"{rvon}00000000"
6750 if b=0 then return
6760 for s=7 to 0 step -1
6770 if(b and a)thensyspr,6+z,8-s,"{rvon}1";
6780 a=a/2:next s
6790 print f1$;:return
6800 rem-------------------------------
6810 rem cursorbewegungen
6820 rem-------------------------------
6830 poke 55296+40*(6+z)+8-s,f1:rem aus
6840 z=(z-1) and 7:goto 6910:rem hoch
6850 poke 55296+40*(6+z)+8-s,f1
6860 z=(z+1) and 7:goto 6910:rem runter
6870 poke 55296+40*(6+z)+8-s,f1
6880 s=(s+1) and 7:goto 6910:rem links
6890 poke 55296+40*(6+z)+8-s,f1
6900 s=(s-1) and 7:goto 6910:rem rechts
6910 poke 55296+40*(6+z)+8-s,f2:rem an
6915 return
6920 rem-------------------------------
6925 rem ksv bit z,s setzen
6930 rem-------------------------------
6935 ad=mo+24+z
6940 poke ad,peek(ad) or 2^s
6950 poke 1024+40*(6+z)+8-s,177:return
6960 rem-------------------------------
6965 rem ksv bit z,s setzen
6970 rem-------------------------------
6975 ad=mo+24+z
6980 poke ad,peek(ad) and (255-2^s)
6990 poke 1024+40*(6+z)+8-s,176:return
7000 rem===============================
7005 rem untermenue sounds
7010 rem===============================
7015 m=6:pv=0:syscl:print"{home}{rvof}";f2$
7020 syspr,1,8,"a           b           c"
7025 print f1$;"   {CBM-A}CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC{CBM-S}"
7030 for i=1 to 8
7035 syspr,2+i,1,f2$;chr$(48+i);f1$" B"
7040 syspr,2+i,38,"B":next
7045 syspr,11,3,"{CBM-Z}CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC{CBM-X}"
7050 syspr,12,4,f2$;"a-c 1-8"
7055 syspr,12,13,f1$;"sound waehlen"
7060 syspr,13,1,f2$;"_  a-c 1-8"
7065 syspr,13,13,f1$"sound abspeichern"
7070 syspr,14,1,f2$;"n"
7075 syspr,14,13,f1$;"namen eingeben (return)"
7080 for s=0 to 2:for z=0 to 7
7085 : syspr,3+z,4+s*12,;
7090 : sysna,so+107*(8*s+z)+97
7095 next:next:ifns<0thenz=0:s=0:return
7100 z=ns and 7:s=int(ns/8):goto 7180
7110 rem-------------------------------
7115 rem sound waehlen (a,b,c)
7120 x=a-65 :rem spalte 0,1,2
7122 syspr,12,13,f2$;"{rvof}sound waehlen"
7125 get a$:if a$="" then 7125
7130 y=asc(a$)-49:rem zeile
7135 if y<0 or y>7 then 7142
7140 gosub 7150:gosub 7400
7142 syspr,12,13,f1$;"{rvof}sound waehlen"
7144 return
7146 rem-------------------------------
7150 rem altes namenfeld normal
7155 ns=8*s+z
7160 : syspr,3+z,4+s*12,f1$;"{rvof}";
7165 : sysna,so+107*ns+97
7170 rem neues namenfeld hervorheben
7175 s=x:z=y:ns=8*s+z
7180 : syspr,3+z,4+s*12,f2$;"{rvof}";
7185 : sysna,so+107*ns+97
7190 return
7200 rem-------------------------------
7205 rem sound abspeichern
7210 syspr,13,13,f2$;"{rvof}sound abspeichern"
7215 get a$:if a$="" then 7215
7220 x=asc(a$)-65:rem spalte
7225 if x<0 or x>2 then 7250
7230 get a$:if a$="" then 7230
7235 y=asc(a$)-49:rem zeile
7240 if y<0 or y>7 then 7250
7245 gosub 7150:gosub 7450:goto 7260
7250 syspr,13,13,f1$;"{rvof}sound abspeichern"
7255 return
7260 syspr,13,13,f1$;"{rvof}sound abspeichern"
7300 rem-------------------------------
7305 rem namen eingeben (z,s,ns)
7310 syspr,14,13,f2$;"namen eingeben (return)"
7315 x=12*s+4:y=z+3:ad=1024+40*y+x
7320 sa=so+107*ns+97:i=0
7325 poke ad+i,peek(ad+i) or 128
7330 get a$:if a$="" then 7330
7335 a=asc(a$):if a<32or a>95 then 7370
7340 rem zeichen ausgeben
7345 syspr,y,x+i,f2$;a$;:poke sa+i,a
7350 i=i+1
7355 if i>9 then i=9:goto 7325
7360 if i<0 then i=0
7365 goto 7325
7370 if a=29 then poke ad+i,peek(ad+i) and 127:goto 7350
7375 if a=157then poke ad+i,peek(ad+i) and 127:i=i-1:goto 7355
7380 if a<>13 then 7330
7385 poke ad+i,peek(ad+i) and 127
7390 syspr,14,13,f1$;"namen eingeben (return)"
7395 return
7400 rem-------------------------------
7402 rem parametersatz ns holen
7404 sa=so+ns*107:sysge,sa
7406 for i=0 to 2
7408 : ad=sa+7*i
7410 : bf(i)=usr(ad+73)
7412 : x=bf(i)/17.0327/440
7414 : y=log(x)/log(2) :rem x=2^y
7416 : y=y+4+9/12+49/1200
7418 : o(i)=int(y):y=(y-o(i))*12
7420 : t(i)=int(y)
7422 : of(i)=int((y-t(i))*100-48.5)
7424 : s(i)=(peek(ad+75)=1)
7426 : a$=chr$(49+i):gosub 3570
7428 : c(i)=peek(ad+77) and 254
7430 : c1(i)=c(i) or 1
7432 : ad(i)=peek(ad+78)
7434 : sr(i)=peek(ad+79)
7436 next i
7438 rf=peek(sa+94)
7440 eg=(peek(sa+95)=1):gosub 3740
7442 su=(peek(sa+96)=1):gosub 3840
7444 return
7450 rem-------------------------------
7452 rem parametersatz ns abspeichern
7454 sa=so+ns*107:syspu,sa
7456 for sn=0 to 2
7458 : ad=sa+7*sn
7460 : sysdo,ad+73,bf(sn)
7462 : poke ad+75,-s(sn)
7464 : poke ad+77,c(sn)
7466 : poke ad+78,ad(sn)
7468 : poke ad+79,sr(sn)
7470 next sn
7472 poke sa+94,rf
7474 poke sa+95,-eg
7476 poke sa+96,-su
7478 return
7500 rem===============================
7505 rem untermenue diskette
7510 rem===============================
7515 m=7:pv=0:syscl:print"{home}";f1$
7520 print" disk"
7525 syspr,5,4,f2$;"f1"
7530 syspr,5,7,f1$;"sounds laden"
7535 syspr,7,4,f2$;"f3"
7540 syspr,7,7,f1$;"sounds abspeichern"
7545 return
7600 rem-------------------------------
7605 rem sounds laden
7610 syspr,5,7,f2$;"sounds laden"
7615 syspr,10,4,f1$;"dateiname ";
7620 dn$="sounds              "
7625 syspr,10,16,dn$
7630 syspr,10,14,;:input dn$
7635 open 8,8,8,dn$+",p,r":close 8
7640 open1,8,15:input#1,a,a$,x,y:close1
7645 syspr,12,4,"                             "
7650 if a=0 then 7660
7655 syspr,12,3,a;a$;x;y:goto 7625
7660 a=0:load dn$,8,1
7665 syspr,5,7,f1$;"sounds laden"
7670 ns=-1:a=211:goto 1550
7700 rem-------------------------------
7705 rem sounds abspeichern
7710 syspr,7,7,f2$;"sounds abspeichern"
7715 syspr,10,4,f1$;"dateiname ";
7720 dn$="sounds              "
7725 syspr,10,16,dn$
7730 syspr,10,14,;:input dn$
7735 sys 50198:rem modulator aus
7740 rem bereich $8000-$8a08 auf disk
7745 open 1,8,1,"@:"+dn$
7750 poke 252,0:poke 253,144:rem $9000
7755 poke 780,252:rem akku
7760 poke 781,8  :rem x-reg = $08
7765 poke 782,154:rem y-reg = $9a
7770 sys 65496   :rem kernal save
7775 close 1
7780 open1,8,15:input#1,a,a$,x,y:close1
7785 if a=0 then 7795
7790 syspr,12,4,a;a$;x;y:goto 7725
7795 syspr,12,4,"                              "
7800 syspr,7,7,f1$;"sounds abspeichern"
7805 sys 50185:return:rem modulator an
8000 rem===============================
8010 rem vorbesetzung, initialisierung
8020 rem===============================
8030 print"{clr}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}       ";
8035 print"bitte 30 sekunden warten"
8040 rem-------------------------------
8045 rem ms-programme in kassettenpuf.
8050 for i=0 to 22   :rem kernal-gosub
8055 poke 828+i,peek(43139+i):next
8060 fori=0to129:readx:poke851+i,x:next
8065 poke785,169:poke 786,3:rem usr
8070 rem-------------------------------
8072 rem ms-programme ab $c423
8074 for i=50211 to 50291
8076 read x:poke i,x:next
8078 rem-------------------------------
8080 rem namen der toene
8082 for i=0 to 11:read tn$(i):next
8100 rem-------------------------------
8110 rem sprungvektoren
8120 read a$:l=len(a$)
8130 on l goto 8150,8220,8280,8310
8150 rem l=1  ascii-zeichen
8160 a=asc(a$)
8170 if m>=0 then v%(m,a)=zn:goto 8120
8180 for i=0 to 7:v%(i,a)=zn:next
8190 goto 8120
8200 if left$(a$,1)<>"m" then 8120
8220 rem l=2  menue-indikator
8230 if left$(a$,1)<>"m" then 8120
8240 a$=right$(a$,1)
8250 if a$="a" then m=-1 :goto 8120
8260 m=val(a$)           :goto 8120
8280 rem l=3  ascii-wert
8290 a=val(a$) :goto 8170
8310 rem l=4  zeilennummer oder ende
8320 if a$="ende" then 8340
8330 zn=val(a$) :goto 8120
8340 rem-------------------------------
8350 rem tonnummern
8360 a$="q2w3er5t6y7ui9o0p@-*\^{home};="
8370 for i=0 to 24
8380 : a=asc(mid$(a$,i+1,1))
8390 : tn%(a)=i
8400 : for j=0 to 7:v%(j,a)=2000:next
8410 next i
8450 rem-------------------------------
8455 rem frequenzen der tonleiter
8460 for i=0 to 24:th(i)=2^(i/12):next
8465 rem-------------------------------
8470 rem konstanten
8472 gs=828:gt=857:pr=869:do=897:cl=959
8474 na=50229:ge=50245:pu=50276
8480 si=54272:mo=49152:fa=55296
8482 so=36864
8484 f1$=chr$(154):f1=14
8490 f2$=chr$(5)  :f2=1
8495 kv$(0)="trian ":kf$(0)="NMNM"
8500 kv$(1)="sawup ":kf$(1)="NLNL"
8505 kv$(2)="sawdwn":kf$(2)="{SHIFT-@}M{SHIFT-@}M"
8510 kv$(3)="square":kf$(3)="OLOL"
8515 md$(0)="reset" :md$(1)="reset"
8520 md$(2)="hold " :md$(3)="run  "
8525 bl$(0)="":bl$(1)=" ":bl$(2)="  "
8530 bl$(3)="   ":bl$(4)="    "
8535 bl$(5)="     ":bl$(6)="      "
8540 rem-------------------------------
8545 rem soundparameter vorbesetzungen
8550 for sn=0 to 2
8555 : poke si+7*sn+5,10 :ad(sn)=10
8560 : poke si+7*sn+6,138:sr(sn)=138
8565 : o(sn)=3+sn:of(sn)=0:t(sn)=0
8570 : bf=440*2^(o(sn)-4+(t(sn)-9)/12+of(sn)/1200)
8572 : bf(sn)=bf*17.0327
8575 :  c(sn)=64         :c1(sn)=65
8580 :  s(sn)=(sn=0)
8585 : sysdo,mo+7*sn+2,2048 :rem pw
8590 : poke  mo+7*sn+4,0    :rem porta
8595 next sn
8600 poke  si+23,0:rf=0  :rem res/filt
8605 sysdo,mo+21,0       :rem filterfr.
8610 poke  mo+23,15      :rem mod/laut
8615 for i=24 to 72 :rem ksv,lfo,eg aus
8620 : poke mo+i,0:next
8625 eg=0         :rem eg abkoppeln
8630 su=0         :rem sustain aus
8635 rem-------------------------------
8640 rem sounds vorbesetzen
8645 for ns=0 to 23
8650 : gosub 7450
8655 : ad=so+107*ns+97
8660 : for i=ad to ad+9:poke i,46:next
8665 next ns:ns=0
8700 rem-------------------------------
8870 rem farben, bild, modulator
8880 poke 53280,14:poke 53281,6
8890 print f1$;"{rvof}";:poke 650,128
8900 gosub 4200 :rem bild zeilen 15-23
8910 sys mo+1033:rem modulator aktiv.
8920 a=2:return
9000 rem===============================
9010 rem datas
9020 rem===============================
9030 rem maschinenprogramme
9060 data 032,089,003,076,174,167,032
9070 data 253,174,032,138,173,032,247
9080 data 183,076,163,168,032,253,174
9090 data 032,158,183,138,072,032,253
9100 data 174,032,158,183,138,168,104
9110 data 170,024,032,240,255,032,253
9120 data 174,076,160,170,032,253,174
9130 data 032,138,173,032,247,183,165
9140 data 020,133,158,165,021,133,159
9150 data 032,253,174,032,138,173,032
9160 data 247,183,160,000,120,165,020
9170 data 145,158,200,165,021,145,158
9180 data 088,096,032,247,183,160,000
9190 data 120,177,020,133,099,200,177
9200 data 020,088,133,098,162,144,056
9210 data 076,073,188,169,032,162,000
9220 data 157,000,004,157,000,005,202
9230 data 208,247,162,087,157,000,006
9240 data 202,016,250,096
9250 rem-------------------------------
9260 rem maschinenprogramme ab $c423
9270 data 032,253,174,032,138,173,032
9280 data 247,183,165,020,133,158,165
9290 data 021,133,159,096,032,035,196
9300 data 160,000,177,158,032,210,255
9310 data 200,192,010,208,246,096,032
9320 data 035,196,160,000,177,158,153
9330 data 000,192,200,192,073,208,246
9340 data 177,158,153,183,211,200,192
9350 data 094,208,246,177,158,141,023
9360 data 212,096,032,035,196,160,000
9370 data 185,000,192,145,158,200,192
9380 data 073,208,246,096
9400 rem-------------------------------
9410 rem  namen der toene
9420 data c,c#,d,d#,e,f,f#,g,g#,a,a#,h
9500 rem-------------------------------
9510 rem datas fuer sprungverteiler
9520 data ma,4000,x,3500,v,3600,032
9530 data ma,3700,160,3800,s
9540 data ma,2550,133,2560,134
9550 data ma,2570,135,2580,136,4500,214
9555 data ma,5500,l,6000,h,6500,k
9560 data ma,5000,f,7000,211,7500,d
9565 data m1,4654,145,4660,017
9570 data m1,4666,029,4680,157
9580 data m2,5160,157,5145,029
9600 data m3,5675,145,5690,017
9610 data m3,5720,157,5705,029
9620 data m4,6410,157,6440,029
9630 data m5,6830,145,6850,017
9640 data m5,6870,157,6890,029
9650 data m5,6935,133,134,6975,135,136
9700 data m6,7110,a,b,c,7200,_,7300,n
9750 data m7,7600,133,7700,134
9900 data ende
  0 IF A>1  THEN RETURN :REM DUMMY-ROUTINE 
 1000 REM ****************************** 
 1005 REM ***                        *** 
 1010 REM ***    SOUND - EDITOR      *** 
 1015 REM ***                        *** 
 1020 REM ***  FUER DIE PARAMETER    *** 
 1025 REM *** VON SID UND MODULATOR  *** 
 1030 REM ***                        *** 
 1035 REM *** T. KRAETZIG      1985  *** 
 1040 REM ***                        *** 
 1045 REM ****************************** 
 1050 REM 
 1055 REM FALLS VON MENUE 7 GEKOMMEN, 
 1060 REM DORTHIN ZURUECK 
 1065 IF M=7  THEN 7665 
 1070 REM 
 1120 REM MODULATOR LADEN 
 1130 IF A=0 THEN A=1:LOAD "MODULATOR",8,1 
 1140 REM 
 1150 REM DIMENSIONIERUNGEN 
 1155 POKE 56,144:CLR :REM B.-GRENZE $9000 
 1160 DIM V%(7,255),TN%(255),TH(24) 
 1165 DIM BF(2),T(2),O(2),OF(2),S(2) 
 1170 DIM C1(2),C(2),AD(2),SR(2) 
 1175 DIM BL$(6),KV$(3),KF$(6),MD$(3) 
 1180 DIM TN$(11) 
 1185 REM 
 1190 GOSUB 8000  :REM INITIALISIERUNGEN 
 1200 GOSUB 4000  :REM HAUPTMENUE 
 1210 REM 
 1500 REM =============================== 
 1510 REM HAUPTSCHLEIFE, SPRUNGVERTEILER 
 1520 REM =============================== 
 1530 GET A$:IF A$=""  THEN 1530 
 1540 A=ASC (A$) 
 1550 SYS GS,V%(M,A) :REM BERECHN. GOSUB 
 1560 GOTO 1530 
 2000 REM =============================== 
 2010 REM NOTEN SPIELEN 
 2020 REM =============================== 
 2025 POKE 650,0 
 2030 F=TH(TN%(A)):AD=MO+72:X=PEEK (AD) 
 2035 IF S(0)  THEN SYS DO,MO   ,F*BF(0):POKE SI+4 ,C1(0) 
 2040 IF S(1)  THEN SYS DO,MO+7 ,F*BF(1):POKE SI+11,C1(1) 
 2050 IF S(2)  THEN SYS DO,MO+14,F*BF(2):POKE SI+18,C1(2) 
 2090 IF EG  THEN POKE AD,X OR 1 
 2110 IF SU  THEN POKE 650,128:RETURN 
 2120 IF PEEK (203)<>64 AND PEEK (198)=0  THEN 2120 
 2130 POKE AD,X AND 254 
 2140 POKE SI+4 ,C(0) 
 2150 POKE SI+11,C(1):POKE SI+18,C(2) 
 2160 POKE 650,128:RETURN 
 2500 REM =============================== 
 2510 REM NUMERISCHE PARAMETER AENDERN, 
 2520 REM VERTEILER EINZELROUTINEN 
 2530 REM =============================== 
 2550 PW=PW+P2:IF PW>=PM  THEN PW=PW-PM 
 2555 SYS GT,PV 
 2560 PW=PW+P1:IF PW>=PM  THEN PW=PW-PM 
 2565 SYS GT,PV 
 2570 PW=PW-P1:IF PW< 0   THEN PW=PW+PM 
 2575 SYS GT,PV 
 2580 PW=PW-P2:IF PW< 0   THEN PW=PW+PM 
 2585 SYS GT,PV 
 2600 REM ------------------------------- 
 2605 REM LFOF 
 2610 SYS DO,PA,PW:L=LEN (STR$ (PW)) 
 2620 SYS PR,3+LN,4,BL$(6-L);F2$;PW 
 2625 RETURN 
 2630 REM ------------------------------- 
 2635 REM LFOP 
 2640 POKE PA,PW:L=LEN (STR$ (PW)) 
 2650 SYS PR,3+LN,11,BL$(4-L);F2$;PW 
 2655 RETURN 
 2660 REM ------------------------------- 
 2665 REM LFOA 
 2670 POKE PA,PW:L=LEN (STR$ (PW)) 
 2680 SYS PR,3+LN,16,BL$(4-L);F2$;PW 
 2685 RETURN 
 2690 REM ------------------------------- 
 2695 REM LFO KURVE 
 2700 IF A>136 OR A<133  THEN RETURN 
 2705 B=A-133  :REM B=0,1,2,3 
 2710 POKE PA,(PEEK (PA)AND 231)OR (B*8) 
 2715 SYS PR,3+LN,21,F2$;KV$(B) 
 2717 SYS PR,6   ,34,F2$;KF$(B):RETURN 
 2720 REM ------------------------------- 
 2725 REM LFO MODUS 
 2730 IF A>135 OR A<133  THEN RETURN 
 2735 B=A-132  :REM B=1,2,3 
 2740 POKE PA,(PEEK (PA)AND 249)OR (B*2) 
 2745 SYS PR,3+LN,28,F2$;MD$(B):RETURN 
 2750 REM ------------------------------- 
 2755 REM EG A D S R EGA (AN=0-4) 
 2760 POKE PA,PW:L=LEN (STR$ (PW)) 
 2765 SYS PR,7,S,BL$(4-L);F2$;PW:RETURN 
 2770 REM ------------------------------- 
 2775 REM EG FORM 
 2780 B=-(A>134):REM F1,F3 B=0 F5,F7 B=1 
 2785 POKE PA,(PEEK (PA)AND 247)OR (B*8) 
 2790 SYS PR,7,29,F2$;CHR$ (43+2*B) 
 2795 RETURN 
 2810 REM ------------------------------- 
 2815 REM EG MODUS 
 2820 IF A>135 OR A<133  THEN RETURN 
 2825 B=A-132  :REM B=1,2,3 
 2830 POKE PA,(PEEK (PA)AND 249)OR (B*2) 
 2835 SYS PR,7,33,F2$;MD$(B):RETURN 
 2840 REM ------------------------------- 
 2845 REM FILTER FREQUENZ 
 2850 POKE PA,PWAND 7:POKE PA+1,INT (PW/8) 
 2855 L=LEN (STR$ (PW)) 
 2860 SYS PR,5,2,BL$(5-L);F2$;PW:RETURN 
 2865 REM ------------------------------- 
 2870 REM FILTER RESONANZ 
 2875 RF=(RF AND 15)+16*PW:POKE PA,RF 
 2880 L=LEN (STR$ (PW)) 
 2885 SYS PR,5,9,BL$(3-L);F2$;PW:RETURN 
 2890 REM ------------------------------- 
 2895 REM FILTER SCHALTER 
 2900 IF A>136 OR A<133  THEN RETURN 
 2905 B=A-133  :REM B=0,1,2,3 
 2910 X=2^B:X1=255-X:REM MASKEN 
 2915 Y=RF AND X 
 2920 RF=(RF AND X1)OR (X-Y):POKE PA,RF 
 2925 Y=-128*(Y=0):AD=1024+(5+B)*40+15 
 2930 FOR I=AD  TO AD+5 
 2935 : POKE I,(PEEK (I)AND 127)OR Y 
 2940 NEXT :RETURN 
 2945 REM ------------------------------- 
 2950 REM FILTER MODUS 
 2955 IF A>136 OR A<133  THEN RETURN 
 2960 B=A-129  :REM B=4,5,6,7 
 2965 X=2^B:X1=255-X:REM MASKEN 
 2970 PW=PEEK (PA):Y=PW AND X 
 2975 POKE PA,(PW AND X1)OR (X-Y) 
 2980 Y=-128*(Y=0):AD=1024+(1+B)*40+25 
 2985 FOR I=AD  TO AD+3 
 2990 : POKE I,(PEEK (I)AND 127)OR Y 
 2995 NEXT :RETURN 
 3000 REM ------------------------------- 
 3005 REM LAUTSTAERKE 
 3010 POKE PA,(PEEK (PA) AND 240) OR PW 
 3015 L=LEN (STR$ (PW)) 
 3020 SYS PR,5,31,BL$(3-L);F2$;PW:RETURN 
 3050 REM ------------------------------- 
 3052 REM BASISFREQUENZ 
 3054 IF A<>134  THEN 3064 
 3056 REM F3 OFFSET ERHOEHEN 
 3058 OF=OF+1:IF OF<=50  THEN 3110 
 3062 OF=-49:GOTO 3076 
 3064 IF A<>135  THEN 3074 
 3066 REM F5 OFFSET ERNIEDRIGEN 
 3068 OF=OF-1:IF OF>=-49  THEN 3110 
 3072 OF=50:GOTO 3084 
 3074 IF A<>133  THEN 3082 
 3076 REM TONNUMMER ERHOEHEN 
 3078 T=T+1:IF T<=11  THEN 3110 
 3080 T=0:GOTO 3090 
 3082 IF A<>136  THEN RETURN 
 3084 REM TONNUMMER ERNIEDRIGEN 
 3086 T=T-1:IF T>=0  THEN 3110 
 3088 T=11:GOTO 3096 
 3090 REM OKTAVE ERHOEHEN 
 3092 O=O+1:IF O<=5  THEN 3110 
 3094 O=0:GOTO 3110 
 3096 REM OKTAVE ERNIEDRIGEN 
 3098 O=O-1:IF O>=0  THEN 3110 
 3100 O=5:T=10 
 3110 REM BASISFREQUENZ BERECHNEN 
 3112 IF T=11 AND O=5  THEN T=0:O=0 
 3114 BF=440*2^(O-4+(T-9)/12+OF/1200) 
 3116 O(SN)=O:T(SN)=T:OF(SN)=OF 
 3118 BF(SN)=BF*17.0327 
 3120 SYS DO,MO+7*SN,F*BF(SN) 
 3122 REM ANZEIGEN 
 3124 SYS PR,3+SN,3,F2$;O 
 3126 SYS PR,3+SN,2,TN$(T) 
 3128 SYS PR,3+SN,5,RIGHT$ (" "+STR$ (OF),3) 
 3130 RETURN 
 3150 REM ------------------------------- 
 3155 REM PULSWEITE STIMME 
 3160 SYS DO,PA,PW 
 3165 SYS PR,3+SN,9,F2$;RIGHT$ ("{2SPACE}"+STR$ (PW),4) 
 3170 RETURN 
 3175 REM ------------------------------- 
 3180 REM A 
 3185 AD(SN)=(AD(SN)AND 15) OR PW*16 
 3190 POKE PA,AD(SN) 
 3195 SYS PR,3+SN,14,F2$;RIGHT$ (STR$ (PW),2) 
 3200 RETURN 
 3205 REM ------------------------------- 
 3210 REM D 
 3215 AD(SN)=(AD(SN)AND 240) OR PW 
 3220 POKE PA,AD(SN) 
 3225 SYS PR,3+SN,17,F2$;RIGHT$ (STR$ (PW),2) 
 3230 RETURN 
 3235 REM ------------------------------- 
 3240 REM S 
 3245 SR(SN)=(SR(SN)AND 15) OR PW*16 
 3250 POKE PA,SR(SN) 
 3255 SYS PR,3+SN,20,F2$;RIGHT$ (STR$ (PW),2) 
 3260 RETURN 
 3265 REM ------------------------------- 
 3270 REM R 
 3275 SR(SN)=(SR(SN)AND 240) OR PW 
 3280 POKE PA,SR(SN) 
 3285 SYS PR,3+SN,23,F2$;RIGHT$ (STR$ (PW),2) 
 3290 RETURN 
 3300 REM ------------------------------- 
 3305 REM CONTROL (BIT 7-S) 
 3310 IF A<>133 AND A<>134  THEN 3335 
 3315 REM BIT SETZEN 
 3320 C(SN)=C(SN) OR 2^(7-S) 
 3325 C1(SN)=C(SN) OR 1 
 3330 SYS PR,3+SN,26+S,F2$;"1":GOTO 3355 
 3335 REM BIT RUECKSETZEN 
 3340 C(SN)=C(SN) AND 255-2^(7-S) 
 3345 C1(SN)=C(SN) OR 1 
 3350 SYS PR,3+SN,26+S,F2$;"0" 
 3355 REM CONTROL-BYTE ZUM SID 
 3360 X=C(SN):IF SU  THEN X=C1(SN) 
 3365 POKE SI+7*SN+4,X:RETURN 
 3370 REM ------------------------------- 
 3375 REM PORTA 
 3380 POKE PA,PW:L=LEN (STR$ (PW)) 
 3385 SYS PR,3+SN,34,BL$(4-L);F2$;PW 
 3390 RETURN 
 3500 REM =============================== 
 3510 REM STIMME (DES-)AKTIVIEREN 
 3520 REM =============================== 
 3525 SYS PR,15,10,F2$;"STIMME 1,2,3" 
 3530 GET A$:IF A$="" THEN 3530 
 3540 IF A$="1"OR A$="2"OR A$="3" THEN 3560 
 3550 GOTO 3590 
 3560 I=VAL (A$)-1 :S(I)=NOT S(I) 
 3570 IF S(I)  THEN PRINT CHR$ (18); 
 3580 SYS PR,21,31+2*I,F1$;A$;CHR$ (146); 
 3590 SYS PR,15,10,F1$;"STIMME 1,2,3" 
 3595 RETURN 
 3600 REM =============================== 
 3610 REM SOFTWARE-EG AUSLOESEN 
 3620 REM =============================== 
 3630 POKE 650,64 
 3640 AD=MO+72:X=PEEK (AD):POKE AD,X OR 1 
 3650 IF PEEK (203)<>64 AND PEEK (198)=0  THEN 3650 
 3660 POKE AD,XAND 254:POKE 650,128:RETURN 
 3700 REM =============================== 
 3710 REM SOFTWARE-EG AN-/ABKOPPELN 
 3720 REM =============================== 
 3730 EG=NOT EG 
 3740 IF EG  THEN PRINT CHR$ (18); 
 3750 SYS PR,23,31,F1$;"SOFT-EG{RVOFF}":RETURN 
 3800 REM =============================== 
 3810 REM SUSTAIN-MODUS EIN/AUS 
 3820 REM =============================== 
 3830 SU=NOT SU 
 3840 IF SU  THEN PRINT CHR$ (18); 
 3850 SYS PR,22,31,F1$;"SUSTAIN{RVOFF}" 
 3860 IF NOT SU  THEN 2140 
 3870 RETURN 
 4000 REM =============================== 
 4010 REM HAUPTMENUE 
 4020 REM =============================== 
 4030 M=0:PV=0:SYS CL:PRINT "{HOME}";F1$ 
 4040 PRINT" ACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCS" 
 4045 PRINT" B{RVSON,9SPACE}M O D U L A T O R{10SPACE,RVOFF}B" 
 4050 PRINT" B{RVSON,5SPACE}THOMAS KRAETZIG{7SPACE}1985{5SPACE,RVOFF}B" 
 4055 PRINT" ZCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCX" 
 4100 SYS PR,6,1,F2$;"SH V";F1$;" STIMMEN" 
 4105 SYS PR,7,1,F2$;"{3SPACE}F";F1$;" FILTER/LAUTSTAERKE" 
 4110 SYS PR,8,1,F2$;"{3SPACE}L";F1$;" LFO" 
 4115 SYS PR,9,1,F2$;"{3SPACE}H";F1$;" HUELLKURVE (SOFT-EG)" 
 4120 SYS PR,10,1,F2$;"{3SPACE}K";F1$;" KSV" 
 4125 SYS PR,11,1,F2$;"SH S";F1$;" SOUNDS" 
 4130 SYS PR,12,1,F2$;"{3SPACE}D";F1$;" DISK" 
 4135 RETURN 
 4200 REM ------------------------------- 
 4210 REM BILD ZEILEN 15-23 
 4220 REM ------------------------------- 
 4240 SYS PR,15,1, F2$;"V{2SPACE}1,2,3" 
 4245 SYS PR,15,10,F1$;"STIMME 1,2,3 
 4250 SYS PR,15,26,F2$;"S" 
 4255 SYS PR,15,32,F1$;"SUSTAIN" 
 4260 SYS PR,16,1, F2$;"SH SPACE" 
 4270 SYS PR,16,10,F1$;"EG (AB-)KOPPELN" 
 4280 SYS PR,16,26,F2$;"SPACE" 
 4290 SYS PR,16,32,F1$;"EG GATE" 
 4292 SYS PR,17,1, F2$;"X" 
 4294 SYS PR,17,10,F1$;"HAUPTMENUE" 
 4300 SYS PR,19,0,F2$; 
 4310 FOR I=1  TO 4 
 4320 : PRINT"{SPACE,RVSON,SPACE}B B B B B B B B B B B B B B{SPACE,RVOFF}":NEXT 
 4330 PRINT"{SPACE,RVSON}QBWBEBRBTBYBUBIBOBPB@B*BB;B=" 
 4340 SYS PR,19,0,; 
 4350 FOR I=1  TO 2 
 4360 : PRINT"{SPACE,RIGHT,SPACE,RIGHT,SPACE,3RIGHT,SPACE,RIGHT,SPACE,RIGHT,SPACE,3RIGHT,SPACE,RIGHT,SPACE,3RIGHT,SPACE,RIGHT,SPACE,RIGHT,SPACE}":NEXT 
 4370 PRINT"{SPACE,RIGHT}2{RIGHT}3{RIGHT,2RIGHT}5{RIGHT}6{RIGHT}7{RIGHT,2RIGHT}9{RIGHT}0{RIGHT,2RIGHT}-{RIGHT}£{RIGHT}C" 
 4380 SYS PR,19,31,F1$;"AKTIV:" 
 4390 FOR I=0  TO 2 
 4400 : A$=RIGHT$ (STR$ (I+1),1) 
 4410 : GOSUB 3570:NEXT I 
 4420 GOSUB 3840:GOSUB 3740 
 4430 RETURN 
 4500 REM =============================== 
 4505 REM UNTERMENUE STIMME 
 4510 REM =============================== 
 4515 M=1:PV=3050:SYS CL:PRINT"{HOME,RVOFF}";F1$ 
 4520 PRINT"{5SPACE}F{4SPACE}PW{3SPACE}A{2SPACE}D{2SPACE}S{2SPACE}R CONTROL PORTA" 
 4525 PRINT" ACCCCCCRCCCCRCCRCCRCCRCCRCCCCCCCRCCCCS" 
 4530 FOR I=1  TO 3 
 4535 PRINT" B{6SPACE}B{4SPACE}B{2SPACE}B{2SPACE}B{2SPACE}B{2SPACE}B{7SPACE}B{4SPACE}B" 
 4540 NEXT I 
 4545 PRINT" ZCCCCCCECCCCECCECCECCECCERRRRRRRECCCCX" 
 4550 SYS PR,7,26,"BBBBBBZCCSYNC" 
 4555 SYS PR,8,26,"BBBBBZCCRING" 
 4560 SYS PR,9,1,F2$;"F1{2SPACE}++";F1$ 
 4565 SYS PR,9,26,"BBBBZCCTEST" 
 4570 SYS PR,10,1,F2$;"F3{2SPACE}+";F1$ 
 4575 SYS PR,10,26,"BBBZCCTRIAN" 
 4580 SYS PR,11,1,F2$;"F5{2SPACE}-";F1$ 
 4585 SYS PR,11,26,"BBZCCSAWTOOTH" 
 4590 SYS PR,12,1,F2$;"F7{2SPACE}--";F1$ 
 4595 SYS PR,12,26,"BZCCSQUARE" 
 4600 SYS PR,13,26,"ZCCNOISE" 
 4602 REM PARAMETER ANZEIGEN 
 4604 A$=F2$:F2$=F1$ 
 4606 FOR SN=0  TO 2 
 4608 : T=T(SN):O=O(SN):OF=OF(SN) 
 4610 : GOSUB 3122:REM F 
 4612 : PW=(USR (MO+7*SN+2)):GOSUB 3165 
 4614 : PW=INT (AD(SN)/16)  :GOSUB 3195 
 4616 : PW=AD(SN)AND 15     :GOSUB 3225 
 4618 : PW=INT (SR(SN)/16)  :GOSUB 3255 
 4620 : PW=SR(SN)AND 15     :GOSUB 3285 
 4622 : REM CONTROL-BYTE (7 BIT) 
 4624 : B=C(SN):A=128 
 4626 : SYS PR,3+SN,26,F1$;"0000000" 
 4628 : FOR S=7  TO 1 STEP -1 
 4630 : IF (BAND A) THENSYS PR,3+SN,33-S,"1" 
 4632 : A=A/2:NEXT S 
 4634 : PA=MO+7*SN+4:PW=PEEK (PA) 
 4636 : GOSUB 3370:REM PORTA 
 4638 NEXT SN 
 4640 F2$=A$ 
 4642 SN=0:AV=4700:SYS GS,AV:RETURN 
 4650 REM ------------------------------- 
 4652 REM PARAMETERWAHL DURCH CURSOR 
 4654 REM HOCH 
 4656 SN=SN-1:IF SN<0  THEN SN=2 
 4658 GOSUB 5815:SYS GT,AV 
 4660 REM RUNTER 
 4662 SN=SN+1:IF SN>2  THEN SN=0 
 4664 GOSUB 5815:SYS GT,AV 
 4666 REM RECHTS 
 4668 IF AV<>4880  THEN 4674 
 4670 S=S+1:IF S>6  THEN AV=4910 
 4672 GOTO 4678 
 4674 AV=AV+30:IF AV>4910  THEN AV=4700 
 4676 IF AV=4880  THEN S=0 
 4678 GOSUB 5815:SYS GT,AV 
 4680 REM LINKS 
 4682 IF AV<>4880  THEN 4688 
 4684 S=S-1:IF S<0  THEN AV=4850 
 4686 GOTO 4692 
 4688 AV=AV-30:IF AV<4700  THEN AV=4910 
 4690 IF AV=4880  THEN S=6 
 4692 GOSUB 5815:SYS GT,AV 
 4700 REM ------------------------------- 
 4702 REM BASISFREQUENZ WAEHLEN 
 4704 PB=FA+40*(SN+3)+2 
 4706 FOR I=PB  TO PB+5:POKE I,F2:NEXT 
 4708 T=T(SN):O=O(SN):OF=OF(SN) 
 4710 PA=MO+7*SN:PV=3050:RETURN 
 4730 REM ------------------------------- 
 4732 REM PULSWEITE WAEHLEN 
 4734 PB=FA+40*(SN+3)+9 
 4736 FOR I=PB  TO PB+3:POKE I,F2:NEXT 
 4738 PA=MO+7*SN+2:PW=USR (PA):PM=4096 
 4740 P1=1:P2=50:PV=3150:RETURN 
 4760 REM ------------------------------- 
 4762 REM ATTACK WAEHLEN 
 4764 PB=FA+40*(SN+3)+14 
 4766 POKE PB,F2:POKE PB+1,F2 
 4768 PA=SI+7*SN+5:PW=INT (AD(SN)/16) 
 4770 PM=16:P1=1:P2=1:PV=3175:RETURN 
 4790 REM ------------------------------- 
 4792 REM DECAY WAEHLEN 
 4794 PB=FA+40*(SN+3)+17 
 4796 POKE PB,F2:POKE PB+1,F2 
 4798 PA=SI+7*SN+5:PW=AD(SN)AND 15 
 4800 PM=16:P1=1:P2=1:PV=3205:RETURN 
 4820 REM ------------------------------- 
 4822 REM SUSTAIN WAEHLEN 
 4824 PB=FA+40*(SN+3)+20 
 4826 POKE PB,F2:POKE PB+1,F2 
 4828 PA=SI+7*SN+6:PW=INT (SR(SN)/16) 
 4830 PM=16:P1=1:P2=1:PV=3235:RETURN 
 4850 REM ------------------------------- 
 4852 REM RELEASE WAEHLEN 
 4854 PB=FA+40*(SN+3)+23 
 4856 POKE PB,F2:POKE PB+1,F2 
 4858 PA=SI+7*SN+6:PW=SR(SN)AND 15 
 4860 PM=16:P1=1:P2=1:PV=3265:RETURN 
 4880 REM ------------------------------- 
 4882 REM CONTROL-BYTE WAEHLEN 
 4884 PB=FA+40*(SN+3)+26+S 
 4886 POKE PB,F2 
 4888 PA=SI+7*SN+4:PV=3300:RETURN 
 4910 REM ------------------------------- 
 4912 REM PORTA WAEHLEN 
 4914 PB=FA+40*(SN+3)+35 
 4916 FOR I=0  TO 2:POKE PB+I,F2:NEXT 
 4918 PA=MO+7*SN+4:PW=PEEK (PA):PM=256 
 4920 P1=1:P2=10:PV=3370:RETURN 
 5000 REM =============================== 
 5005 REM UNTERMENUE FILTER/LAUT 
 5010 REM =============================== 
 5015 M=2:PV=0:SYS CL:PRINT"{HOME,RVOFF}";F1$ 
 5020 PRINT" FILTER/LAUTSTAERKE" 
 5025 PRINT" ACCCCCRCCCCCRCCCCCCCCRCCCCCCCRCCCCS" 
 5030 PRINT" BFILTFB RES BSCHALTERB MODUS BLAUTB" 
 5035 PRINT" QCCCCC+CCCCC+CCCCCCCC+CCCCCCC+CCCCW" 
 5040 PRINT" B{5SPACE}B{5SPACE}B FILT1{2SPACE}B{3SPACE}LP{2SPACE}B{4SPACE}B" 
 5045 PRINT" QCCCCCECCCCCW FILT2{2SPACE}B{3SPACE}BP{2SPACE}QCCCCX" 
 5050 PRINT" B{11SPACE}B FILT3{2SPACE}B{3SPACE}HP{2SPACE}B" 
 5055 PRINT" B{11SPACE}B FILTEX B{2SPACE}3OFF B" 
 5060 PRINT" ZCCCCCCCCCCCECCCCCCCCECCCCCCCX" 
 5065 PRINT F2$;" F1";F1$;"{4SPACE}++{6SPACE}FILT1{6SPACE}LP{4SPACE}++" 
 5070 PRINT F2$;" F3";F1$;"{4SPACE}+{7SPACE}FILT2{6SPACE}BP{4SPACE}+" 
 5075 PRINT F2$;" F5";F1$;"{4SPACE}-{7SPACE}FILT3{6SPACE}HP{4SPACE}-" 
 5080 PRINT F2$;" F7";F1$;"{4SPACE}-{7SPACE}FILTEX{4SPACE}3OFF{3SPACE}--" 
 5085 PW=(PEEK (MO+21)AND 7)+8*PEEK (MO+22) 
 5090 SYS PR,5, 7-LEN (STR$ (PW)),PW 
 5095 PW=INT (RF/16) 
 5100 SYS PR,5,12-LEN (STR$ (PW)),PW 
 5102 IF RFAND 1 THEN SYS PR,5,15,"{RVSON}FILT1{SPACE,RVOFF}" 
 5104 IF RFAND 2 THEN SYS PR,6,15,"{RVSON}FILT2{SPACE,RVOFF}" 
 5106 IF RFAND 4 THEN SYS PR,7,15,"{RVSON}FILT3{SPACE,RVOFF}" 
 5108 IF RFAND 8 THEN SYS PR,8,15,"{RVSON}TILTEX{RVOFF}" 
 5110 PW=PEEK (MO+23) 
 5112 IF PWAND 16 THEN SYS PR,5,25,"{RVSON,SPACE}LP{SPACE,RVOFF}" 
 5114 IF PWAND 32 THEN SYS PR,6,25,"{RVSON,SPACE}BP{SPACE,RVOFF}" 
 5116 IF PWAND 64 THEN SYS PR,7,25,"{RVSON,SPACE}HP{SPACE,RVOFF}" 
 5118 IF PWAND 128 THEN SYS PR,8,25,"{RVSON}3OFF{RVOFF}" 
 5120 PW=PEEK (MO+23)AND 15 
 5122 SYS PR,5,34-LEN (STR$ (PW)),PW 
 5125 AV=5200:SYS GS,AV:RETURN 
 5130 REM ------------------------------- 
 5135 REM PARAMETERWAHL DURCH CURSOR 
 5140 REM RECHTS 
 5145 AV=AV+50:IF AV>5400  THEN AV=5200 
 5150 GOTO 5165 
 5155 REM LINKS 
 5160 AV=AV-50:IF AV<5200  THEN AV=5400 
 5165 GOSUB 5815:A=PB-FA-200 
 5170 IF A<>15 AND A<>25  THEN SYS GT,AV 
 5175 FOR J=1 TO3:PB=PB+40:GOSUB 5815:NEXT 
 5180 PB=PB-120:SYS GT,AV 
 5200 REM ------------------------------- 
 5205 REM FILTERFREQUENZ ANWAEHLEN 
 5210 PB=FA+203 
 5215 FOR I=PB  TO PB+3:POKE I,F2:NEXT 
 5220 PA=MO+21:PW=PEEK (PA)+8*PEEK (PA+1) 
 5225 PM=2048:P1=1:P2=50:PV=2850:RETURN 
 5250 REM ------------------------------- 
 5255 REM RESONANZ ANWAEHLEN 
 5260 PB=FA+210 
 5265 POKE PB,F2:POKE PB+1,F2 
 5270 PA=SI+23:PW=INT (RF/16) 
 5275 PM=16:P1=1:P2=1:PV=2875:RETURN 
 5300 REM ------------------------------- 
 5305 REM SCHALTER ANWAEHLEN 
 5310 PB=FA+215 
 5315 FOR I=0  TO 120 STEP 40:FOR J=0  TO 5 
 5320 : POKE PB+I+J,F2:NEXT :NEXT 
 5325 PA=SI+23:PW=RF AND 15 
 5330 PV=2900:RETURN 
 5350 REM ------------------------------- 
 5355 REM MODUS ANWAEHLEN 
 5360 PB=FA+225 
 5365 FOR I=0  TO 120 STEP 40:FOR J=0  TO 3 
 5370 : POKE PB+I+J,F2:NEXT :NEXT 
 5375 PA=MO+23 
 5380 PV=2955:RETURN 
 5400 REM ------------------------------- 
 5405 REM LAUTSTAERKE ANWAEHLEN 
 5410 PB=FA+232 
 5415 POKE PB,F2:POKE PB+1,F2 
 5420 PA=MO+23:PW=PEEK (PA) AND 15 
 5425 PM=16:P1=1:P2=1:PV=3010:RETURN 
 5500 REM =============================== 
 5505 REM UNTERMENUE LFO 
 5510 REM =============================== 
 5515 M=3:SYS CL:PRINT"{HOME,RVOFF}";F1$; 
 5520 PRINT"{3SPACE}ACCCCCCRCCCCRCCCCRCCCCCCRCCCCCS" 
 5525 PRINT"{3SPACE}B LFOF BLFOPBLFOABKURVE BMODUSB" 
 5530 PRINT" AC+CCCCCC+CCCC+CCCC+CCCCCC+CCCCC+CCCCS" 
 5535 FOR Z=3  TO 9 
 5540 : SYS PR,Z,1,"B B{6SPACE}B{4SPACE}B{4SPACE}B{6SPACE}B{5SPACE}B{4SPACE}B" 
 5545 NEXT Z 
 5550 SYS PR,10,1,"ZCECCCCCCECCCCECCCCECCCCCCECCCCCECCCCX 
 5555 PRINT F2$;" F1";F1$;"{2SPACE}++{5SPACE}++{3SPACE}++{2SPACE}TRIAN{2SPACE}RESET" 
 5560 PRINT F2$;" F3";F1$;"{2SPACE}+{6SPACE}+{4SPACE}+{3SPACE}SAWUP{2SPACE}HOLD" 
 5565 PRINT F2$;" F5";F1$;"{2SPACE}-{6SPACE}-{4SPACE}-{3SPACE}SAWDWN RUN" 
 5570 PRINT F2$;" F7";F1$;"{2SPACE}--{5SPACE}--{3SPACE}--{2SPACE}SQUARE" 
 5575 FOR LN=0  TO 6 
 5580 : Z=3+LN 
 5585 : SYS PR,Z,2,CHR$ (48+LN) 
 5590 : PW=USR (MO+32+5*LN)     :REM LFOF 
 5595 : SYS PR,Z,10-LEN (STR$ (PW)),PW 
 5600 : PW=PEEK (MO+34+5*LN)    :REM LFOP 
 5605 : SYS PR,Z,15-LEN (STR$ (PW)),PW 
 5610 : PW=PEEK (MO+35+5*LN)    :REM LFOA 
 5615 : SYS PR,Z,20-LEN (STR$ (PW)),PW 
 5620 : PW=PEEK (MO+36+5*LN)    :REM LFOC 
 5625 : SYS PR,Z,21,KV$((PW AND 24)/8) 
 5630 : SYS PR,Z,28,MD$((PW AND  6)/2) 
 5640 NEXT LN 
 5645 LN=0:AV=5830:SYS GS,AV:RETURN 
 5650 REM ------------------------------- 
 5655 REM PARAMETERWAHL DURCH CURSOR 
 5670 REM HOCH 
 5675 LN=LN-1:IF LN<0  THEN LN=6 
 5680 GOSUB 5815:SYS GT,AV 
 5685 REM RUNTER 
 5690 LN=LN+1:IF LN>6  THEN LN=0 
 5695 GOSUB 5815:SYS GT,AV 
 5700 REM RECHTS 
 5705 AV=AV+30:IF AV>5950  THEN AV=5830 
 5710 GOSUB 5810:SYS GT,AV 
 5715 REM LINKS 
 5720 AV=AV-30:IF AV<5830  THEN AV=5950 
 5725 GOSUB 5810:SYS GT,AV 
 5800 REM ------------------------------- 
 5805 REM AKTUELES PARAMETERFELD FARBE 1 
 5810 SYS PR,6,34,"{4SPACE}" 
 5815 FOR I=PB TOPB+6:POKE I,F1:NEXT :RETURN 
 5820 REM ------------------------------- 
 5825 REM LFOF ANWAEHLEN 
 5830 PB=FA+40*(LN+3)+4 
 5835 FOR I=PB  TO PB+5:POKE I,F2:NEXT 
 5840 PA=MO+32+5*LN:PW=USR (PA):PM=65536 
 5845 P1=1:P2=200:PV=2610:RETURN 
 5850 REM ------------------------------- 
 5855 REM LFOP ANWAEHLEN 
 5860 PB=FA+40*(LN+3)+11 
 5865 FOR I=PB  TO PB+3:POKE I,F2:NEXT 
 5870 PA=MO+34+5*LN:PW=PEEK (PA):PM=256 
 5875 P1=1:P2=10 :PV=2640:RETURN 
 5880 REM ------------------------------- 
 5885 REM LFOA WAEHLEN 
 5890 PB=FA+40*(LN+3)+16 
 5895 FOR I=PB  TO PB+3:POKE I,F2:NEXT 
 5900 PA=MO+35+5*LN:PW=PEEK (PA):PM=256 
 5905 P1=1:P2=10 :PV=2670:RETURN 
 5910 REM ------------------------------- 
 5915 REM LFO KURVE WAEHLEN 
 5920 PB=FA+40*(LN+3)+21 
 5925 FOR I=PB  TO PB+5:POKE I,F2:NEXT 
 5930 PA=MO+36+5*LN:PV=2700 
 5935 B=(PEEK (PA) AND 24)/8:GOTO 2717 
 5940 REM ------------------------------- 
 5945 REM LFO MODUS WAEHLEN 
 5950 PB=FA+40*(LN+3)+28 
 5955 FOR J=PB  TO PB+4:POKE J,F2:NEXT 
 5960 PA=MO+36+5*LN 
 5965 PV=2730:RETURN 
 6000 REM =============================== 
 6010 REM UNTERMENUE EG 
 6020 REM =============================== 
 6030 M=4:SYS CL:PRINT"{HOME,RVOFF}";F1$ 
 6040 PRINT" SOFTWARE-EG":PRINT:PRINT 
 6050 PRINT" ACCCCRCCCCRCCCCRCCCCRCCCCRCCCCCRCCCCCS" 
 6060 PRINT" B{2SPACE}A B{2SPACE}D B{2SPACE}S B{2SPACE}R B EGAB FORMBMODUSB" 
 6070 PRINT" QCCCC+CCCC+CCCC+CCCC+CCCC+CCCCC+CCCCCW" 
 6080 PRINT" B{4SPACE}B{4SPACE}B{4SPACE}B{4SPACE}B{4SPACE}B{5SPACE}B{5SPACE}B" 
 6090 PRINT" ZCCCCECCCCECCCCECCCCECCCCECCCCCECCCCCX" 
 6100 SYS PR,10,1,F2$;"F1":PRINT" F3" 
 6110 PRINT" F5":PRINT" F7";F1$ 
 6120 SYS PR,10,13,"++{18SPACE}RESET" 
 6130 SYS PR,11,13,"+{15SPACE}+{3SPACE}HOLD" 
 6140 SYS PR,12,13,"-{15SPACE}-{3SPACE}RUN" 
 6150 SYS PR,13,13,"--" 
 6160 FOR I=0  TO 4 
 6170 : PW=PEEK (MO+67+I) 
 6180 : SYS PR,7,6+5*I-LEN (STR$ (PW)),PW 
 6190 NEXT I 
 6210 PW=PEEK (MO+72) 
 6220 SYS PR,7,29,CHR$ (43+(PW AND 8)/4) 
 6230 SYS PR,7,33,MD$((PW AND 6)/2) 
 6240 AV=6310:AN=0:SYS GT,AV 
 6300 REM ------------------------------- 
 6305 REM A D S R EGA (AN=0-4) WAEHLEN 
 6310 PB=FA+282+5*AN:S=2+5*AN 
 6315 FOR I=PB  TO PB+3:POKE I,F2:NEXT 
 6320 PA=MO+67+AN  :PW=PEEK (PA) 
 6325 PM=256:IF AN=0  THEN PM=129 
 6330 P1=1:P2=10:PV=2760:RETURN 
 6335 REM ------------------------------- 
 6340 REM EG FORM WAEHLEN 
 6345 PB=FA+280+27:POKE PB+2,F2 
 6350 PA=MO+72:PV=2780:RETURN 
 6370 REM ------------------------------- 
 6375 REM EG MODUS WAEHLEN 
 6380 PB=FA+280+33 
 6385 FOR I=PB  TO PB+4:POKE I,F2:NEXT 
 6390 PA=MO+72:PV=2820:RETURN 
 6395 REM ------------------------------- 
 6400 REM PARAMETERWAHL DURCH CURSOR 
 6405 REM LINKS 
 6410 IF AV<>6310  THEN 6420 
 6415 AN=AN-1:IF AN>=0  THEN 6430 
 6420 AV=AV-35:AN=4 
 6425 IF AV<6310  THEN AV=6380 
 6430 GOSUB 5815:SYS GT,AV 
 6435 REM RECHTS 
 6440 IF AV<>6310  THEN 6450 
 6445 AN=AN+1:IF AN<=4  THEN 6460 
 6450 AV=AV+35 
 6455 IF AV>6380  THEN AV=6310:AN=0 
 6460 GOSUB 5815:SYS GT,AV 
 6500 REM =============================== 
 6510 REM UNTERMENUE KSV 
 6520 REM =============================== 
 6530 M=5:PV=0:PRINT"{RVOFF}";:SYS CL 
 6540 SYS PR,1,1,F1$;"KREUZSCHIENEN-VERTEILER" 
 6550 SYS PR,3,1,"E{4SPACE}LFO" 
 6560 SYS PR,4,1,"G6543210" 
 6570 SYS PR,5,1,F2$;"@@@@@@@@" 
 6580 A$=F2$+"M"+F1$+"{8SPACE}"+F2$+"T "+F1$ 
 6590 PRINT A$;"F1";F2$;"{5SPACE}CURSORTASTEN" 
 6600 PRINT A$;"F2" 
 6610 PRINT A$;"F3" 
 6620 PRINT A$;"P1";F2$;"{5SPACE}F1 ";F1$;"VERBINDUNG" 
 6630 PRINT A$;"P2" 
 6640 PRINT A$;"P3";F2$;"{5SPACE}F7 ";F1$;"KEINE VERBINDUNG" 
 6650 PRINT A$;"FILT" 
 6660 PRINT A$;"LAUT" 
 6670 PRINT F2$;" TTTTTTTT" 
 6680 FOR Z=0  TO 7:GOSUB 6730:NEXT 
 6685 Z=0:S=7:POKE 55296+40*(6+Z)+8-S,F2 
 6690 RETURN 
 6700 REM ------------------------------- 
 6710 REM KSV-BYTE Z ANZEIGEN 
 6720 REM ------------------------------- 
 6730 B=PEEK (MO+24+Z):A=128 
 6740 SYS PR,6+Z,1,F1$;"{RVSON}00000000" 
 6750 IF B=0  THEN RETURN 
 6760 FOR S=7  TO 0 STEP -1 
 6770 IF (B AND A) THENSYS PR,6+Z,8-S,"{RVSON}1"; 
 6780 A=A/2:NEXT S 
 6790 PRINT F1$;:RETURN 
 6800 REM ------------------------------- 
 6810 REM CURSORBEWEGUNGEN 
 6820 REM ------------------------------- 
 6830 POKE 55296+40*(6+Z)+8-S,F1:REM AUS 
 6840 Z=(Z-1) AND 7:GOTO 6910:REM HOCH 
 6850 POKE 55296+40*(6+Z)+8-S,F1 
 6860 Z=(Z+1) AND 7:GOTO 6910:REM RUNTER 
 6870 POKE 55296+40*(6+Z)+8-S,F1 
 6880 S=(S+1) AND 7:GOTO 6910:REM LINKS 
 6890 POKE 55296+40*(6+Z)+8-S,F1 
 6900 S=(S-1) AND 7:GOTO 6910:REM RECHTS 
 6910 POKE 55296+40*(6+Z)+8-S,F2:REM AN 
 6915 RETURN 
 6920 REM ------------------------------- 
 6925 REM KSV BIT Z,S SETZEN 
 6930 REM ------------------------------- 
 6935 AD=MO+24+Z 
 6940 POKE AD,PEEK (AD) OR 2^S 
 6950 POKE 1024+40*(6+Z)+8-S,177:RETURN 
 6960 REM ------------------------------- 
 6965 REM KSV BIT Z,S SETZEN 
 6970 REM ------------------------------- 
 6975 AD=MO+24+Z 
 6980 POKE AD,PEEK (AD) AND (255-2^S) 
 6990 POKE 1024+40*(6+Z)+8-S,176:RETURN 
 7000 REM =============================== 
 7005 REM UNTERMENUE SOUNDS 
 7010 REM =============================== 
 7015 M=6:PV=0:SYS CL:PRINT"{HOME,RVOFF}";F2$ 
 7020 SYS PR,1,8,"A{11SPACE}B{11SPACE}C" 
 7025 PRINT F1$;"{3SPACE}ACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCS" 
 7030 FOR I=1  TO 8 
 7035 SYS PR,2+I,1,F2$;CHR$ (48+I);F1$" B" 
 7040 SYS PR,2+I,38,"B":NEXT 
 7045 SYS PR,11,3,"ZCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCX" 
 7050 SYS PR,12,4,F2$;"A-C 1-8" 
 7055 SYS PR,12,13,F1$;"SOUND WAEHLEN" 
 7060 SYS PR,13,1,F2$;"←{2SPACE}A-C 1-8" 
 7065 SYS PR,13,13,F1$"SOUND ABSPEICHERN" 
 7070 SYS PR,14,1,F2$;"N" 
 7075 SYS PR,14,13,F1$;"NAMEN EINGEBEN (RETURN)" 
 7080 FOR S=0  TO 2:FOR Z=0  TO 7 
 7085 : SYS PR,3+Z,4+S*12,; 
 7090 : SYS NA,SO+107*(8*S+Z)+97 
 7095 NEXT :NEXT :IF NS<0 THENZ=0:S=0:RETURN 
 7100 Z=NS AND 7:S=INT (NS/8):GOTO 7180 
 7110 REM ------------------------------- 
 7115 REM SOUND WAEHLEN (A,B,C) 
 7120 X=A-65 :REM SPALTE 0,1,2 
 7122 SYS PR,12,13,F2$;"{RVOFF}SOUND WAEHLEN" 
 7125 GET A$:IF A$=""  THEN 7125 
 7130 Y=ASC (A$)-49:REM ZEILE 
 7135 IF Y<0 OR Y>7  THEN 7142 
 7140 GOSUB 7150:GOSUB 7400 
 7142 SYS PR,12,13,F1$;"{RVOFF}SOUND WAEHLEN" 
 7144 RETURN 
 7146 REM ------------------------------- 
 7150 REM ALTES NAMENFELD NORMAL 
 7155 NS=8*S+Z 
 7160 : SYS PR,3+Z,4+S*12,F1$;"{RVOFF}"; 
 7165 : SYS NA,SO+107*NS+97 
 7170 REM NEUES NAMENFELD HERVORHEBEN 
 7175 S=X:Z=Y:NS=8*S+Z 
 7180 : SYS PR,3+Z,4+S*12,F2$;"{RVOFF}"; 
 7185 : SYS NA,SO+107*NS+97 
 7190 RETURN 
 7200 REM ------------------------------- 
 7205 REM SOUND ABSPEICHERN 
 7210 SYS PR,13,13,F2$;"{RVOFF}SOUND ABSPEICHERN" 
 7215 GET A$:IF A$=""  THEN 7215 
 7220 X=ASC (A$)-65:REM SPALTE 
 7225 IF X<0 OR X>2  THEN 7250 
 7230 GET A$:IF A$=""  THEN 7230 
 7235 Y=ASC (A$)-49:REM ZEILE 
 7240 IF Y<0 OR Y>7  THEN 7250 
 7245 GOSUB 7150:GOSUB 7450:GOTO 7260 
 7250 SYS PR,13,13,F1$;"{RVOFF}SOUND ABSPEICHERN" 
 7255 RETURN 
 7260 SYS PR,13,13,F1$;"{RVOFF}SOUND ABSPEICHERN" 
 7300 REM ------------------------------- 
 7305 REM NAMEN EINGEBEN (Z,S,NS) 
 7310 SYS PR,14,13,F2$;"NAMEN EINGEBEN (RETURN)" 
 7315 X=12*S+4:Y=Z+3:AD=1024+40*Y+X 
 7320 SA=SO+107*NS+97:I=0 
 7325 POKE AD+I,PEEK (AD+I) OR 128 
 7330 GET A$:IF A$=""  THEN 7330 
 7335 A=ASC (A$):IF A<32OR A>95  THEN 7370 
 7340 REM ZEICHEN AUSGEBEN 
 7345 SYS PR,Y,X+I,F2$;A$;:POKE SA+I,A 
 7350 I=I+1 
 7355 IF I>9  THEN I=9:GOTO 7325 
 7360 IF I<0  THEN I=0 
 7365 GOTO 7325 
 7370 IF A=29  THEN POKE AD+I,PEEK (AD+I) AND 127:GOTO 7350 
 7375 IF A=157 THEN POKE AD+I,PEEK (AD+I) AND 127:I=I-1:GOTO 7355 
 7380 IF A<>13  THEN 7330 
 7385 POKE AD+I,PEEK (AD+I) AND 127 
 7390 SYS PR,14,13,F1$;"NAMEN EINGEBEN (RETURN)" 
 7395 RETURN 
 7400 REM ------------------------------- 
 7402 REM PARAMETERSATZ NS HOLEN 
 7404 SA=SO+NS*107:SYS GE,SA 
 7406 FOR I=0  TO 2 
 7408 : AD=SA+7*I 
 7410 : BF(I)=USR (AD+73) 
 7412 : X=BF(I)/17.0327/440 
 7414 : Y=LOG (X)/LOG (2) :REM X=2↑Y 
 7416 : Y=Y+4+9/12+49/1200 
 7418 : O(I)=INT (Y):Y=(Y-O(I))*12 
 7420 : T(I)=INT (Y) 
 7422 : OF(I)=INT ((Y-T(I))*100-48.5) 
 7424 : S(I)=(PEEK (AD+75)=1) 
 7426 : A$=CHR$ (49+I):GOSUB 3570 
 7428 : C(I)=PEEK (AD+77) AND 254 
 7430 : C1(I)=C(I) OR 1 
 7432 : AD(I)=PEEK (AD+78) 
 7434 : SR(I)=PEEK (AD+79) 
 7436 NEXT I 
 7438 RF=PEEK (SA+94) 
 7440 EG=(PEEK (SA+95)=1):GOSUB 3740 
 7442 SU=(PEEK (SA+96)=1):GOSUB 3840 
 7444 RETURN 
 7450 REM ------------------------------- 
 7452 REM PARAMETERSATZ NS ABSPEICHERN 
 7454 SA=SO+NS*107:SYS PU,SA 
 7456 FOR SN=0  TO 2 
 7458 : AD=SA+7*SN 
 7460 : SYS DO,AD+73,BF(SN) 
 7462 : POKE AD+75,-S(SN) 
 7464 : POKE AD+77,C(SN) 
 7466 : POKE AD+78,AD(SN) 
 7468 : POKE AD+79,SR(SN) 
 7470 NEXT SN 
 7472 POKE SA+94,RF 
 7474 POKE SA+95,-EG 
 7476 POKE SA+96,-SU 
 7478 RETURN 
 7500 REM =============================== 
 7505 REM UNTERMENUE DISKETTE 
 7510 REM =============================== 
 7515 M=7:PV=0:SYS CL:PRINT"{HOME}";F1$ 
 7520 PRINT" DISK" 
 7525 SYS PR,5,4,F2$;"F1" 
 7530 SYS PR,5,7,F1$;"SOUNDS LADEN" 
 7535 SYS PR,7,4,F2$;"F3" 
 7540 SYS PR,7,7,F1$;"SOUNDS ABSPEICHERN" 
 7545 RETURN 
 7600 REM ------------------------------- 
 7605 REM SOUNDS LADEN 
 7610 SYS PR,5,7,F2$;"SOUNDS LADEN" 
 7615 SYS PR,10,4,F1$;"DATEINAME "; 
 7620 DN$="SOUNDS{14SPACE}" 
 7625 SYS PR,10,16,DN$ 
 7630 SYS PR,10,14,;:INPUT DN$ 
 7635 OPEN 8,8,8,DN$+",P,R":CLOSE 8 
 7640 OPEN 1,8,15:INPUT#1,A,A$,X,Y:CLOSE 1 
 7645 SYS PR,12,4,"{29SPACE}" 
 7650 IF A=0  THEN 7660 
 7655 SYS PR,12,3,A;A$;X;Y:GOTO 7625 
 7660 A=0:LOAD DN$,8,1 
 7665 SYS PR,5,7,F1$;"SOUNDS LADEN" 
 7670 NS=-1:A=211:GOTO 1550 
 7700 REM ------------------------------- 
 7705 REM SOUNDS ABSPEICHERN 
 7710 SYS PR,7,7,F2$;"SOUNDS ABSPEICHERN" 
 7715 SYS PR,10,4,F1$;"DATEINAME "; 
 7720 DN$="SOUNDS{14SPACE}" 
 7725 SYS PR,10,16,DN$ 
 7730 SYS PR,10,14,;:INPUT DN$ 
 7735 SYS 50198:REM MODULATOR AUS 
 7740 REM BEREICH $8000-$8A08 AUF DISK 
 7745 OPEN 1,8,1,"@:"+DN$ 
 7750 POKE 252,0:POKE 253,144:REM $9000 
 7755 POKE 780,252:REM AKKU 
 7760 POKE 781,8  :REM X-REG = $08 
 7765 POKE 782,154:REM Y-REG = $9A 
 7770 SYS 65496   :REM KERNAL SAVE 
 7775 CLOSE 1 
 7780 OPEN 1,8,15:INPUT#1,A,A$,X,Y:CLOSE 1 
 7785 IF A=0  THEN 7795 
 7790 SYS PR,12,4,A;A$;X;Y:GOTO 7725 
 7795 SYS PR,12,4,"{30SPACE}" 
 7800 SYS PR,7,7,F1$;"SOUNDS ABSPEICHERN" 
 7805 SYS 50185:RETURN :REM MODULATOR AN 
 8000 REM =============================== 
 8010 REM VORBESETZUNG, INITIALISIERUNG 
 8020 REM =============================== 
 8030 PRINT"{CLR,12DOWN,7SPACE}"; 
 8035 PRINT"BITTE 30 SEKUNDEN WARTEN" 
 8040 REM ------------------------------- 
 8045 REM MS-PROGRAMME IN KASSETTENPUF. 
 8050 FOR I=0  TO 22   :REM KERNAL-GOSUB 
 8055 POKE 828+I,PEEK (43139+I):NEXT 
 8060 FOR I=0 TO129:READ X:POKE 851+I,X:NEXT 
 8065 POKE 785,169:POKE 786,3:REM USR 
 8070 REM ------------------------------- 
 8072 REM MS-PROGRAMME AB $C423 
 8074 FOR I=50211  TO 50291 
 8076 READ X:POKE I,X:NEXT 
 8078 REM ------------------------------- 
 8080 REM NAMEN DER TOENE 
 8082 FOR I=0  TO 11:READ TN$(I):NEXT 
 8100 REM ------------------------------- 
 8110 REM SPRUNGVEKTOREN 
 8120 READ A$:L=LEN (A$) 
 8130 ON L GOTO 8150,8220,8280,8310 
 8150 REM L=1  ASCII-ZEICHEN 
 8160 A=ASC (A$) 
 8170 IF M>=0  THEN V%(M,A)=ZN:GOTO 8120 
 8180 FOR I=0  TO 7:V%(I,A)=ZN:NEXT 
 8190 GOTO 8120 
 8200 IF LEFT$ (A$,1)<>"M"  THEN 8120 
 8220 REM L=2  MENUE-INDIKATOR 
 8230 IF LEFT$ (A$,1)<>"M"  THEN 8120 
 8240 A$=RIGHT$ (A$,1) 
 8250 IF A$="A"  THEN M=-1 :GOTO 8120 
 8260 M=VAL (A$)           :GOTO 8120 
 8280 REM L=3  ASCII-WERT 
 8290 A=VAL (A$) :GOTO 8170 
 8310 REM L=4  ZEILENNUMMER ODER ENDE 
 8320 IF A$="ENDE"  THEN 8340 
 8330 ZN=VAL (A$) :GOTO 8120 
 8340 REM ------------------------------- 
 8350 REM TONNUMMERN 
 8360 A$="Q2W3ER5T6Y7UI9O0P@-*£↑{HOME};=" 
 8370 FOR I=0  TO 24 
 8380 : A=ASC (MID$ (A$,I+1,1)) 
 8390 : TN%(A)=I 
 8400 : FOR J=0  TO 7:V%(J,A)=2000:NEXT 
 8410 NEXT I 
 8450 REM ------------------------------- 
 8455 REM FREQUENZEN DER TONLEITER 
 8460 FOR I=0  TO 24:TH(I)=2^(I/12):NEXT 
 8465 REM ------------------------------- 
 8470 REM KONSTANTEN 
 8472 GS=828:GT=857:PR=869:DO=897:CL=959 
 8474 NA=50229:GE=50245:PU=50276 
 8480 SI=54272:MO=49152:FA=55296 
 8482 SO=36864 
 8484 F1$=CHR$ (154):F1=14 
 8490 F2$=CHR$ (5)  :F2=1 
 8495 KV$(0)="TRIAN ":KF$(0)="NMNM" 
 8500 KV$(1)="SAWUP ":KF$(1)="NLNL" 
 8505 KV$(2)="SAWDWN":KF$(2)="@M@M" 
 8510 KV$(3)="SQUARE":KF$(3)="OLOL" 
 8515 MD$(0)="RESET" :MD$(1)="RESET" 
 8520 MD$(2)="HOLD " :MD$(3)="RUN{2SPACE}" 
 8525 BL$(0)="":BL$(1)=" ":BL$(2)="{2SPACE}" 
 8530 BL$(3)="{3SPACE}":BL$(4)="{4SPACE}" 
 8535 BL$(5)="{5SPACE}":BL$(6)="{6SPACE}" 
 8540 REM ------------------------------- 
 8545 REM SOUNDPARAMETER VORBESETZUNGEN 
 8550 FOR SN=0  TO 2 
 8555 : POKE SI+7*SN+5,10 :AD(SN)=10 
 8560 : POKE SI+7*SN+6,138:SR(SN)=138 
 8565 : O(SN)=3+SN:OF(SN)=0:T(SN)=0 
 8570 : BF=440*2^(O(SN)-4+(T(SN)-9)/12+OF(SN)/1200) 
 8572 : BF(SN)=BF*17.0327 
 8575 :  C(SN)=64         :C1(SN)=65 
 8580 :  S(SN)=(SN=0) 
 8585 : SYS DO,MO+7*SN+2,2048 :REM PW 
 8590 : POKE  MO+7*SN+4,0    :REM PORTA 
 8595 NEXT SN 
 8600 POKE  SI+23,0:RF=0  :REM RES/FILT 
 8605 SYS DO,MO+21,0       :REM FILTERFR. 
 8610 POKE  MO+23,15      :REM MOD/LAUT 
 8615 FOR I=24  TO 72 :REM KSV,LFO,EG AUS 
 8620 : POKE MO+I,0:NEXT 
 8625 EG=0         :REM EG ABKOPPELN 
 8630 SU=0         :REM SUSTAIN AUS 
 8635 REM ------------------------------- 
 8640 REM SOUNDS VORBESETZEN 
 8645 FOR NS=0  TO 23 
 8650 : GOSUB 7450 
 8655 : AD=SO+107*NS+97 
 8660 : FOR I=AD  TO AD+9:POKE I,46:NEXT 
 8665 NEXT NS:NS=0 
 8700 REM ------------------------------- 
 8870 REM FARBEN, BILD, MODULATOR 
 8880 POKE 53280,14:POKE 53281,6 
 8890 PRINT F1$;"{RVOFF}";:POKE 650,128 
 8900 GOSUB 4200 :REM BILD ZEILEN 15-23 
 8910 SYS MO+1033:REM MODULATOR AKTIV. 
 8920 A=2:RETURN 
 9000 REM =============================== 
 9010 REM DATAS 
 9020 REM =============================== 
 9030 REM MASCHINENPROGRAMME 
 9060 DATA 032,089,003,076,174,167,032 
 9070 DATA 253,174,032,138,173,032,247 
 9080 DATA 183,076,163,168,032,253,174 
 9090 DATA 032,158,183,138,072,032,253 
 9100 DATA 174,032,158,183,138,168,104 
 9110 DATA 170,024,032,240,255,032,253 
 9120 DATA 174,076,160,170,032,253,174 
 9130 DATA 032,138,173,032,247,183,165 
 9140 DATA 020,133,158,165,021,133,159 
 9150 DATA 032,253,174,032,138,173,032 
 9160 DATA 247,183,160,000,120,165,020 
 9170 DATA 145,158,200,165,021,145,158 
 9180 DATA 088,096,032,247,183,160,000 
 9190 DATA 120,177,020,133,099,200,177 
 9200 DATA 020,088,133,098,162,144,056 
 9210 DATA 076,073,188,169,032,162,000 
 9220 DATA 157,000,004,157,000,005,202 
 9230 DATA 208,247,162,087,157,000,006 
 9240 DATA 202,016,250,096 
 9250 REM ------------------------------- 
 9260 REM MASCHINENPROGRAMME AB $C423 
 9270 DATA 032,253,174,032,138,173,032 
 9280 DATA 247,183,165,020,133,158,165 
 9290 DATA 021,133,159,096,032,035,196 
 9300 DATA 160,000,177,158,032,210,255 
 9310 DATA 200,192,010,208,246,096,032 
 9320 DATA 035,196,160,000,177,158,153 
 9330 DATA 000,192,200,192,073,208,246 
 9340 DATA 177,158,153,183,211,200,192 
 9350 DATA 094,208,246,177,158,141,023 
 9360 DATA 212,096,032,035,196,160,000 
 9370 DATA 185,000,192,145,158,200,192 
 9380 DATA 073,208,246,096 
 9400 REM ------------------------------- 
 9410 REM  NAMEN DER TOENE 
 9420 DATA C,C#,D,D#,E,F,F#,G,G#,A,A#,H 
 9500 REM ------------------------------- 
 9510 REM DATAS FUER SPRUNGVERTEILER 
 9520 DATA MA,4000,X,3500,V,3600,032 
 9530 DATA MA,3700,160,3800,S 
 9540 DATA MA,2550,133,2560,134 
 9550 DATA MA,2570,135,2580,136,4500,214 
 9555 DATA MA,5500,L,6000,H,6500,K 
 9560 DATA MA,5000,F,7000,211,7500,D 
 9565 DATA M1,4654,145,4660,017 
 9570 DATA M1,4666,029,4680,157 
 9580 DATA M2,5160,157,5145,029 
 9600 DATA M3,5675,145,5690,017 
 9610 DATA M3,5720,157,5705,029 
 9620 DATA M4,6410,157,6440,029 
 9630 DATA M5,6830,145,6850,017 
 9640 DATA M5,6870,157,6890,029 
 9650 DATA M5,6935,133,134,6975,135,136 
 9700 DATA M6,7110,A,B,C,7200,←,7300,N 
 9750 DATA M7,7600,133,7700,134 
 9900 DATA ENDE 
Listing »Sound-Editor«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →