;;; maybe more synths, maybe trying for repeated phrases with different settings for whole phrase ;;; https://github.com/SCLOrkHub/SCLOrkSynths/blob/master/SynthDefs/strings/prophet5pwmStrings.scd (in-package #:cl-collider) (defsynth prophet5pwmStrings ((out 0) (pan 0.0) (freq 440) (amp 1.0) (gate 1) (att 0.01) (rel 0) (sus 1) (dec 0.5) (lforate 10) (lfowidth 0.5) (cutoff 12000) (rq 0.5)) (let* ((lfo (lf-tri.kr (mapcar (lambda (x) (* lforate x)) (list 1 1.01)) (make-list 2 :initial-element (rand.ir 0 2.0)))) (pulse (pulse.ar (mapcar (lambda (x) (* freq x)) (list 1 1.01)) (+ (* lfo lfowidth) 0.5))) (filter (rlpf.ar pulse cutoff rq)) (env (env-gen.ar (adsr att dec sus rel amp) :gate gate :act :free))) (out.ar out (pan2.ar (* (mix filter) env 0.5) pan)))) ;; (synth :prophet5pwmstrings) ;; (stop) (in-package #:cl-patterns) (pb :foo-with-pluck-synth :instrument :prophet5pwmStrings :play-quant 4 ;; :rq 0.8 ;; :cutoff 35200 ;; :dec 0.1 ;; :att 0.07 ;; :sus 0.8 :legato 1 :degree (pseq (list 0 1 2 3 4 5 6 7) 1) :dur 1) ;; (play :foo-with-pluck-synth) ;; (end :foo-with-pluck-synth) ;; (stop :foo-with-pluck-synth) ;; ;; let's make it a simple gamma? ;; cool, and easy with the :degree (from pitch model http://doc.sccode.org/Tutorials/Streams-Patterns-Events5.html ) (pb :mary-had-a-little-lamb :instrument :prophet5pwmStrings :play-quant 16 :legato 1 :degree (pseq (list 6 5 4 5 6 6 6 5 5 5 6 6 6 6 5 4 5 6 6 6 6 5 5 6 5 4) 1) :dur (pseq (list 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 4)) :attack (pseq (list 0.1 0 0 0))) ;; (play :mary-had-a-little-lamb) ;; (end :mary-had-a-little-lamb) ;; (stop :mary-had-a-little-lamb) ;;; sure, another? ;; https://github.com/SCLOrkHub/SCLOrkSynths/blob/master/SynthDefs/strings/strings.scd ;; (taken from http://sccode.org/1-5aD ) (in-package #:cl-collider) (defsynth strings ((out 0) (freq 440) (amp 1) (gate 1) (pan 0) (freqLag 0.2) (att 0.001) (dec 0.1) (sus 0.75) (rel 0.3) (rq 0.001) (combHarmonic 4) (sawHarmonic 1.5) (mix 0.33)) (let* ((combFreq (/ 1 (* (lag.kr freq (/ freqLag 2)) combHarmonic))) (envelope (env-gen.kr (adsr att dec sus rel amp) :gate gate :act :free)) (snd-step-1 (sync-saw.ar (* freq (range (white-noise.kr) (/ 1 1.025) 1.025)) (* freq sawHarmonic) 8)) (snd-step-2 (+ (* snd-step-1 (- 1 mix)) (pink-noise.ar (* 180 mix)))) (snd-step-3 (comb-l.ar snd-step-2 combFreq combFreq -1)) ; try 1 for decay as well (snd-step-4 (abs (resonz.ar snd-step-3 (lag.kr freq freqLag) rq))) (snd-step-5 (* snd-step-4 envelope)) (snd-step-6 (limiter.ar snd-step-5 amp))) (out.ar out (pan2.ar snd-step-6 pan)))) ;; (synth :strings :freq 400) ;; (stop) (in-package #:cl-patterns) (pb :foo-with-pluck-synth-with-strings :instrument :strings :play-quant 4 ;; :rq 0.8 ;; :cutoff 35200 ;; :dec 0.1 ;; :att 0.07 ;; :sus 0.8 ;; :freqLag 0.7 :legato 1 :degree (pseq (list 0 1 2 3 4 5 6 7) 1) :dur 1) ;; (play :foo-with-pluck-synth-with-strings) ;; (end :foo-with-pluck-synth-with-strings) ;; (stop :foo-with-pluck-synth-with-strings) ;; ;; let's make it a simple gamma? ;; cool, and easy with the :degree (from pitch model http://doc.sccode.org/Tutorials/Streams-Patterns-Events5.html ) (pb :mary-had-a-little-lamb-with-strings :instrument :strings :play-quant 16 :legato 1 :degree (pseq (list 6 5 4 5 6 6 6 5 5 5 6 6 6 6 5 4 5 6 6 6 6 5 5 6 5 4) 1) :dur (pseq (list 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 4)) :attack (pseq (list 0.1 0 0 0))) ;; (play :mary-had-a-little-lamb-with-strings) ;; (end :mary-had-a-little-lamb-with-strings) ;; (stop :mary-had-a-little-lamb-with-strings) ;; ;; cool, i like it ;;; https://github.com/SCLOrkHub/SCLOrkSynths/blob/master/SynthDefs/winds/waveguideFlute.scd ;; let's try the winds? (in-package #:cl-collider) (defsynth waveguideFlute ((scl 0.2) (freq 440) (ipress 0.9) (ibreath 0.09) (ifeedbk1 0.4) (ifeedbk2 0.4) (dur 1) (gate 1) (amp 2)) (let* ((sr (sample-rate.ir)) (cr (control-rate.ir)) (a-block (reciprocal cr)) (ifqc freq) (kenv1 (env-gen.kr (env (list 0.0 (* 1.1 ipress) ipress ipress 0.0) (list 0.06 0.2 (- dur 0.46) 0.2) :linear))) ; noise envelope (kenv2 (env-gen.kr (env (list 0.0 amp amp 0.0) (list 0.1 (- dur 0.2) 0.1) :linear))) ; overall envelope (kenvibr (env-gen.kr (env (list 0.0 0.0 1 1 0.0) (list 0.5 0.5 (- dur 1.5) 0.5) :linear))) ; vibrato envelope (aflow1 (lf-clip-noise.ar sr kenv1)) ; create air flow and vibrato (kvibr (sin-osc.ar 5 0 (* 0.1 kenvibr))) (asum1 (+ (* ibreath aflow1) kenv1 kvibr)) (afqc (+ (reciprocal ifqc) (/ ifqc 12000000) (- (/ asum1 20000)) (- (/ 9 sr)) (- a-block))) (fdbckArray (local-in.ar 1)) (aflute1 fdbckArray) (asum2 (+ asum1 (* aflute1 ifeedbk1))) (ax (delay-c.ar asum2 (- (reciprocal ifqc) (* a-block 0.5)) ; original has strange asum1/ifqc/cr thing, is that consequtive division, or third is on top? (* afqc 0.5))) (apoly (- ax (cubed ax))) (asum3 (+ apoly (* aflute1 ifeedbk2))) (avalue (lpf.ar asum3 2000)) (aflute2 (delay-c.ar avalue (- (reciprocal ifqc) a-block) afqc)) (fdbckArray (list aflute2)) ;; (no-name (local-out.ar fdbckArray)) ; does that work at all? are there side effects? (signalOut avalue)) (local-out.ar fdbckArray) (offset-out.ar 0 (list (* signalOut kenv2) (* signalOut kenv2))))) (synth :waveguideFlute :dur 2 :freq 300 :amp 1 ) (stop) ;; (scl 0.2) (freq 440) (ipress 0.9) (ibreath 0.09) (ifeedbk1 0.4) (ifeedbk2 0.4) ;; (dur 1) (gate 1) (amp 2) (in-package #:cl-patterns) (pb :foo-with-pluck-synth-with-flute :instrument :waveguideFlute :play-quant 4 :ibreath 0.1 :octave 5 :degree (pseq (list 0 1 2 3 4 5 6 7) 1) :dur 1) ;; (play :foo-with-pluck-synth-with-flute) ;; (end :foo-with-pluck-synth-with-flute) ;; (stop :foo-with-pluck-synth-with-flute) ;; ;; let's make it a simple gamma? ;; cool, and easy with the :degree (from pitch model http://doc.sccode.org/Tutorials/Streams-Patterns-Events5.html ) (pb :mary-had-a-little-lamb-with-flute :instrument :waveguideFlute :play-quant 16 :legato 1 :degree (pseq (list 6 5 4 5 6 6 6 5 5 5 6 6 6 6 5 4 5 6 6 6 6 5 5 6 5 4) 1) :dur (pseq (list 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 4)) :attack (pseq (list 0.1 0 0 0))) ;; (play :mary-had-a-little-lamb-with-flute) ;; (end :mary-had-a-little-lamb-with-flute) ;; (stop :mary-had-a-little-lamb-with-flute) ;;; I'd say - I messed something up, this doesn't quite work, too much breath, too little clear sound ;; almost nothing but break in 4th octave & higher ;;; well, let's try some keyboard ;;; https://github.com/SCLOrkHub/SCLOrkSynths/blob/master/SynthDefs/keyboards/FMRhodes1.scd (in-package #:cl-collider) (defsynth FMRhodes1 ((out 0) (freq 440) (gate 1) (pan 0) (amp 0.1) (att 0.001) (rel 1) (lfoSpeed 4.8) (inputLevel 0.2) (modIndex 0.2) (mix 0.2) (lfoDepth 0.1)) ;; all of these range from 0 to 1 (let* ((env1 (env-gen.kr (perc att (* rel 1.25) inputLevel :lin))) (env2 (env-gen.kr (perc att rel inputLevel :lin))) (env3 (env-gen.kr (perc att (* rel 1.25) inputLevel :lin))) (env4 (env-gen.kr (perc att (* rel 1.25) inputLevel :lin))) (osc4 (* (sin-osc.ar freq) 6.7341546494171 modIndex env4)) (osc3 (* (sin-osc.ar (* freq 2) osc4) env3)) (osc2 (* (sin-osc.ar (* freq 30)) 0.683729941 env2)) (osc1 (* (sin-osc.ar (* freq 2)) env1)) (snd-step-1 (+ (mix (* osc3 (- 1 mix))) (* osc1 mix))) (snd-step-2 (* snd-step-1 (range (sin-osc.ar lfoSpeed) (- 1 lfoDepth) 1))) (snd-step-3 (* snd-step-2 (env-gen.kr (asr 0 1 0.1) :gate gate :act :free))) (snd-step-4 (pan2.ar snd-step-3 pan amp))) (out.ar out snd-step-4))) (synth :fmrhodes1 :freq 800) (stop) (in-package #:cl-patterns) (pb :foo-with-pluck-synth-with-fmrhodes1 :instrument :fmrhodes1 :play-quant 4 :legato 1 :octave 3 ;; :lfospeed 1 ;; :inputlevel 0.1 ;; :lfodepth 0.01 :degree (pseq (list 0 1 2 3 4 5 6 7) 1) :dur 1) ;; (play :foo-with-pluck-synth-with-fmrhodes1) ;; (end :foo-with-pluck-synth-with-fmrhodes1) ;; (stop :foo-with-pluck-synth-with-fmrhodes1) ;; ;; let's make it a simple gamma? ;; cool, and easy with the :degree (from pitch model http://doc.sccode.org/Tutorials/Streams-Patterns-Events5.html ) (pb :mary-had-a-little-lamb-with-fmrhodes1 :instrument :fmrhodes1 :play-quant 16 :octave 3 :degree (pseq (list 6 5 4 5 6 6 6 5 5 5 6 6 6 6 5 4 5 6 6 6 6 5 5 6 5 4) 1) :dur (pseq (list 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 4)) :legato (pseq (list 1 1 1 0.7))) ; unfortunately this is not by beats, but by count, not cooooool ;; (play :mary-had-a-little-lamb-with-fmrhodes1) ;; (end :mary-had-a-little-lamb-with-fmrhodes1) ;; (stop :mary-had-a-little-lamb-with-fmrhodes1) ;;; but now I have a keyboard, a bass and a somewhat drum ;; let's try something more? ;;; i guess I'd need to better understand difference between pb pbind (pb :hm-lallaa :instrument :fmrhodes1 :octave 3 :degree (pseq (list 0 1 4 8 (prest 0) 0 2 4 7 4 2) 1)) (play :hm-lallaa) (end :hm-lallaa) (stop :hm-lallaa) ;; yup, that's a pause, cool ;; so, do I bring that stuff into a separate file? (mapcar (lambda (chord) (list (chord-name chord) (chord-notes chord))) (all-chords)) (chord-notes (chord "Minor 7th")) (chord-notes (chord "Minor 7th")) ;; :degree (pseq (mapcar #'chord-notes (list :major :minor :maj7 :major)) 1) ;; now, (defun nchord (symbol &optional (base 0)) "Return list of notes for chord names by SYMBOL over the BASE." (mapcar (lambda (note) (+ base note)) (chord-notes symbol))) (nchord :major 3) (pb :hm-chords-progression :instrument :fmrhodes1 :octave 3 ;; :degree (pseq (mapcar #'chord-notes (list :major :minor :maj7 :major)) 1) ; works, but can't insert (prest 0) among chords ;; :degree (pseq (list (chord :major) (chord :minor) (chord :maj7) (chord :major)) 1) ; doesn't seem to work :degree (pseq (list (nchord :major) (nchord :minor) (prest 0) (nchord :maj7) (nchord :major) (prest 0)) 1) ; doesn't seem to work :base 2 :root 5 ) (play :hm-chords-progression) (end :hm-chords-progression) (stop :hm-chords-progression) ;; so, what's a good way to use them? just wrap separately into #'CHORD-NOTES ;; maybe at least for now ;; and then? how do I change the base note of the chord? I kind of remember that having 5th step 7chord is useful, and stuff ;; oh, I guess I could just change :root attribute, as a stream? ;; hmmm ;; but what if I want a sequence of chords, over different bases, like I IV V steps, and would want to change root for whole phrase ;; first off, I don't yet know how to repeate whole phrase several times with changing attributes, let's try that ;;; https://rockguitaruniverse.com/simple-easy-chord-progressions/ ;; i - III - iv - VI (pb :hm-chords-progress-em-g-am-c :instrument :fmrhodes1 :octave 3 ;; :degree (pseq (mapcar #'chord-notes (list :major :minor :maj7 :major)) 1) ; works, but can't insert (prest 0) among chords ;; :degree (pseq (list (chord :major) (chord :minor) (chord :maj7) (chord :major)) 1) ; doesn't seem to work :degree (pseq (list (nchord :minor) (nchord :major 2) (nchord :minor 3) (nchord :major 5) (prest 0)) 1) ; doesn't seem to work :dur (pseq (list 1 2 1 3 1)) :base 2 :root 5 ) (play :hm-chords-progress-em-g-am-c) (end :hm-chords-progress-em-g-am-c) (stop :hm-chords-progress-em-g-am-c) ;; Am – F – C – G (i – VI – III – VII) (pb :hm-chords-progress-am-f-c-g :instrument :fmrhodes1 :octave 3 ;; :degree (pseq (mapcar #'chord-notes (list :major :minor :maj7 :major)) 1) ; works, but can't insert (prest 0) among chords ;; :degree (pseq (list (chord :major) (chord :minor) (chord :maj7) (chord :major)) 1) ; doesn't seem to work :degree (pseq (list (nchord :minor) (nchord :major 3) (nchord :minor 2) (nchord :major 6) (prest 0)) 1) ; doesn't seem to work :dur (pseq (list 1 2 1 3 1)) :base 2 :root 5 ) (play :hm-chords-progress-am-f-c-g) (end :hm-chords-progress-am-f-c-g) (stop :hm-chords-progress-am-f-c-g) ;; IV V iii vi (from video on japan's favourite chord progression) ;; https://youtu.be/6aezSL_GvZA (pb :hm-chords-progress-golden-road :instrument :strings :octave 4 :legato 1 ;; :degree (pseq (mapcar #'chord-notes (list :major :minor :maj7 :major)) 1) ; works, but can't insert (prest 0) among chords ;; :degree (pseq (list (chord :major) (chord :minor) (chord :maj7) (chord :major)) 1) ; doesn't seem to work :degree (pseq (list (nchord :major 3) (nchord :major 4) (nchord :minor 2) (nchord :minor 5) ) 1) ; doesn't seem to work :dur (pseq (list 4 4 4 4 )) :root 0) (play :hm-chords-progress-golden-road) (end :hm-chords-progress-golden-road) (stop :hm-chords-progress-golden-road) ;; does it sound like in the video then? ;;; would want ;; - giving chord name and base to get a pattern of arpeggio ;; - giving (note/chord) and rhythm to get form that single note ;; latter should be possible from defining a subpattern? with static note?