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:
10
FORI=1 TO 10
20
READ AD:POKE AD,2:NEXT I
30
DATA 49339,49344,49734,49744,50115
40
DATA 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.
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ü SoundsBild 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
Relativadresse
Parameter
Variable in Basic (falls vorhanden)
dezimal
hex
0 — 72
$00 — $48
Modulator-Parameter
keine
73 — 74
$49 — $4A
Basisfrequenz Stimme 1
BF(2)
75
$4B
Status Stimme 1 (0 = inaktiv, 1 = aktiv)
S(2)
76
$4C
unbenutzt
77
$4D
Control Register Stimme 1
C(2)
78
$4E
Attach/Decay Stimme 1
AD(2)
79
$4F
Sustain/Release Stimme 1
SR(2)
80 — 86
$50 — $56
analog Stimme 2 (7 Byte)
87 — 93
$57 — $5D
analog Stimme 3 (7 Byte)
94
$5E
Resonanz/Filter
RF
95
$5F
Status des Soft-EG (0 - abgekoppelt, 1 = angekoppelt)
EG
96
$60
Status Sustain (0 = aus, 1 = an)
SU
97 — 106
$61 — $6A
Name 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}BBBBBBBBBBBBBB{SPACE,RVOFF}":NEXT 4330 PRINT"{SPACE,RVSON}QBWBEBRBTBYBUBIBOBPB@B*B↑B;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,"BB{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