cl-patterns-study/2022-08-20-will-i-get-instr...

269 lines
6.8 KiB
Common Lisp

(setq *M1* '(0 2 4))
(setq *Min1* '(0 1.5 4))
(setq *M3* '(2 4 6))
(setq *chord* *Min1*)
(in-package #:cl-patterns)
(start-clock-loop :tempo 110/60)
(pb :what-chord
:note (pseq `(,*m1* ,*min1*))
:octave 4
:root 2
:dur (pseq '(2 2) 1)
;; :play-quant 4
)
;; (play :what-chord)
;; (end :what-chord)
(in-package #:cl-collider)
(defsynth default ((gate 1) (freq 440) (out 0))
(let* ((env (env-gen.kr (asr 0.01 1 0.1) :gate gate :act :free))
(sig (sin-osc.ar freq 0 0.2)))
(out.ar out (pan2.ar sig 0 env))))
(server-query-all-nodes) ; not sure how to interpret, but all things submitted to servier to play?
;; ok, reading found article: https://nunotrocado.com/software/cl-collider-tutorial-1.html
(defsynth tone ((freq 440) (amp 0.2))
(out.ar 0 (saw.ar freq amp)))
;; (synth 'tone)
;; (stop)
(defparameter *tone*
(synth 'tone
:freq (midicps 42)
:amp 0.3))
(free *tone*)
(defsynth tone-buzz ((freq 440) (amp 0.2))
(out.ar 0 (saw.ar (let ((detune (* freq 0.01)))
(list (- freq detune) (+ freq detune)))
(/ amp 2))))
;; (let ((node (synth 'tone-buzz)))
;; (sleep 2)
;; (free node))
(defsynth tone-pluck ((freq 440) (amp 0.2))
(out.ar 0 (* (saw.ar (let ((detune (* freq 0.01)))
(list (- freq detune) (+ freq detune))))
(env-gen.kr (perc 0.1 1.8)
:level-scale amp
:act :free))))
;; (synth 'tone-pluck)
;; (in-package #:cl-patterns)
(all-instruments)
(pb :what-instrumented
:intrument :tone-pluck
;; :note (pseq `(,*m1* ,*min1*))
:note (pseq '(0 3 7) 1)
:octave 4
:root 2
:dur (pseq '(2 2) )
;; :play-quant 4
)
;; (play :what-instrumented)
;; (stop :what-instrumented)
;;; yo, I think I understood that predef chords stuff:
(pb :what-predef-chord
:instrument :tone-buzz
:note (pseq (mapcar #'chord-notes (list (chord "Major Triad") (chord "Minor Triad") (chord "Minor 7th") (chord "Major 7th") (chord "Diminished Triad") (chord "Major Triad"))) 1)
:octave 4
:root 2
:dur (pseq '(2 2 4))
;; :play-quant 4
)
;; (play :what-predef-chord)
;; (end :what-predef-chord)
(pb :what-try-instrument
:instrument :tone-pluck
:note (pseq '(1 2 3 7) 1)
:octave 4
:root 2
:dur (pseq '(2 2 4))
;; :play-quant 4
)
;; (play :what-try-instrument)
;; (stop :what-try-instrument)
(pb :what-instrumented-2-maybe
:instrument :tone-pluck
;; :note (pseq `(,*m1* ,*min1*))
:note (pseq '(0 3 7) 1)
:octave 4
:root 2
:dur (pseq '(2 2) )
;; :play-quant 4
)
;; (play :what-instrumented-2-maybe)
;; (stop :what-instrumented-2-maybe)
;;; now let's try to get some synths for percussions?
;; copied from https://github.com/defaultxr/cl-patterns/blob/master/doc/supercollider-example.lisp
(defsynth kik ((freq 440) (out 0))
(let* ((env (env-gen.kr (env (list 0 1 0) (list 0.001 1)) :act :free))
(fenv (env-gen.kr (env (list 1 0) (list 0.25)) :level-scale freq))
(sig (sin-osc.ar fenv 0 0.2)))
(out.ar out (pan2.ar sig 0 env))))
(synth :kik)
(in-package #:cl-patterns)
(pb :what-percussion
:instrument :kik
;; :note (pseq `(,*m1* ,*min1*))
:note (pseq '(0 3 7) 1)
:octave 4
:root 2
:dur (pseq '(2 2) )
;; :play-quant 4
)
;; (play :what-percussion)
;; (stop :what-percussion)
;; well, I don't understand, do I go read supercollider docs?
;; about EnvGen SinOsc ?
;; woa, there's old archived https://github.com/madskjeldgaard/awesome-supercollider
;;; let's try to convert drum-kik https://github.com/everythingwillbetakenaway/Synthdefs/blob/master/drum_kick.scd
;; (
;; SynthDef(\drum_kick, {
;; arg freq=440, gate=1, amp=0.5, source,pan = 0.0 ;
;; source =
;; Pan2.ar(
;; SinOsc.ar(EnvGen.kr(Env.perc(0.0001, 1.5, 1, -200), gate, 1000, 45, doneAction:2), 1, 1) +
;; ((BPF.ar([GrayNoise.ar(6),GrayNoise.ar(6)],EnvGen.kr(Env.perc(0.001, 0.3, 1, -200), gate, 6000, 70), 1.5)).distort * Line.kr(0.3,0,0.1))
;; *
;; EnvGen.kr(Env.perc(0.0001, 0.09, amp, 8)),0);
;; Out.ar(0, source);
;; }).add;
;; )
;; Synth(\drum_kick);
(in-package #:cl-collider)
(defsynth drum-kik ((freq 440) (out 0) (gate 1) (amp 0.5) (pan 0.0))
(let* ((env (env-gen.kr (env (list 0 1 0) (list 0.001 1)) :act :free))
(fenv (env-gen.kr (env (list 1 0) (list 0.25)) :level-scale freq))
(sig (sin-osc.ar fenv 0 0.2))
(pan (pan2.ar sig 0 env)))
(out.ar out pan)))
(synth :drum-kik)
(cl-patterns::all-instruments)
;;; ok, fuck that let's play
;; just do some percussion with existing kik and chord progressions, and maybe a melody
(in-package #:cl-patterns)
(pb :what-predef-chord
:instrument :tone-pluck
:note (pseq (mapcar #'chord-notes (list (chord "Major Triad") (chord "Minor Triad") (chord "Minor 7th") (chord "Major 7th") (chord "Diminished Triad") (chord "Major Triad"))) 1)
:octave 4
:root 2
:dur (pseq '(2 2 4))
;; :play-quant 4
)
;; (play :what-predef-chord)
;; (end :what-predef-chord)
(pb :what-basic-percussion
:instrument :kik
:note 0
:dur (pseq '(1) 1) ; ok, too hard again, want to finish something and go on
:play-quant 4)
;; (play :what-basic-percussion)
;; (stop :what-basic-percussion)
;; how do I now join both of these?
(pb :first-composition (ppar (list :what-predef-chord :what-basic-percussion))) ; bs, wtf
(next-upto-n (ppar (list (pbind :dur (pn 1/2 4))
(pbind :dur (pn 2/3 4)))))
(next-upto-n (ppar (list :what-basic-percussion :what-predef-chord)))
;; (play :first-composition)
;; (stop :first-composition)
;; (next-upto-n (pmeta :pattern (pseq (list :what-basic-percussion :what-predef-chord) 1) :sync 2))
;; god, I have no idea how to have two patterns play at the same time =C
;; (play (list :what-basic-percussion :what-predef-chord))
;; (stop (list :what-basic-percussion :what-predef-chord))
;;
;; welp that workds
;; bs, but maybe I'll put it into file and get a break already
(in-package #:cl-collider)
;; from https://github.com/byulparan/cl-collider
;;; write a single channel to disk
;; we can write to buffer number out_buf_num by reading in from the 0 bus
(defsynth disk_writer ((out_buf_num 99))
(disk-out.ar out_buf_num (in.ar 0)))
(setf mybuffer (buffer-alloc (expt 2 17)))
mybuffer
;; start a disk_writer synth
(setf writer_0 (synth 'disk_writer))
;; make it output to buffer you allocated
(ctrl writer_0 :out_buf_num (bufnum mybuffer))
;; continuously write the buffer contents to a file
(buffer-write mybuffer "/tmp/foo.aiff" :leave-open-p t)
;; now play whatever sounds you like
;; e.g.
(proxy :blah (sin-osc.ar 440))
(free :blah)
;; then when you are done
;; stop the disk_writer synth
(free writer_0)
;; close and free the buffer
(buffer-close mybuffer)
(buffer-free mybuffer)
;; then you can play what you recorded with a utility like mpv:
;; mpv /tmp/foo.aiff
;; (cl-patterns:stop t)