MUSIC

Aus C64-Wiki
Zur Navigation springenZur Suche springen
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):

F-Taste Code (ZS1 - ZS2) Note auf Basis 16tel Note auf Basis Achtel
{F1} Zeichensatz1 197.png -  E  Sechzehntel Achtel
{F3} Zeichensatz1 198.png -  F  Achtel Viertel
{F5} Zeichensatz1 199.png -  G  punktierte Achtel punktierte Viertel
{F7} Zeichensatz1 200.png -  H  Viertel Halbe
{F2} Zeichensatz1 201.png -  I  Viertel-Sechzehntel-Ligatur Halbe-Achtel-Ligatur
{F4} Zeichensatz1 202.png -  J  punktierte Viertel punktierte Halbe
{F6} Zeichensatz1 203.png  -  K  doppelt punktierte Viertel doppelt punktierte Halbe
{F8} Zeichensatz1 204.png -  L  Halbe Ganze

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.