next up previous contents
Nächste Seite: Aufgaben Aufwärts: Einführung: Grundlagen, Geschichte, Umgang Vorherige Seite: Geschichte   Inhalt

Allgemeine Struktur von CSound Quelltexten

Bevor wir ein erstes Beispiel entwickeln wollen, zunächst einige Vorbemerkungen über die allgemeine Struktur von CSound.

CSound ist ein ,,akustischer Compiler``. Das Programm nimmt eine Beschreibung der zu erzeugenden Klänge in Form von Textdateien entgegen und berechnet aufgrund dieser Beschreibung die einzelnen Samples und legt diese in Form eine Klangdatei auf der Festplatte des Rechners ab. Mithilfe eines geeigneten Programmes (z.B. Sounddesigner) kann diese Datei dann den am Rechner angeschlossenen Wandlern zugeführt und so hörbar gemacht werden.

Im Gegensatz zu anderen Programmiersprachen, wo ein Programm oft in einer einzigen Textdatei besteht (oder bestehen könnte), sind in CSound zwingend 2 Dateien vonnöten. Die erste, die sogenannte Orchesterdatei beschreibt die eigentlichen Verschaltungen der Unitgeneratoren. Jede in sich abgeschlossene Verschaltung heißt ,,Instrument``. Die andere, sogenannte Partiturdatei, bestimmt, wann welches Instrument wie lange ,,eingeschaltet`` wird. Ähnlich wie beim analogen Modulsystem, bei dem man bei jeder Aktivierung der Schaltung einige Drehregler anders stellen kann, kann man auch bei jeder Aktivierung eines CSound Instruments verschiedene Werte, z.B. für Frequenz und Lautstärke eines Oszillators, im Partiturfile angeben.

Entwickeln wir als erstes ein einfaches Instrument, das nur einen Sinuston erzeugt. Die CSound Zeile


asig   oscil  10000,440,1

erzeugt ein Signal asig mit Hilfe des Unitgenerators oscil mit der Lautstärke 10000, der Frequenz 440 und der Wellenform, die in der Tabelle 1 gespeichert ist.

So sehen fast alle Zeilen in einer Instrumentendefinition im Orchesterfile aus: Links stehen die Namen der zu generierenden Signale, dann folgt der Name des Unitgenerators, der sie erzeugen soll, rechts stehen die Eingangswerte für diesen Generator. Der Generator oscil erwartet an seinem ersten Eingang einen Wert für die Lautstärke (0..$2^{15}$), an seinem zweiten Eingang die Frequenz in Hertz, und an seinem dritten Eingang die Nummer einer Wellentafel, die genau eine Periode der zu erzeugenden Schwingung enthält.

Dieses Signal asig existiert bis jetzt nur innerhalb von CSound. Um es tatsächlich in den resultierenden Soundfile auszugeben, müssen wir es an den Unitgenerator out übergeben. Wir vervinden also den AUsgang des Oszillators mit dem Eingang des Ausgabegerätes. (Bei einem Analogen System müsten wir auch den Ausgang des Oszillators z.B. mit dem Mischpult verbinden).


asig   oscil  10000,440,1
       out    asig

Der Unitgenerator out hat selber keinen Ausgang, sondern nur einen Eingang in dem das Signal steht, das ausgegeben werden soll.

Unser erstes nstrument ist nun fertig. Wir müssen CSound noch mitteilen, wo es im Text beginnt und endet:


instr 1
asig   oscil  10000,440,1
       out    asig
endin

Das spezielle Wort instr sagt CSound, das hier eine Intrumentendefinition beginnt. Die folgende Nummer dient zur späteren identifizierung des Instrumentes im Partiturfile.

endin markiert analog das Ende der Instrumentendefinition.

Zu einer vollständigen Orchesterdatei fehlen jetzt noch einige Angaben, nämlich die Samplerate, die sog. Kontrollrate(s.u) dianZahl der Audiosamples pro Kontrollsample, und die Anzahl der Ausgabekanäle.


; first.orc Ein erstes Instrument

sr     = 44100 ; samplerate 44.1 kHz
kr     = 441   ; Kontrollrate, 441 Hz
ksmps  = 100   ; Anzahl Audiosamples pro Kontrollsample
nchnls = 1     ; Mono

instr 1
asig   oscil  10000,440,1
       out    asig
endin

Die Einführung der Kontrollrate ist eine der Optimierungen, die die Geschwindigkeit von CSound ausmachen: Bestimmte Signale wie z.B. Hüllkurven oder langsame Oszillatoren die etwa ein Vibrato erzeugen, ändern sich im Vergleich mit Audiosignalen nur sehr langsam und können daher auch ohne klangliche Einbußen seltener neu berechnet werden. Die Kontrollrate gibt an, wie oft solche Signale neu berechnet werden sollen.

Übrigens ist alles, was hinter einem Semikolon steht bis zum ENde der Zeile ein Kommentar und wird von CSOund geflissentlich übersehen.

Hier ist die Partiturdatei, die dieses Instrument für 5 Sekunden aktiviert (und so einen Sinuston von 5 sec. Dauer erzeugt:)


; Erzeuge eine Wellentafel mit einer Periode einer Sinusschwingung

f 1 0 1024 10 1

; Aktiviere Instrument 1 fuer 5 Sekunden

i 1 0 5

; ende

e

Auch das Format der Partiturdatei ist zeileorientiert. In der ersten Spalte steht der Code der Anweisung (f i e), in den anderen Spalten (p-fields oder parameterfields genannt und mit p1,p2,p3... bezeichnet) die zugehörigen Parameter. So bezeichet bei der i-Anweisung (Instrumentanweisung):

p1
die Nummer des zu aktivierenden Instruments (hier 1)
p2
der Zeitpunkt, an dem das Instrument aktiviert werden soll (0)
p3
die Dauer für die das Instrument aktiv sein soll
p4,p5...
Werte mit denen das Instrument aktiviert werden soll. Da wir in unserem ersten Instrument alle wichtigen Werte bereits in der Instrumentendefinition angegeben haben, haben wir dafür z.Zt keine Verwendung

Ähnlich sieht es bei der f-Anweisung aus.(Die f-Anweisung dient dazu, Wellentafeln und andere Tabellen mit Werten zu füllen). So bedeuten hier:

p1
die Nummer der zu erzeugenden Tabelle (hier 1)
p2
der Zeitpunkt, an dem die Tabelle erzeugt (oder überschrieben) werden soll (0)
p3
die Anzahl der Werte in der Tabelle (1024)
p4
Die Nummer des Programms, das die Tabelle erzeugen soll (10)
p5,p6...
Werte mit denen das Unterprogramm aktiviert werden soll. (1)

Wirr wollen also die Wellentafel 1 zum Zeitpunkt 0 mit 1024 Werten füllen, die von dem Unterprogramm Nr. 10 aufgrund der folgenden 1 erzeugt werden. Nun kann man mit dem Unterprogramm 10 eine Periode einer harmonischen Schwingunge erzeugen, bei denen die Obertöne in genau dem Verhältnis zueinander stehen, das durch die folgenden Werte (p5,p6...) angegeben wird. Da wir nur einen Wert angeben, enthält die Wellentafel nur eine Periode der Grundschwingung, eben einen Sinus.

So wars ja wohl geplant!

die e-anweisung gibt CSound das Ende der Partitur bekannt und benötigt weiter keine Parameter.

Als nächstes wollen wir Lautstärke und Frequenz von der Partitur aus bestimmen und mehrere Töne erzeugen. Die Lautstärke wollen wir in p4 der i-Anweisung, die Frequenz in p5 angeben. Z.B.:


; second.sco, Lautstaerke und Frequenz in p4 und p5
f 1 0 1024 10 1

; instr start dauer ampl  freq
i 1     0     2     10000 440
i 1     3     .     20000 880
i 1     6     .      5000 1011.123
i 1     9     .      2500 2012
i 1     12    .      5000 123.45
i 1     15    .     10000 75
e

Der Punkt bedeutet: Nimm den letzten gueltigen Wert, hier also 2 sec. für die Dauer.

Nun müssen wir unser Instrument noch entsprechend verändern. Dort wo wir bisher konstant 10000 und 440 Eingetragen haben, müssen jetzt die entsprechenden Parameterfelder eingetragen werden:


; second.orc Ein Instrument mit p-fields

sr     = 44100 ; samplerate 44.1 kHz
kr     = 441   ; Kontrollrate, 441 Hz
ksmps  = 100   ; Anzahl Audiosamples pro Kontrollsample
nchnls = 1     ; Mono

instr 1
asig   oscil  p4,p5,1 ;p4 = ampl, p5=freq
       out    asig
endin

Das können wir mit etwas Schreibaufwand auch lesbarer gestalten, sodaß wir uns den Kommentar sparen können:


; second.orc Ein Instrument mit p-fields

sr     = 44100 ; samplerate 44.1 kHz
kr     = 441   ; Kontrollrate, 441 Hz
ksmps  = 100   ; Anzahl Audiosamples pro Kontrollsample
nchnls = 1     ; Mono

instr 1
iamp   =      p4
ifreq  =      p5

asig   oscil  iamp,ifreq,1
       out    asig
endin

Als letztes können wir auch die Angabe der Wellenform aus der Partitur bestimmen lassen. Dazu erzeugen wir zunächst einige neue Wellenformen mithilfe des bereits bekannten Unterprogramms 10:


f 1 0 1024 10 1
f 2 0 1024 10 1 .5 .3 .25 .2 .167 .14 .125 .111
f 3 0 1024 10 1  0 .3 0   .2 0    .14 0    .111
f 4 0 1024 10 1  1  1 1   .7 .5   .3  .1

Wie wir sehen, können wir auch hier Dezimalbrüche angeben. Die entstehenden Wellenforman sind übrigens annäherungen an Sägezahn, Rechteck und Pulswelle. Frage: Warum kann man keine ,,echten`` Versionen dieser Wellenformen benutzen??

Nun geben wir jedem Ereignis in der Partitur in p6 die Nummer der zu verwendenden Wellentafel mit:


; third.sco, Wellentafel in p6
f 1 0 1024 10 1
f 2 0 1024 10 1 .5 .3 .25 .2 .167 .14 .125 .111
f 3 0 1024 10 1  0 .3 0   .2 0    .14 0    .111
f 4 0 1024 10 1  1  1 1   .7 .5   .3  .1   

; instr start dauer ampl  freq      wave
i 1     0     2     10000 440       1
i 1     3     .     20000 880       2
i 1     6     .      5000 1011.123  3
i 1     9     .      2500 2012      4
i 1     12    .      5000 123.45    3
i 1     15    .     10000 75        2
e

Zuletzt tragen wir im Instrument das entsprechende p-field (p6) ein, natürlich in der ,,lesbaren`` Version


; third.orc Ein Instrument mit p-fields, auch fuer die Wellentafel

sr     = 44100 ; samplerate 44.1 kHz
kr     = 441   ; Kontrollrate, 441 Hz
ksmps  = 100   ; Anzahl Audiosamples pro Kontrollsample
nchnls = 1     ; Mono

instr 1
iamp   =      p4
ifreq  =      p5
iwtab  =      p6

asig   oscil  iamp,ifreq,iwtab
       out    asig
endin


next up previous contents
Nächste Seite: Aufgaben Aufwärts: Einführung: Grundlagen, Geschichte, Umgang Vorherige Seite: Geschichte   Inhalt
Thomas Neuhaus
2001-01-14