Csound

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Csound
Aktuelle Version 6.0.4
(7. Dezember 2014)
Betriebssystem GNU/Linux, Mac OS X, Windows, Android
Programmier­sprache C
Lizenz LGPL
Deutschsprachig nein
csound.github.io

Csound ist eine Audio-Programmiersprache. Sie wurde in den 1980er Jahren von Barry Vercoe am Electronic Music Studio des MIT, basierend auf den Music-N Systemen von Max Mathews, entwickelt. Die erste Veröffentlichung von Csound geschah 1986.[1]

Als Audio-Programmiersprache dient Csound sowohl der Klangsynthese (deshalb auch als Software-Synthesizer bezeichnet), als auch der Modifikation von Klängen (beispielsweise über Filter, Modulation, Granulierung oder Fourier-Transformation). In den 1980er und 90er Jahren wurde Csound meist zur Generierung von Audio-Dateien eingesetzt; seit den 2000er Jahren wird Csound ebenso für Live-Elektronik verwendet. Die für die Echtzeitanwendung erforderlichen Steuerungssignale werden dabei über MIDI, Open Sound Control (OSC) oder die Computer-Tastatur übermittelt.

Kompilierung und Ausführung[Bearbeiten | Quelltext bearbeiten]

In der Programmiersprache C geschrieben, übernimmt Csound die Abfolge aus Kompilierung und Ausführung. Das in Csound geschriebene Programm wird zunächst kompiliert. Ist die Kompilierung erfolgreich, kann das Programm ausgeführt werden.

Die grundlegenden Einheiten eines Csound-Programms werden „Instrumente“ genannt (bezeichnet durch Zahlen oder Namen). Sind sie einmal kompiliert, können sie jederzeit gestartet oder gestoppt werden.[2] Dies geschieht traditionell durch eine Anweisungsliste („score“ = Partitur), kann aber genauso gut in Echtzeit geschehen (über MIDI, OSC, Tastatur), oder durch eine Generierung innerhalb des Programms selbst.

Beispiele[Bearbeiten | Quelltext bearbeiten]

Das folgende Csound-Instrument erzeugt einen Sinuston von 415 Hertz mit -12 dB und schreibt ihn auf den Output:

instr Sinus                        ; Beginn einer Instrumenten-Definition (Schlüsselwort 'instr')
 aSinus poscil ampdbfs(-12), 415   ; Oszillator 'poscil' mit Argumenmten rechts und Ergebnis links
 out aSinus                        ; die Variable 'aSinus' wird als Audio-Signal herausgegeben
endin                              ; Ende der Instrumenten-Definition (Schlüsselwort 'endin')

Statt dieser traditionellen Schreibweise kann seit Csound 6 auch (ähnlich wie in Python und anderen Sprachen) funktional geschrieben werden:

instr Sinus
 out(poscil(ampdbfs(-12), 415))
endin

Zum Aufruf dieses Instruments verwendet man meist eine XML-ähnliche Datei, die aus drei Abschnitten besteht:

  • den Optionen <CsOptions>, die beispielsweise angeben, ob ein Klang in Echtzeit gewünscht ist oder eine Audio-Datei geschrieben werden soll
  • den Instrumenten <CsInstruments>, also dem eigentlichen Programmtext
  • der Partitur <CsScore>, also dem Aufruf von Instanzen der definierten Instrumente.

Die folgende Datei schreibt den Output in Echtzeit (Option '-o dac') auf die Audiokarte und ruft das Instrument „Sinus“ zweimal:

<CsoundSynthesizer>

  <CsOptions>
  ; Getestet mit: Csound version 6.07 (double samples) Mar 5 2016 unter Debian Linux
    -o dac             ; Output auf den Digital-to-Analog-Converter schreiben
  </CsOptions>

  <CsInstruments>
    sr     = 44100     ; Samplerate 44100 Hz (Signalrate für die Ausgabe)
    ksmps  = 32        ; Anzahl von Samples in einem Audio-Array (Blockgröße)
    nchnls = 1         ; Anzahl der Ausgabekanäle (1 bedeutet Mono, 2 Stereo)

    instr Sinus
      out(poscil(ampdbfs(-12), 415))
    endin
  </CsInstruments>

  <CsScore>
    i "Sinus" 0 2      ; Instrument "Sinus" wird mit Startzeit 0 und Dauer 2 (Sekunden) gerufen
    i "Sinus" 3 1      ; Instrument "Sinus" wird mit Startzeit 3 und Dauer 1 gerufen
  </CsScore>

</CsoundSynthesizer>

Will man stattdessen dieses Instrument durch ein MIDI-Keyboard aktivieren, wird der Score freigelassen, so dass Csound nach der Kompilierung läuft und auf Echtzeitereignisse (Real-Time Events) wartet. Der folgende Code bestimmt die Amplitude und Frequenz des Csound-Instruments aus der Anschlagstärke (Velocity) und Tasten-Nummer des MIDI-Keyboards. Außerdem wird eine Hüllkurve eingefügt, so dass der Ton am Anfang und Ende keine Artefakte (Klicks) erzeugt:

<CsoundSynthesizer>

  <CsOptions>
    -o dac                ; Live Audio
    -M a                  ; alle MIDI-Geräte benutzen / lesen
    --midi-velocity-amp=4 ; Umformung der Velocity in Amplitude und Übergabe als Parameter 4 (p4) an das Instrument
    --midi-key-cps=5      ; Umformung der Tasten-Nummer (MIDI Key) in Frequenz und Übergabe als Parameter 5 (p5)
  </CsOptions>

  <CsInstruments>

    instr Sinus
      aSinus = poscil(p4, p5)         ; Anwendung der MIDI-Werte
      out(linenr(aSinus,.1,.5,.01))   ; Hüllkurve mit 0.1 Sekunden Einblende und 0.5 Sekunden Ausblende
    endin

  </CsInstruments>

  <CsScore>
  </CsScore>

</CsoundSynthesizer>

Auch aus einem Csound-Instrument selbst können Echtzeit-Ereignissen generiert werden. Im folgenden Beispiel ruft jede aufgerufene Instanz eine neue Instanz des Instruments „Sinus“ auf, so dass sich eine endlose Kette ergibt. Durch die selbständige Generierung von Start und Dauer ergeben sich teils kleine Überlagerungen, teils Pausen.

<CsoundSynthesizer>

  <CsOptions>
    -o dac
  </CsOptions>

  <CsInstruments>
    seed 0                                           ; Zufallszahlen werden bei jedem Durchlauf neu generiert

    instr Sinus
      aSinus = poscil(ampdbfs(random:i(-30,-6)), cpsoct(random:i(8,10)))  ; Lautstärken -30..-6 dB, Tonhöhen Oktave 8..10
      out(linen(aSinus,p3/10,p3,p3/2))               ; Ton wird mit Hüllkurve herausgegeben
      schedule("Sinus",random:i(1,3),random:i(1,5))  ; neue Instanz wird gerufen (Start 1..3, Dauer 1..5 Sekunden)
    endin

    schedule("Sinus",0,3)                            ; erster Aufruf des Instruments, danach Selbstgenerierung

  </CsInstruments>

</CsoundSynthesizer>

Frontends[Bearbeiten | Quelltext bearbeiten]

Um Csound-Code zu schreiben, diesen zu kompilieren, eine Instanz von Csound aufzurufen und Echtzeitereignisse zu verwalten, sind heute verschiedene Oberflächen, sogenannte Frontends gebräuchlich. Klassisch ist dabei der Aufruf von Csound auf der Kommandozeile. Wird etwa das letzte Beispiel als Nur-Text-Datei unter dem Namen „endlos.csd“ gespeichert, so kann man diese unter Linux, Mac oder Windows in einem Terminal so ausführen:

csound endlos.csd

Daneben existieren aber Integrierte Entwicklungsumgebungen, die Syntax-Highlighting und graphische Benutzeroberflächen bieten. Am gebräuchlichsten ist derzeit CsoundQt,[3] aber auch Cabbage[4] und Blue[5] zeigen eigene Umgebungen für spezifische Ausrichtungen. Für Android wird Csound mit einer schlanken GUI und Optionen für die Integration von HTML5 Widgets angeboten. Für iOS existieren verschiedene Apps, die Csound verwenden oder das Abspielen von Csound Programmen ermöglichen.[6]

Die modernste und flexibelste Einbindung von Csound geschieht über die API. Dabei wird die Csound Engine (im Kern eine Audio-Bibliothek) über eine andere Programmiersprache gerufen und gesteuert. Es existieren Implementierungen in den Programmiersprachen C, C++, Python, Java (einschließlich Scala und Clojure), C#, Common Lisp und anderen.[7]

Weblinks[Bearbeiten | Quelltext bearbeiten]

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. Richard Boulanger: The Csound Book. MIT Press, 2000, S. xxix.
  2. Auch die Re-Kompilierung eines Instruments bei laufendem Csound ist seit Csound 6 möglich („Live-Coding“)
  3. CsoundQt
  4. Cabbage
  5. Blue
  6. csound.github.io
  7. http://csound.github.io/docs/api/index.html