# Csound

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 stammt aus dem Jahre 1986.
Als Audio-Programmiersprache dient Csound sowohl der Synthese (deshalb auch als Software-Synthesizer bezeichnet) als auch der Bearbeitung von Klängen, beispielsweise über Filter, Modulation, Granulierung oder Fourier-Transformation. In den 1980er und 90er Jahren wurde Csound meistens offline zur Generierung von Audio-Dateien eingesetzt; seit den 2000er Jahren ebenso für Live-Musik im Bereich 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

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. 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

Das folgende Csound-Instrument erzeugt einen Sinuston von 415 Hertz mit −12 dB und schreibt ihn auf den Output:
Statt dieser traditionellen Schreibweise kann seit Csound 6 auch (ähnlich wie in Python und anderen Sprachen) funktional geschrieben werden:
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:
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:
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.

## Frontends

Um Csound-Code zu schreiben, diesen zu kompilieren, eine Instanz von Csound aufzurufen und Echtzeitereignisse zu verwalten, sind heute verschiedene Frontends verfügbar. 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:
Daneben existieren Integrierte Entwicklungsumgebungen, die Syntax-Highlighting und graphische Benutzeroberflächen bieten. Am gebräuchlichsten ist derzeit CsoundQt, aber auch Cabbage und Blue 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.
Die flexibelste Einbindung von Csound bietet die API. Dabei wird die Csound Engine (im Kern eine Audio-Bibliothek) über eine andere Programmiersprache gerufen und gesteuert. Es gibt Anbindungen für C, C++, Python, Java (einschließlich Scala und Clojure), JavaScript, C#, Common Lisp und andere.