Algorithmische Komposition mit Common Lisp
events
events
ist eine Form der Ausgabe von Ereignissen, die in Common
Music implementiert wurde, bevor die Echtzeitausgabe von
Ereignissen mit Computern möglich war.
Ähnlich, wie bei sprout
ist es mit der events
Funktion
möglich, einzelne Ereignisse, Listen von Ereignissen, Prozesse
oder andere cm Typen, wie <sequence> auszugeben. Auch bei der
Ausgabe durch events
muss bei allen auszugebenden Ereignissen
der :time
Slot gesetzt sein.
Als drittes Argument wird der events
Funktion das Ziel
(englisch destination) übergeben.
Wenn dieses Argument eine Zeichenkette (englisch string) ist, wird diese als Dateiname interpretiert und die Ereignisse in eine Datei ausgegeben, deren Typ sich nach der Endung des Dateinamens richtet. Die wichtigsten Endungen sind in der nachfolgenden Tabelle aufgeführt
Dateinamenendung | Typ der Ausgabedatei |
---|---|
".midi", ".mid" | MIDI-Datei |
".ly" | Lilypond Datei |
".cmn" | CMN Datei |
".clm" | CLM Datei |
".aiff", ".snd", ".wav" | CLM Audiodatei |
Je nach Ausgabeformat existieren Zusatzoptionen, zur genaueren
Steuerung des Ausgabeformats, die der events
Funktion mit Hilfe
von Keywortargumenten übergeben werden. Eine Auflistung der
Optionen findet sich im Common Music Dictionary unter midi-file,
fomus-file, cmn-file, clm-file und audio-file.
Wenn anstelle einer Zeichenkette ein <incudine-stream> angegeben
wird, so werden die Ereignisse ähnlich wie bei sprout
auf die
Echtzeitausgänge geleitet.
Wird das dritte Argument ausgelassen, wird das Ausgabeformat des
letzten Aufrufs der events
Funktion verwendet.
;;; Ausgabe in die Midi Datei "/tmp/test.midi": (events (list (new midi :keynum 60 :time 0) (new midi :keynum 62 :time 0.5) (new midi :keynum 64 :time 1)) "/tmp/test.midi") ;; realtime output einer Note mit der events Funktion: (events (new midi :time 0) *rts-out*) ;; wird das zweite Argument weggelassen, wird die zuletzt verwendete ;; Ausgabemethode benutzt: (events (new midi :time 0))
Der Unterschied zwischen events
und sprout
besteht darin,
dass events
direkt bei Auswertung sämtliche Ereignisse
generiert und dem Echtzeitscheduler mit den entsprechenden
Zeitinformationen übergibt, während im Falle von sprout
ein
process
nur das jeweils nächste Element generiert und sich über
den scheduler zeitverzögert wiederholt aufruft, bis der Prozess
beendet ist. Solch eine Form der schrittweisen, sukzessiven
Auswertung erst zu dem Zeitpunkt, an dem ein neues Element
benötigt wird, ist eine Programmiertechnik, die unter dem Begriff
Lazy Evaluation bekannt ist. Ein Vorteil dieser Technik besteht
darin, dass man einen Prozess definieren und starten kann, der
prinzipiell unendlich ist. Von aussen kontrolliert werden solche
Prozesse dann durch das Setzen einer globalen Variable, die vom
Prozess zur Ausführungszeit überprüft wird, und über die er sich,
wenn sie gesetzt ist, selbst stoppt.
Für solche eine Methode kann events
nicht eingesetzt werden, da
ein solcher Prozess sofort einen Überlauf erzeugt, da unendlich
viele Werte unmittelbar generiert werden müssten.
Um in eine Lilypond Datei zu exportieren, muss zuvor das Paket "cm-fomus" geladen worden sein.
;;; Ausgabe in eine Lilypond Datei: (ql:quickload "cm-fomus") (events (list (new midi :keynum 60 :time 0) (new midi :keynum 62 :time 0.5) (new midi :keynum 64 :time 1)) "/tmp/test.ly")
Nach Evaluation des obenstehenden Ausdrucks sollte sich die Datei "test.ly" im Ordner "/tmp" befinden. Sie lässt sich anschließend mit dem Programm lilypond setzen und ergibt die untenstehende Notengrafik.