first experiment written down

This commit is contained in:
efim 2022-09-11 15:32:15 +00:00
parent 00515cd9df
commit e6270ea435
6 changed files with 262 additions and 10 deletions

View File

@ -235,8 +235,7 @@
;; (stop :maybe-arpegio-padded)
(next-upto-n (pdef :maybe-arpegio-padded) 30)
(next-upto-n (psync (pseq (list 1 2 3) 6) 8) 30)
;; maybe that doesn't work because #'PSYNC need to be in context of bound stream, with :dur present?
;; (next-upto-n (psync (pseq (list 1 2 3) 6) 8) 30) ;; maybe that doesn't work because #'PSYNC need to be in context of bound stream, with :dur present?
;; that's possible
(next-upto-n (psync (pbind

View File

@ -76,14 +76,14 @@
;;; ok! now let's do 4 bars of same, then 4 bars with 1/3 duration in arpeggios
;; IV V iii vi
(setq *my-chords* (list :major :major :minor :minor)
*my-roots* (list 3 4 2 5))
;; (setq *my-chords* (list :major :major :minor :minor)
;; *my-roots* (list 3 4 2 5))
;; for now will set in 09-11.lisp
(pb :lets-arpegio-before-duration
:embed (not-perfect-but-arpeggio *my-chords*) ; each chord plays arpeggio for whole phrase (two bars)
:embed (attr-per-phrase :root *my-roots*)
:embed (attr-per-phrase :legato (list 1 0.7 0.5 0.8)) ; each phrase takes single value for legato
:embed (attr-per-phrase :legato (list 1 0.8 0.6 0.9)) ; each phrase takes single value for legato
; even if amount of events in phrase change with change of :dur
)
;; (next-upto-n (pdef :lets-arpegio-iv-v-iii-vi) 30)

View File

@ -0,0 +1,232 @@
;;; today I'd like to do bass arpegios, with high chords
;; and maybe drums for both parts (from 09-09)
;; and join them?
;; IV V iii vi
;; (setq *my-chords* (list :major :major :minor :minor)
;; *my-roots* (list 3 4 2 5))
;; (setq *my-chords* (list :major)
;; *my-roots* (list 3))
;; Am F C G (i VI III VII)
;; (setq *my-chords* (list :minor :major :major :major)
;; *my-roots* (list 0 3 2 6))
;; i - III - iv - VI
(setq *my-chords* (list :minor :major :minor :major)
*my-roots* (list 0 2 3 5))
(in-package :cl-patterns)
(start-clock-loop :tempo 90/60 :force t)
(pb :lets-slow-bass-arpegio
:dur 2
:octave 3
;; :instrument :fmbass
:embed (not-perfect-but-arpeggio *my-chords*)
:embed (attr-per-phrase :root *my-roots*)
)
;; (play :lets-slow-bass-arpegio)
;; (stop :lets-slow-bass-arpegio)
;; well, what if I rather take my simple-bass thing
;; and give it some kind of slow pattern
;; nope, that simple-bass plays whole chords
;;
;; at this point I'm just tempted to not use chords,
;; and have a PARP
(pdef :chord-defs
(pbind :chord (pseq *my-chords* 1)
:chord-base (pseq *my-roots* 1)))
(pb :lets-slow-bass-melody
(parp
(pdef :chord-defs)
(pbind :step (pseq (list 0 1 0 1 2 0 1 2) 1)
:dur (pseq (list 1/4 1/4 1 1 1 1 1 5/2) 1)
;; :note (pfunc (lambda ()
;; (event-value *event* :step)))
:note (pfunc (lambda ()
(+ (event-value *event* :chord-base)
(nth (event-value *event* :step)
(chord-notes (event-value *event* :chord))))))
)))
;; (next-upto-n (pdef :lets-slow-bass-melody) 10)
;; (play :lets-slow-bass-melody)
;; (end :lets-slow-bass-melody)
;; (stop :lets-slow-bass-melody)
(pb :embedding-bass-melogy-into-pattern
(pseq (list (pbind
:quant 4
:dur (pseq (list (prest 7/2)) 1))
(pbind
:octave 2 ; let's add these later? when join both?
:instrument :fmbass
:embed :lets-slow-bass-melody))
1))
(next-upto-n (pdef :embedding-bass-melogy-into-pattern) 20)
;; (play :embedding-bass-melogy-into-pattern)
;; (stop :embedding-bass-melogy-into-pattern)
;; (end :embedding-bass-melogy-into-pattern)
;; now. let's brainstorm the pattern on a single chord?
;; and well, my guess is that pattern should start from 1/2 before tha bar start?
;; so is there a "timer shift" for pattern?
;; if I can only align by quant
;; ( upbeat ? )
;; well 3 6 9 - and we have -1 +2 and +1 over the quant :4
;; ok, let's for not simulate that stuff by writing continuous bass melody
;; and adding 3 1/2 rest in the beginning
;; I'd like to add bottom note repeating at 1/2 ?
;;; let's just do same? quant 4, wait for the upbeat of next bar
;;; and start playing 1/2 8 times?
(pb :lets-slow-bass-melody-root-repeating
(pseq (list (pbind :dur (pseq (list (prest 4)) 1)
:quant 4)
(parp
(pdef :chord-defs)
(pbind
:octave 1
:instrument :fmbass
:dur (pseq (list (prest 5/2) (pfindur 1/2 7/2) (prest 2)) 1)
:legato 0.5
:note (pk :chord-base)))
(pbind :dur (pseq (list (prest 1)) 1)))
1))
(next-upto-n (pdef :lets-slow-bass-melody-root-repeating) 20)
;; (play :lets-slow-bass-melody-root-repeating)
;; (end :lets-slow-bass-melody-root-repeating)
;; (stop :lets-slow-bass-melody-root-repeating)
(pdef :full-bass-melody
(ppar (list :embedding-bass-melogy-into-pattern :lets-slow-bass-melody-root-repeating)))
;; (play :full-bass-melody)
;; (stop :full-bass-melody)
;; yay, not sure whether I want :octave 1 or 2, but overall, cool,
;; even though - so much still to learn to not have to do manual calculaitons of prest and such
;; let's have some kind of light chord holding. not sure what I want, maybe default
;; maybe strings? or pluck
(pb :high-chords-hold
:embed :chord-defs
:instrument :tone-buzz
:dur 8
:quant 4
:amp 0.05
:note (p+ (pk :chord-base) (pnary #'chord-notes (pk :chord))))
(next-upto-n (pdef :high-chords-hold) 30)
;; (play :high-chords-hold)
;; (end :high-chords-hold)
;; (stop :high-chords-hold)
(pb :high-chords-with-pre-bar
(pseq (list
(pbind :dur (pseq (list (prest 4)) 1)) ; most awkward thing
(pdef :high-chords-hold))
1))
(pdef :total-base-section
(ppar (list :full-bass-melody :high-chords-with-pre-bar)))
;; (play :total-base-section)
;; (stop :total-base-section)
;; well, it seems that with restarts defsynts of fmbass start playing worse?
;; responding less and less to short notes and legato?
;; is that due to not restarting sbcl?
;; let's try full restart
;;; I've done full restart, didn't totally help.
;; and I've set slower clock speed
;;; now, let's add intro, connection and ending?
(pb :intro
:embed :chord-defs
:dur (pseq (list 2 2 4) 1)
:instrument :strings
:amp 0.1
:note (p+ (first *my-roots*) (pnary #'chord-notes (first *my-chords*))))
;; (play :intro)
;; (stop :intro)
;; (end :intro)
;; idea for not now - third chord make in two octaves?
;;; maybe add a scratch inbetween?
(pb :phrase-connection
:instrument :fmbass
:dur (pseq (list (prest 2) 12 (prest 4)) 1)
:embed :chord-defs
:octave 2
:note (p+ (first *my-roots*) (pnary #'chord-notes (first *my-chords*)))
)
;; (play :phrase-connection)
;; (stop :phrase-connection)
;;; for this to work, also evaluate ~/Documents/personal/common-lisp-study/music/dirty-journal/2022-09-09-maybe-cleanup-bass-from-chords.lisp
;; maybe later on cleanup I'd put everything into same file
(pdef :is-that-first-experiment
(pseq (list (pdef :intro)
(pdef :total-base-section)
(pdef :phrase-connection)
(pdef :arpegios-and-bass))
1))
;; (play :is-that-first-experiment)
;; (stop :is-that-first-experiment)
;; (end :is-that-first-experiment)
;; welp, when notes are too quick, they are not produced
;; and I also kind of wanted a percussion line, but oh well
;; ;;; ok, let's record that,
;; ;; we can write to buffer number out_buf_num by reading in from the 0 bus
;; (in-package cl-collider)
;; (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
;; ;; ;; IV V iii vi
;; ;; Am F C G (i VI III VII)
;; ;; i - III - iv - VI
;; (buffer-write mybuffer "/tmp/first-experiment-i-III-iv-VI.aiff" :leave-open-p t)
;; ;; now play whatever sounds you like
;; ;; e.g.
;; (in-package :cl-patterns)
;; (play :is-that-first-experiment)
;; (stop :is-that-first-experiment)
;; (end :is-that-first-experiment)
;; ;; then when you are done
;; (in-package cl-collider)
;; ;; 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

View File

@ -410,3 +410,21 @@ maybe put everything under "dirty-journal" directory
and start a "clean" journal
* [2022-09-09 Fri]
** let's move everything into "dirty-journal"
* [2022-09-11 Sun]
** so, today I've been writing bass arpeggios
** biggest questin - upbeat before first bar,
how to effectively write that?
so that it would be easy to sync things on :quant
** thing I found out -
it would be nice to specify chords and chord-bases as a pattern
to be embedded
that way I'd be able to switch it up on the go and all patterns extending it would pick it up?
well, maybe not all at the same time, if they are not synched =C
** would be nice to put everything of 09-09 and 09-11 into single file
to make it easier to restart whole first experiment with different chords
also, have I saved a link to the side where I saw the chord progressions I used?
also-also having a keyboard could be a nice help

View File

@ -1,3 +1,4 @@
(in-package :cl-patterns)
(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 (chord symbol))))

View File

@ -150,10 +150,12 @@
(sig (sin-osc.ar freq 0 0.2)))
(out.ar out (pan2.ar sig 0 env))))
(defsynth tone-buzz ((freq 440) (amp 0.2))
(out.ar 0 (saw.ar (let ((detune (* freq 0.01)))
(defsynth tone-buzz ((freq 440) (amp 0.2) (gate 1))
(out.ar 0 (*
(saw.ar (let ((detune (* freq 0.01)))
(list (- freq detune) (+ freq detune)))
(/ amp 2))))
(/ amp 2))
(env-gen.kr (asr 0 1 0.1) :gate gate :act :free))))
(defsynth tone-pluck ((freq 440) (amp 0.2))
(out.ar 0 (* (saw.ar (let ((detune (* freq 0.01)))