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