TEMPO

Aus C64-Wiki
Zur Navigation springenZur Suche springen
TEMPO
Syntax: TEMPO <n>
Parameter
<n>: numerischer Ausdruck im Wertebereich von 1 bis 255
Einordnung
Typ: Anweisung
Kontext: Tonerzeugung
Aufgabe: Spieltempo für das Abspielen von Musiknoten festlegen
Abkürzung: teM
Token: $fe $05 (254 5)
Verwandte Befehle
ENVELOPE, FILTER, PLAY, VOL

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl TEMPO ab Commodore BASIC V7.0 oder höher.

Die Anweisung TEMPO gibt das Spieltempo für das Abspielen bzw. Anschlagen einer Musiknote mittels PLAY vor.

Der Parameter n wird als ganzzahliger Wert aufgefasst und kann Werte von 1 (lang anhaltender Ton) bis 255 (kurz angeschlagen) annehmen. Voreingestellt ist der Wert 16. Parameterwerte außerhalb dieses Bereichs führen zur BASIC-Fehlermeldung ?ILLEGAL QUANTITY ERROR. Eine von der Programmiersyntax abweichende Parameteranzahl löst einen ?SYNTAX ERROR aus.

Die Dauer eines Volltons bei TEMPO N kann wie folgt berechnet werden (in Sekunden):

Videostandard Dauer exakt Dauer näherungsweise
PAL (INT(1152/N)+1)/50 23.06/N
NTSC (INT(1152/N)+1)/60 19.22/N


Beispiele[Bearbeiten | Quelltext bearbeiten]

Tondauer nach einem Systemstart herstellen[Bearbeiten | Quelltext bearbeiten]

100 TEMPO 16: PLAY "Q"      Zustand nach Systemstart: Tempo 16 und 1/4 Noten
110 T0=TI                   Zeitmessung beginnen
120 PLAY "CM"               einen Ton anschlagen und abwarten
130 D=TI-T0                 Messung Ende, Zeitdauer
140 PRINT D, D/60           Zeitdauer in Ticks und Sekunden

Zum Vergleich mit den Systemstarteinstellungen Zeile 100 auskommentieren bzw. weglassen. In beiden Fällen sollte folgendes Ergebnis aufscheinen (für PAL-Systeme):

 23         0.383333333


Tondauer messen und berechnen[Bearbeiten | Quelltext bearbeiten]

 100 N=1  : REM TEMPO PARAMETER
 110 L=1  : REM TONLAENGE: 1=VOLL,
 120 :      REM 2=HALB, 4=VIERTEL,
 130 :      REM 8=ACHTEL, 16=SECHZEHNTEL
 135 VF=60
 140 PRINT USING ">##########: ###### #####";"","TICKS","SEK."
 150 TEMPO 255
 160 PLAY "U0CM" : REM IRQ-SYNCHRON: KURZEN TON ANSCHLAGEN UND WARTEN
 170 TEMPO N
 180 T0=TI: PLAY "W.CM": T1=TI : REM VOLLTON, HALBTON LAENGER, C-TON MIT WARTEN
 190 D=T1-T0
 200 PRINT USING ">##########: ####   ##.###";"GEMESSEN", D, D/60
 210 B=INT(1152*1.5/L/N)+1
 220 PRINT USING ">##########: ####.# ##.###";"BERECHNET", B/VF*60, B/VF
 230 BM=INT((B+(VF-1)/60)/VF*60)
 240 PRINT USING ">##########: ####   ##.###";"BERECH.MAX", BM, BM/60
  • Die gemessene Dauer liegt zwischen der berechneten Dauer und dem berechneten Maximumwert.
  • Der Basiswert für einen Vollton ist $0480 = 1152, der für einen Zähler (je Stimme) verwendet wird, der bei jedem Rasterzeilen-Interrupt (einer pro Bild) um n (den TEMPO-Parameter) herunter gezählt wird bis er kleiner 0 wird.

Videostandard ermitteln[Bearbeiten | Quelltext bearbeiten]

Eine etwas ungewöhnliche Anwendung unter Ausnutzung der vermischten Implementierung von Grafik und Musik, um den Videostandard auf einem C128 zu erkennen:

 100 GOSUB 1000
 110 IF VN THEN PRINT "NTSC": ELSE PRINT "PAL"
 999 END
1000 TEMPO 100: PLAY "SRM": VN=TI: PLAY "WRM": VN=(TI-VN)<13
1010 RETURN

Unterprogramm ab Zeile 1000 liefert in Variable VN für NTSC -1 und für PAL 0.
Der erste PLAY-Befehl synchronisiert mit einer 1/16tel-Pause auf den den Rasterzeilen-IRQ, um dann das 2. PLAY mit der Volltonpause möglichst genau zu messen.

Fehler im Bedienungshandbuch zum Commodore 128 und 128D[Bearbeiten | Quelltext bearbeiten]

Deutsche Ausgabe, Frankfurt 1985 auf den Seiten 4-128 und 4-159:

  • TEMPO-Parameter n soll auf 8 voreingestellt sein.
    Richtig: Voreingestellt ist 16, nachprüfbar laut o.g. BASIC-Beispiel.
  • Der Wertebereich für den Parameter wird mit 0 bis 255 angegeben, wobei 0 den Ton halten soll.
    Richtig: Ein Aufruf mit TEMPO 0 führt zur Fehlermeldung "?ILLEGAL QUANTITY ERROR". Der gültige Wertebereich ist von 1 bis 255.
  • Die Berechnung der Tondauer wird mit 19.22/n angegeben, was lediglich näherungsweise und nur für Geräte mit NTSC gilt.
    Richtig: Die Formel hängt vom Videostandard ab, da die Tondauer über die Rasterzeilen-Interrupt implementiert ist. Siehe Tabelle oben.