2.5. cl-collider
cl-collider ist ein lisp package, das die Funktionalität der SuperCollider Sprache 'sclang' in common lisp realisiert. Der Package Name ist allerdings nicht 'cl-collider', sondern 'sc'.
Die gesamte Audioverarbeitung geschieht im SCsynth, die Sprache dient vor allem folgenden Zwecken:
- Definieren von dsp Algorithmen (einer 'synthdef'), die auf der Lisp Seite in das Binärformat von SuperCollider kompiliert werden und dann dem Server über OSC gesendet werden,
- Verwaltung von Bussen (Audio und Control)
- Aufruf/Löschen von Synths
- Scheduling von Ereignissen
Wie auch in der Supercollider Sprache (sclang) ist das Scheduling von cl-collider nicht sehr präzise. Das Ersetzen des scheduling durch incudine ist jedoch problemlos möglich und führt zu hervorragenden Ergebnissen.
Laden des Pakets:
CL-USER> (ql:quickload "sc") .... ("sc") CL-USER> (in-package :sc) #<package "SC"> sc>
Einige Voreinstellungen:
sc> (setf *sc-synth-program* "/usr/bin/scsynth") "/usr/bin/scsynth" sc> (setf *sc-synthdefs-path* "~/.local/share/SuperCollider/synthdefs") "~/.local/share/SuperCollider/synthdefs" sc> (push "/usr/lib/SuperCollider/plugins/" *sc-plugin-paths*) ("/usr/lib/SuperCollider/plugins/") sc> (push "/usr/share/SuperCollider/Extensions/SC3plugins/" *sc-plugin-paths*) ("/usr/share/SuperCollider/Extensions/SC3plugins/" "/usr/lib/SuperCollider/plugins/") sc> (defparameter *s* (setf *s* (make-external-server "localhost" :port 57110 :just-connect-p t))) *s* sc>
HINWEIS: Bevor der nachfolgende Code eine Verbindung zu einer externen scsynth Instanz herstellt, muss diese 'vor' seiner Evaluation gestartet sein:
(server-boot *s*)
Definitionen und Aufrufe der Synths:
;;; Synth Definition (defsynth my-sine ((freq 440) (amp 0.2)) (let* ((sig (* amp (sin-osc.ar [freq (+ freq 2)] 0 .2)))) (out.ar 0 sig))) ;;; Das Gleiche ohne let* Bindung: (defsynth my-sine ((freq 440) (amp 0.2)) (out.ar 0 (* amp (sin-osc.ar [freq (+ freq 2)] 0 .2)))) ;;; Aufruf des Synths (defparameter *synth* (my-sine)) ;;; Veränderung von Variablen (ctrl *synth* :freq 330) ;;; Instanz abschalten ("free") (bye *synth*)
;;; FM-Synth Definition (defsynth fm-synth ((freq 440) (amp 0.2) (ratio 10) (idx 10)) (let* ((sig (* amp (sin-osc.ar (+ freq (sin-osc.ar (* freq ratio) 0 idx)) 0 .2)))) (out.ar 0 sig))) ;;; FM-Synth Aufruf (defparameter *fm-synth* (fm-synth :freq 440 :ratio 1.3 :idx 4000)) ;;; FM-Synth Definition (ctrl *fm-synth* :idx 1) ;;; free synth (bye *fm-synth*)
Verbindung zum Server trennen:
(server-quit *s*)