MUSIC
MUSIC | |
Syntax: | MUSIC <d>, <str> |
Parameter | |
d: Tempo (0..255) | |
str: Steuer-String für das Musikstück | |
Einordnung | |
Typ: | Anweisung |
Kontext: | Soundkontrolle |
Aufgabe: | Festlegen und Steuern der Musik |
Abkürzung: | keine (TSB: muS) |
Token: | $64 $1e (100 30) |
Verwandte Befehle | |
WAVE - ENVELOPE - PLAY - VOL |
Dieser Artikel beschreibt das Simons'-Basic-Schlüsselwort MUSIC.
Typ: Anweisung
Syntax: MUSIC <d>, <str>
MUSIC definiert ein Musikstück und seinen Ablauf. Simons'-Basic-Musikstücke sind einstimmig. Es ist mit MUSIC nur mit großem organisatorischem Aufwand möglich, (scheinbar) mehrere parallel erklingende Melodien zu erstellen.
Der Parameter <d> legt die Basiseinheit der Dauer der kürzesten Note fest (z.B. eine Sechzehntelnote, eine Note mit zwei Fähnchen). Alle anderen Notenlängen sind Vielfache davon (siehe unten). Dieser Parameter bestimmt also das Tempo des Musikstücks.
Im Parameter <str> ist ein String-Ausdruck, in dem die SID-Stimmen, die zu spielenden Noten, ihre individuelle Dauer und ein paar weitere Eigenschaften des Musikstücks festgelegt werden. Es gibt dazu drei verschiedene Arten von Steuerzeichen.
Steuerzeichen[Bearbeiten | Quelltext bearbeiten]
Noten[Bearbeiten | Quelltext bearbeiten]
Zuerst die Steuerzeichen für Noten. Sie entsprechen im Wesentlichen den üblichen Notennamen (wobei das h durch b dargestellt wird; h ist eine ausschließlich deutsche Notenbezeichnung).
c - d - e - f - g - a - b
Die Halbtöne (schwarze Tasten auf dem Klavier) erreicht man zusammen mit Shift (für die Tonerhöhung) oder C= (für die Tonerniedrigung, wobei die Töne ces und fes - obwohl möglich - eher sehr ungewöhnlich sind). Das Feature der Tonerniedrigung steht nicht im Handbuch.
Mit Shift für: cis - dis - fis - gis - ais mit C= für: ces - des - es - (fes) - ges - as - bb
Hinter dem Notennamen folgt als Ziffer die zu spielende Oktave (0..7). Akzeptiert werden auch Oktavangaben über 7 hinaus. Der höchstmögliche Wert unter PAL ist Shift-a-8 bzw. C=-b-8 (die Note ais bzw. bb in der achten Oktave).
Eine Pause wird als Buchstabe z eingegeben. Auf z folgt ein beliebiges Zeichen, z.B. ein zweites "z" oder eine beliebige Oktavangabe. Danach natürlich die Dauer der Pause, siehe im nächsten Abschnitt. Ein x trennt aufeinanderfolgende gleiche Noten (verlängert aber geringfügig deren Dauer!) Der Ton fes ist in TSB nicht mehr enthalten (wenn nötig, durch ein e ersetzen).
Notenlänge[Bearbeiten | Quelltext bearbeiten]
Als nächstes setzt man die zweite Art von Steuerzeichen, die Notenlänge. Notenlängen werden durch die den Funktionstasten zugeordneten PETSCII-Zeichen eingegeben. Dabei ist der Notenwert der Taste F1 der Bezugswert für alle weiteren F-Tasten. Je nach Musikstück, das in MUSIC eingegeben werden soll, nimmt man für F1 den kürzesten im Musikstück vorkommenden Wert an, z.B. die Sechzehntelnote. Die sich daraus ergebenden Notenlängen sind in der folgenden Tabelle zusammengestellt (in allen offiziellen Publikationen zu Simons' Basic werden die hier aufgeführten Werte für die Dauer der Noten falsch angegeben, die Länge ergibt sich aus n mal Länge von F1, wobei n (1..8) ein Zähler für zuerst die ungeshifteten Funktionstasten 1, 3, 5 und 7 und dann für die geshifteten 2, 4, 6 und 8 ist):
Abweichungen von diesen Notenlängen sind nicht vorgesehen, so dass Triolen und musikalische Verzierungen nicht ohne Tricks eingegeben werden können.
Ablaufkontrolle[Bearbeiten | Quelltext bearbeiten]
Weitere steuernde Angaben werden im MUSIC-String grundsätzlich mit dem {clr}-Code eingeleitet (Shift +Clr/Home ). Im Handbuch werden nur zwei dieser Steueranweisungen aufgeführt, es gibt jedoch zusätzlich drei undokumentierte Codes. Die Codes im Einzelnen:
- {clr}+Ziffer
- Eine Stimme selektieren (Ziffer: 1, 2 oder 3). Muss eine Melodiedefinition mit MUSIC einleiten und gilt solange, bis sie geändert wird.
- {clr}+g
- Die aktuelle Stimme ausschalten (das Key-Bit wird auf 0 gesetzt, s. WAVE). Sollte am Ende eines MUSIC-Strings stehen.
- {clr}+t
- Das Sync-Bit für die aktuelle Stimme (s. WAVE) invertieren (Zweck siehe unten).
- {clr}+r
- Der MUSIC-String wird bis hierhin endlos wiederholt abgespielt, alle folgenden Noten werden ignoriert. Nur sinnvoll am String-Ende.
- {clr}+c
- Löscht die WAVE-Definition der aktuellen Stimme. Nur sinnvoll am String-Ende.
Erläuterungen:
- {clr}+t ergibt nur Sinn, wenn man zwei Stimmen kombiniert hat (was mit Simons'-Basic-Befehlen gar nicht ohne Tricks möglich ist, in TSB evtl. mit SOUND) und die zweite die erste beeinflussen soll. Immerhin kann man Stimme 3 unhörbar schalten (siehe VOL) und sie einen Ton abspielen lassen, der nicht aufhört (bei entsprechenden ENVELOPE-Einstellungen) und diesen auf Stimme 1 wirken lassen. Das geht aber auch nur, wenn Stimme 1 mit Dreiecksschwingung arbeitet (siehe WAVE).
- {clr}+r lässt ein Musikstück immer wieder ablaufen. Das ist nur sinnvoll, wenn man mit PLAY 2 arbeitet, da sonst das Programm blockiert wird. Um die Endlosschleife abbrechen zu können wäre eigentlich der Befehl PLAY 0 vorgesehen, der in Simons' Basic nicht diese Wirkung hat (in TSB behoben). Tatsächlich wirkt nur ein PLAY 1, aber damit bleibt das Programm oder ein interaktiver Aufruf stecken. Die Hintergrundmusik kann man jedoch mit der Sequenz
MUSIC 1, "{clr}1{clr}g{clr}2{clr}g{clr}3{clr}g": PLAY 2
- also mit einem neuen Hintergrundstück, das nur die Stimmen abstellt, zum Schweigen bringen.
- {clr}+c schaltet eine Stimme komplett ab, da dann für sie keine Definitionswerte mehr existieren (siehe WAVE). Nur sinnvoll bei Stücken mit Ringmodulation durch Stimme 3, wobei die Modulation irgendwo im Stück ausgeschaltet werden soll.
Frequenztabelle für Musiknoten[Bearbeiten | Quelltext bearbeiten]
Die Frequenzwerte für eine Musiknote werden mit Hilfe einer Tabelle bestimmt. Dafür braucht man nur die Werte der 12 Töne einer Oktave zu berechnen. Die Frequenzen aller weiteren Töne ergeben sich daraus ganz einfach, da derselbe Ton eine Oktave höher genau den doppelten Wert hat. Zur Notentabelle von Simons' Basic, die aus 20 Einträgen besteht, ist eine Frequenztabelle mit 20 Frequenzen in 16-Bit-Werten zugeordnet. Nach den 12 Tönen der Basis-Oktave folgen darin der Eintrag für eine musikalische Pause (Frequenzwert 0) und sieben Einträge für die erniedrigten Halbtöne. Deren Werte waren zwar bereits mit denen der erhöhten Halbtöne berechnet worden, programmiertechnisch ist es aber einfacher, sie im neuen Kontext (Noten erniedrigen) noch einmal aufzulisten.
Da die Frequenzen in der Tabelle von der Taktfrequenz des Chips (Eingang Phi 0) abhängig sind, werden untenstehend sowohl die Werte für den 1-MHz-Referenzwert von MOS (die Simons' Basic verwendet) als auch für die PAL-Version des C64 (0,98 MHz) und die NTSC-Version (1,02 MHz) angegeben. Die 16-Bit Zahlenwerte sind dabei im Hexadezimal-Format geschrieben. TSB benutzt die Werte in der Spalte "PAL".
Die Töne , die auf der 1-MHz-Basis berechnet wurden, klingen unter PAL etwas zu tief. Arndt Dettke hat dies daher in TSB mit der Version 2.30219 korrigiert.
Adresse der Frequenztabelle: $8BF2 (SB, erst Lo, dann Hi), $8B9E (TSB, nur Lo) bzw. $8A3F (TSBneo).
Offset | Note | Taste | SB (1 MHz) | PAL | NTSC |
---|---|---|---|---|---|
0 | c | c | 0112 | 0116 | 010c |
1 | c# | C | 0123 | 0127 | 011c |
2 | d | d | 0134 | 0139 | 012e |
3 | d# | D | 0146 | 014b | 013e |
4 | e | e | 015a | 015f | 0152 |
5 | f | f | 016e | 0174 | 0166 |
6 | f# | F | 0184 | 018a | 017b |
7 | g | g | 019b | 01a1 | 0192 |
8 | g# | G | 01b3 | 01ba | 01ab |
9 | a | a | 01cd | 01d4 | 01c3 |
10 | a# | A | 01e9 | 01f0 | 01dd |
11 | b | b | 0206 | 020e | 01fb |
12 | z | z | 0000 | 0000 | 0000 |
13 | des | C=d | 0123 | 0127 | 011c |
14 | es | C=e | 0146 | 014b | 013e |
15 | fes | C=f | 015a | 015f | 0152 |
16 | ges | C=g | 0184 | 018a | 017b |
17 | as | C=a | 01b3 | 01ba | 01ab |
18 | bb | C=b | 01e9 | 01f0 | 01dd |
19 | ces | C=c | 0206 | 020e | 01fb |
Mit einigen POKEs ist es nun möglich, in TSB (geht nur bei der Diskettenversion) die Tabelle so zu ändern, dass sie für einen NTSC-C64 passt:
10 FT=$8B9E : REM $8A3F in tsbneo 20 FOR I=0 TO 19: READ LO: POKE FT+I,LO: NEXT 30 POKE $8B51,$D0:POKE $8B52,7 : REM $9CD9/A in tsbneo 40 END 50 DATA 12,28,46,62,82,102,123,146 51 DATA 171,195,221,251,0,28,62,82 52 DATA 123,171,221,251
Verwendungshinweise[Bearbeiten | Quelltext bearbeiten]
Fehlt die Selektion einer Stimme mit {clr}+Ziffer, stürzt Simons' Basic bei PLAY ab (behoben in TSB).
Ein MUSIC-String sollte also prinzipiell diese Form aufweisen (ohne Leerzeichen!):
"{clr}1 c1{f3} {clr}g"
spielt mit Stimme 1 („{clr}1“) den Ton c in Oktave 1 („c1“) als Viertelnote („{f3}“) und beendet das Musikstück nach Ablauf der ENVELOPE-Parameter („{clr}g“).
Wie bei allen Strings ist auch der MUSIC-String auf eine maximale Länge von 255 Zeichen begrenzt. Lange Musikstücke sind unter Simons' Basic mit PLAY 2 (d.h. die unabhängig vom Programmlauf spielen) also nicht möglich.
Insgesamt sind die Möglichkeiten der Musikprogrammierung unter Simons' Basic eher enttäuschend und man sollte Musikstücke besser mit entsprechenden Spezialprogrammen erstellen.
Wird bei MUSIC kein Parameter eingegeben, so erscheint die Fehlermeldung ?SYNTAX ERROR.
Beispiele[Bearbeiten | Quelltext bearbeiten]
Dieses Programm spielt eine sehr lang dauernde (ca. 12 s) Viertelnote c in der zweiten Oktave:
100 VOL 15 110 ENVELOPE 1,1,8,10,10 120 WAVE 1, 00100001 130 MUSIC 150, "{clr}1c2{f3}{clr}g" 140 PLAY 1 150 VOL 0
Damit kann ein im Hintergrund spielendes Musikstück beendet werden, indem alle Stimmen abgeschaltet werden:
MUSIC 1, "{clr}1{clr}g{clr}2{clr}g{clr}3{clr}g" PLAY 2
Ein etwas aufwändigeres Anwendungsbeispiel findet sich beim Simons-BASIC-Befehl MOB SET Beispiel 2.
$ | % | @ | ANGL | ARC | AT | AUTO | BCKGNDS | BFLASH | BLOCK | CALL | CENTRE | CGOTO | CHAR | CHECK | CIRCLE | CMOB | COLD | COLOUR | COPY | CSET | DELAY | DESIGN | DETECT | DIR | DISABLE | DISAPA | DISK | DISPLAY | DIV | DOWN | DRAW | DUMP | DUP | ELSE | END LOOP | END PROC | ENVELOPE | ERRLN | ERRN | EXEC | EXIT | EXOR | FCHR | FCOL | FETCH | FILL | FIND | FLASH | FRAC | GLOBAL | GRAPHICS | HI COL | HIRES | HRDCPY | INKEY | INSERT | INST | INV | JOY | KEY | LEFT | LIN | LINE | LOCAL | LOOP | LOW COL | MEM | MERGE | MMOB | MOB OFF | MOB SET | MOD | MOVE | MULTI | MUSIC | NO ERROR | NRM | OFF | OLD | ON ERROR | ON KEY | OPTION | OUT | PAGE | PAINT | PAUSE | PENX | PENY | PLACE | PLAY | PLOT | POT | PROC | RCOMP | REC | RENUMBER | REPEAT | RESET | RESUME | RETRACE | RIGHT | RLOCMOB | ROT | SCRLD | SCRSV | SECURE | SOUND | TEST | TEXT | TRACE | UNTIL | UP | USE | VOL | WAVE