Ich habe begonnen, die hervorragenden Vorlesungen von Eli Fieldsteel von superCollider nach cl-collider zu übertragen. Neben cl-collider werden die cm-utils, incudine und jack und natürlich emacs benötigt. Mehr dazu im Reiter "Setups". Das Supercollider-Video kann dazu hier angesehen werden. Um Emacs in macOS Zugirff auf das Mikrophon zu gewähren, muss zwingend den Anweisungen hier gefolgt werden:
;;MUS499C Eli Fieldsteel Spring 2021 ;;simple sinosc synthdef
(defsynth fm ((freq 400) (amp 0.2) (pan 0) (out 0) (atk 0.01) (rel 3)) (let* ((sig (sin-osc.ar freq)) (env (env-gen.kr (env [0 1 0] [atk rel] [1 -1])))) (out.ar out (pan2.ar (* sig env) pan amp))))
(defparameter *ns* (synth 'fm)) (free *ns*))
(ql:quickload :cm-utils)
(in-package :cm) (rts)
(sprout (sc::synth 'fm))
(sprout (process repeat 100 do (sc::synth 'sc::fm ) (wait 3))) ;;;;;;;;;;;;; ;;füge einen Modulator mit modfreq und modamp-Kontrollen hinu ;;output wird zum carrier sinosc hinzugefügt
(in-package :sc)
(defun exprand (min max) (* min (expt (/ max min) (random 1.0)))) (defun between (min max) (+ min (random (- max min))))
;;;um mehr musikalische Tonhöhenkontrolle zu erhalten, sollte die Modulator-Frequenz von Verhältniszahl abhängig von der Carrierfrquenz sein (z.B. modfreq:freq 2:1) ;;;einfache Verhältniszahlen 2, 3, 1,5 produzieren harmonische Spektren ;;;nicht ganzzahlige Teilungen produzieren inharmonische Spektren
;;;Indem wir die Modulator-Frequenz und die Modulator-Amplitude als Verhältniszahl ausdrücken, ist es einfacher die Anzahl der Seitenbänder mit einem Wert namens "Modulationsindex" gleich modamp/modfreq zu kontrollieren. Der index nähert sich etwa an die Anzahl der hörbaren Seitenbänder an:
;;Modulator in Serie ;;zwei Modulatoren operieren gleichzeitig an einer Träger-Frequenz ;;in anderen Worten, die Modulatoren werden summiert und hinzugefügt
;;;Oszillator-Selbstmodulation ;;die vertikale Maus-Position kontrolliert die Trägerfrequenz wie auch die Modulator-Frequenz, da sie hier das gleiche Signal darstellen, die horizontale kontrolliert die Modulator-Amplitude
(defun coerce-to-vector (2d-array) "transform the 2d vector returned by supercollider into a 1d vector for plotting" (make-array (array-total-size 2d-array) :displaced-to 2d-array :element-type (array-element-type 2d-array)))
;;;das folgende Beispiel Fieldsteels brachte viel Blut, Schweiß und Tränen, da es einige Funktionen in cl-collider nicht gibt, diese selbst zu bauen, brachte wiederum nicht die gewünschten Erfolge, daher wurde auf bipolar verzichtet und stattdessen saw.ar verwendet.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;ein komplexeres Beispiel
(defun exprand (min max) (* min (expt (/ max min) (random 1.0))))
(defun between (min max) (+ min (random (- max min))))
(defun pwrand (list-to-embed into-list) (let ((len (length into-list))) (loop for item in list-to-embed do (setf (nth (random len) into-list) item)) into-list))
(defun pwhite (min max) ;;generiere eine zufällige Ganzzahl zwischen 0 und max - min Wert (random (+ 1 (- max min))) ;;füge die Zufallszahl zum min-Wert hinzu (+ min (random (+ 1 (- max min)))))
(defparameter *my-list* '(1 2 3 4 5)) ; define a list of values
(defun range (start end &optional step) "erstellt eine Zahlenfolge von Start nach Ende mit optionaler Schrittgroesse" "Generates a sequence of numbers from start to end, with optional step size." (let ((step-size (if step step 1))) (loop for i from start below end by step-size collect i)))
(defun sum (array) (let ((sum (first array))) (dolist (arr (cdr array) sum) (setf sum (+~ sum arr)))))
(defsynth mysynth-2 ((freqs '(0 0 12 12 19 24 26 31 33 35))) (dotimes (i (length freqs)) (let* ((n (* (midicps (+ (nth i freqs) 36)) (midiratio (between -0.15 0.15)))) (sig (* (osc.ar *my-buffer* n) 0.1)) (sig (* sig (sin-osc.kr (between 0.1 0.15) (between 0 (* 2 pi)) (range 0.2 1 0.1)))) (sig (* sig (lin-lin sig 0 1 0.2 1))) (sig (lpf.ar sig (* n 2))) (sig (pan2.ar sig (between -0.9 0.9))) (env (env-gen.kr (env [0 1 0] [4 4] [1 -1])))) (out.ar 0 (* 2(* sig env))))))
(defmacro n-collect (n form &key (initial-element '())) "return a seq of n elems prepended to initial-element by evaluating form n times with the symbol n bound to the iteration index in the lexical scope of form." "Gib eine Sequenz von n Elementen zurück, die dem Initial-Element vorangestellt sind, indem das Formular n-mal ausgewertet wird, wobei das Symbol n an den Iterationsindex im lexikalischen Gültigkeitsbereich des Formulars gebunden ist." `(labels ((fn (num seq) (if (< num ,n) (cons (let ((n num)) ,form) (fn (+ num 1) seq)) seq))) (fn 0 ,initial-element)))
;;if read is at the head of the node tree, recording happens after the buffer is read, so we have to wait one full buffer-length cycle to hear what was recorded
(defun coerce-to-vector (2d-array) "transform the 2d vector returned by supercollider into a 1d vector for plotting" (make-array (array-total-size 2d-array) :displaced-to 2d-array :element-type (array-element-type 2d-array)))
(defmacro n-collect (n form &key (initial-element '())) "return a seq of n elems prepended to initial-element by evaluating form n times with the symbol n bound to the iteration index in the lexical scope of form." "Gib eine Sequenz von n Elementen zurück, die dem Initial-Element vorangestellt sind, indem das Formular n-mal ausgewertet wird, wobei das Symbol n an den Iterationsindex im lexikalischen Gültigkeitsbereich des Formulars gebunden ist." `(labels ((fn (num seq) (if (< num ,n) (cons (let ((n num)) ,form) (fn (+ num 1) seq)) seq))) (fn 0 ,initial-element)))
(defun between (min max) (+ min (random (- max min))))
(play (let ((f 50) ; fundamental frequency (p 20) ; number of partials per channel (z 0.0) ; start of oscil daisy chain (offset (line.kr 0 -0.02 60))) ; causes sound to separate and fade (dotimes (i p) (setf z (f-sin-osc.ar (* f (+ 1 i)) ; freq of partial 0 (max 0 (lf-noise1.kr (+ 6 [(between -4.0 4.0) (between -4.0 4.0)]) 0.02 offset)) z))) z))
(stop)
;;;
;;;harmonic tumbling
(play (let ((f 80) ; fundamental frequency (p 10) ; number of partials per channel (z 0.0) ; start of oscil daisy chain (trig (x-line.kr [10 10] 0.1 60 ))) ; trigger probability decreases over time
(dotimes (i p) (setf z (f-sin-osc.ar (* f (+ 1 i)) ; freq of partial 0 (decay2.kr (dust.kr trig 0.02) 0.005;;grain attack time (random 0.5)) z))) z)
*my-array* (defmacro n-collect (n form &key (initial-element '())) "return a seq of n elems prepended to initial-element by evaluating form n times with the symbol n bound to the iteration index in the lexical scope of form." "Gib eine Sequenz von n Elementen zurück, die dem Initial-Element vorangestellt sind, indem das Formular n-mal ausgewertet wird, wobei das Symbol n an den Iterationsindex im lexikalischen Gültigkeitsbereich des Formulars gebunden ist." `(labels ((fn (num seq) (if (< num ,n) (cons (let ((n num)) ,form) (fn (+ num 1) seq)) seq))) (fn 0 ,initial-element)))
Diese Webseite verwendet Cookies. Cookies erleichtern die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden. Datenschutzerklärung