SOUND (BASIC 7.0)

Aus C64-Wiki
Wechseln zu: Navigation, Suche
Begriffsklärung Der Titel dieses Artikels ist mehrdeutig. SOUND (Begriffsklärung).


SOUND (BASIC 7.0)
Format: SOUND <Stimme>,<Frequenzwert>,<Dauer>,[<Richtung>],[<MinFrequenz>],[<Schrittweite>],[<Wellenform>],[<Impulsbreite>]
Parameter
<Stimme>: numerischer Ausdruck im Wertebereich von 0 bis 3
<Frequenzwert>: numerischer Ausdruck im Wertebereich von 0 bis 65535
<Dauer>: numerischer Ausdruck im Wertebereich von 0 bis 32767
<Richtung>: numerischer Ausdruck im Wertebereich von 0 bis 2
<MinFrequenz>: numerischer Ausdruck im Wertebereich von 0 bis 65535
<Schrittweite>: numerischer Ausdruck im Wertebereich von 0 bis 32767
<Wellenform>: numerischer Ausdruck im Wertebereich von 0 bis 3
<Impulsbreite>: numerischer Ausdruck im Wertebereich von 0 bis 4095
Einordnung
Typ: Anweisung
Kontext: Tonerzeugung
Aufgabe: Erzeugung von Toneffekten
Abkürzung: sO
Verwandte Befehle
PLAY, SOUND (BASIC 3.5), TEMPO, VOL

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl SOUND ab Commodore BASIC V7.0 oder höher. Für den gleichnamigen Befehl von BASIC V3.5, siehe SOUND (BASIC 3.5).


Die Anweisung SOUND dient zur Erzeugung von Toneffekten mit verschiedenen Wellenformen und periodischer Frequenzänderung. Weitergehende Fähigkeiten des SID wie Hüllkurve, Stimmensynchronisation oder Ringmodulation werden nicht unterstützt. Zur Musikausgabe ist SOUND nicht gedacht, dafür eignet sich besser der Befehl PLAY.

Die Klangerzeugung erfolgt im Hintergrund, das BASIC-Programm läuft also während der Tonausgabe weiter, außer die ausgewählte Stimme ist bereits belegt. In diesem Fall wartet SOUND, bis der aktive Ton beendet ist (es sei denn als Dauer ist 0 angegeben, dann wird die Tonausgabe sofort beendet).

Die folgenden Parameter können dem Befehl übergeben werden, dabei sind die ersten 3 zwingend notwendig, alle weiteren optional und können mit Kommas ersetzt werden:

  • <Stimme>: Gibt an, welcher Tongenerator zur Tonerzeugung benutzt wird. Erlaubt sind die Werte 1 bis 3, andere erzeugen die Fehlermeldung ?ILLEGAL QUANTITY ERROR.
  • <Frequenzwert>: Bestimmt die Frequenz des erzeugten Tons in Frequenz-Register-Einheiten. Erlaubt sind die Werte von 0 bis 65535, außerhalb dieses Bereichs wird ein ?ILLEGAL QUANTITY ERROR ausgegeben. Zur Umrechnung einer Frequenz von Hz in den passenden Frequenzwert kann folgende Formel benutzt werden:
Hz nach Frequenzwert: Frequenzwert = Tonfrequenz * Umrechnungsfaktor
Frequenzwert nach Hz Frequenz = Frequenzwert / Umrechnungsfaktor
Der Umrechnungsfaktor ist abhängig von der Videonorm und beträgt für PAL 17,028412 und für NTSC 16,404391. Der Frequenzwert 0 bewirkt, dass kein Ton erzeugt wird, dies kann genutzt werden um eine Pause einzufügen.
  • <Dauer>: Gibt an wie lange (in Jiffy-Einheiten) der Ton erzeugt wird. Erlaubt sind die Werte von 0 bis 32767 (im Unterschied zu BASIC 3.5, wo der höchste zulässige Wert 65535 beträgt), außerhalb dieses Bereichs wird ein ?ILLEGAL QUANTITY ERROR ausgegeben. Die Länge einer Einheit ist ebenfalls abhängig von der Videonorm und beträgt bei PAL 1/50s, bei NTSC 1/60s. Eine Dauer von 0 ist ein Sonderfall und bewirkt, dass die Soundausgabe der angegebenen Stimme beendet wird.
  • <Richtung>: Die Richtung bei periodischer Frequenzänderung. Folgende Werte sind erlaubt:
    • 0: zunehmender bzw. höher werdender Ton, ist die Voreinstellung.
    • 1: abnehmender bzw. tiefer werdender Ton.
    • 2: oszillierend - der Ton wird abwechselnd höher und wieder tiefer.
  • <MinFrequenz>: Minimumfrequenz für periodische Frequenzänderung. Die erlaubten Werte entsprechen jenen von <Frequenzwert>, sinnvoll ist aber nur ein Wert kleiner dem Frequenzwert, ansonsten erfolgt keine Änderung der Tonhöhe. Werte außerhalb des erlaubten Bereiches führen zu einem ?ILLEGAL QUANTITY ERROR. Voreingestellt ist 0.
  • <Schrittweite>: Schrittweite der Frequenzänderung pro Rasterzeilen-Interrupt. Erlaubt sind die Werte von 0 bis 32767, wobei 0 die Voreinstellung ist.
  • <Wellenform>: Die Wellenform des erzeugten Tons. Verfügbar sind:
    • 0: Dreieck
    • 1: Sägezahn
    • 2: Rechteck
    • 3: weißes Rauschen
Andere Werte lösen den Fehler ?ILLEGAL QUANTITY ERROR aus. Voreingestellt ist der Wert 2.
  • <Impulsbreite>: Gibt bei einer Rechteckwelle das Tastverhältnis an, bei den anderen Wellenformen ist der Parameter irrelevant. Erlaubt sind die Werte von 0 bis 4095, außerhalb dieses Bereichs wird ein ?ILLEGAL QUANTITY ERROR ausgegeben. Voreingestellt ist der Wert 2048, bei dem beide Impulse gleich breit sind. Bei Änderung der Impulsbreite ist der Abstand zu 2048 entscheidend, ein Wert von 1024 erzeugt also z.B. denselben Ton wie 3072. Die Werte 0 bzw. 4095 bewirken einen konstanten Ausgabepegel und somit Stille.


Interaktion mit PLAY

Wird während des Abspielens einer Musiknote mit PLAY ein SOUND-Befehl für dieselbe Stimme ausgeführt, wartet der Befehl auf das Ende der Note, es sei denn es ist als Dauer der Wert 0 angegeben, dann wird das Abspielen der Note sofort beendet.
Interessanter sind die Auswirkungen eines PLAY-Statements, während auf derselben Stimme noch eine SOUND-Anweisung aktiv ist:

  1. Wird eine Note gespielt, so ist kurzzeitig deren Frequenz zu hören. Ist die Note zu Ende gespielt, geht die Stimme in den Release-Zustand, d.h. der Ton klingt ab und ist nicht mehr zu hören, obwohl das SOUND-Statement weiterhin aktiv ist. Damit sind interessante Effekte möglich.
  2. Mittels X kann die Filterung ein- bzw. abgeschalten werden.
  3. Mittels T kann die Wellenform gewechselt oder die Lautstärke des Tones kontinuierlich verringert (aber nicht mehr erhöht) werden, ohne die Gesamtlautstärke zu beinflussen.
  4. Mittels U könnte auch die Gesamtlautstärke verändert werden, wobei hierzu der Befehl VOL aber sicher besser geeignet ist.

Beispiele[Bearbeiten]

10 T=TI: SOUND 1,0,25: SOUND 1,0,1
20 IF T-TI>29 THEN VF=17.028412: VD=50: ELSE VF=16.404391: VD=60
30 DEF FN F(F)=INT(F*VF+0.5): DEF FN D(D)=INT(D*VD+0.5)

Bestimmt anhand der Spieldauer den Videomodus und definiert anhand dessen die Funktionen FN F() zur Berechnung des Frequenzwertes aus der übergebenen Frequenz in Hertz sowie die Funktion FN D() zur Berechnung des Tondauer-Parameters aus der gewünschten Tondauer in Sekunden.

40 DO
50 SOUND 1,FN F(435),FN D(.4),,,,0: SOUND 2,FN F(450),FN D(.4),,,,0
60 SOUND 1,FN F(580),FN D(.4),,,,0: SOUND 2,FN F(600),FN D(.4),,,,0
70 GET K$:LOOP UNTIL K$

Imitiert ein Martinshorn, indem alle 0,4 Sekunden zwischen den Frequenzen 435/580 Hz und 450/600 Hz gewechselt wird und wartet währenddessen auf einen Tastendruck. Es werden die benutzerdefinierten Funktionen aus dem vorigen Beispiel verwendet.

110 GRAPHIC 1,1: REM GRAFIK-MODUS EINSCHALTEN
120 SCALE 1,320,256: REM AUF MAX. WERT VON 255 SKALIEREN
130 BANK 15: REM RICHTIGE SPEICHERKONFIGURATION SICHERSTELLEN
140 FOR S=0 TO 3: REM ALLE 4 WELLENFORMEN DURCHLAUFEN
150 SCNCLR 1:LOCATE 0,255
160 SOUND 3,10,400,,,,S: REM TON MIT EINER FREQUENZ VON CA. 0,6 HZ AUSGEBEN
170 FOR I=0 TO 359
180 DRAW TO I,255-PEEK(54299): REM WELLENFORM AUFZEICHNEN
190 NEXT
200 SOUND 3,0,0: REM TONAUSGABE STOPPEN
210 NEXT

In diesem Beispiel wird die vom Tongenerator 3 des SID erzeugte Wellenform grafisch ausgegeben.

10 FOR N=1 TO 4
20 FOR I=100 TO 20000 STEP 100
30 SOUND 1,I,1,0,0,0,1,0
40 NEXT I
50 FOR I=20000 TO 100 STEP -100
60 SOUND 1,I,1,0,0,0,1,0
70 NEXT I
80 NEXT N

Dieses Beispiel erzeugt den Ton einer Sirene.