Skip to content

Instantly share code, notes, and snippets.

@pjagielski
Last active August 24, 2022 02:37
Show Gist options
  • Save pjagielski/db81fb7f8d3e736e66d7b369f7720777 to your computer and use it in GitHub Desktop.
Save pjagielski/db81fb7f8d3e736e66d7b369f7720777 to your computer and use it in GitHub Desktop.
My talk from Dutch Clojure Days 2017
(ns talk
(:require [overtone.core :refer :all]
[clojure.java.io :as io]))
;; Overtone by Sam Aaron & Jeff Rose
;; https://github.com/overtone/overtone
(definst da-funk [freq 440 dur 1.0 amp 1.0 cutoff 1700 boost 6 dist-level 0.015]
(let [env (env-gen (adsr 0.3 0.7 0.5 0.3) (line:kr 1.0 0.0 dur) :action FREE)
filter-env (+ (* freq 0.15)
(env-gen (adsr 0.5 0.3 1 0.5)
(line:kr 1.0 0.0 (/ dur 2)) :level-scale cutoff))
osc (mix [(saw freq)
(saw (* freq 0.75))
])]
(-> osc
(bpf filter-env 0.6)
(* env amp)
pan2
(clip2 dist-level)
(* boost)
distort
)))
(comment
(midi->hz (note :G4))
(da-funk (midi->hz (note :G4))))
;; Leipzig by Chris Ford
;; https://github.com/ctford/leipzig
(require '[leipzig.melody :refer :all])
(require '[leipzig.scale :as scale])
(require '[leipzig.live :as live])
(require '[leipzig.temperament :as temperament])
(def leipzig-melody
[{:time 0 :duration 1 :pitch 391.99 :part :da-funk}
{:time 1 :duration 1/2 :pitch 349.22 :part :da-funk}
{:time 3/2 :duration 1/2 :pitch 391.99 :part :da-funk}])
(defmethod live/play-note :da-funk [{hertz :pitch seconds :duration amp :amp cutoff :cutoff}]
(when hertz
(da-funk :freq hertz :dur seconds :amp (or amp 1) :cutoff (or cutoff 1700))))
(comment
(live/play-note {:time 0 :duration 1 :pitch 391.99 :part :da-funk :amp 1}))
(def g-minor (comp scale/G scale/minor))
(comment
(find-note-name (g-minor 0))
(find-note-name (g-minor 1))
(find-note-name (g-minor 2))
(->> (range 8)
(map g-minor)
(map find-note-name)))
(def da-funk-phrase
(->> (phrase (concat [2] (take 12 (cycle [1/2 1/2 1/2 2.5])) [1 1])
[7 6 7 9 4 3 4 6 2 1 2 4 0 1 2])
(where :pitch (comp scale/low scale/G scale/minor))
(all :amp 0.5)))
(comment
da-funk-phrase
(count da-funk-phrase))
(def da-funk-track
(->> da-funk-phrase
(all :part :da-funk)
(wherever :pitch, :pitch temperament/equal)
(tempo (bpm 110))))
(comment
da-funk-track
(live/play da-funk-track))
(def da-funk-ref (ref da-funk-track))
(comment
(live/jam da-funk-ref)
(live/stop)
(dosync
(alter da-funk-ref
(fn [track]
(->> track
(all :cutoff 1500))))))
;; Disclojure - live coding environment based on Leipzig and Overtone
;; https://github.com/pjagielski/disclojure
(require '[disclojure.live :as l])
(require '[disclojure.play])
(require '[disclojure.kit :as k])
(require '[disclojure.track :as t])
(require '[disclojure.sampler :as s])
(require '[disclojure.melody :refer :all])
(require '[disclojure.play])
(reset! t/metro 110)
(l/reset-track {:beat []})
;; Beat patterns
(k/load-kit! (io/file "work/beats/da-funk"))
(comment
(live/play-note {:part :beat :drum :fat-kick :time 0 :amp 0.5})
(live/play-note {:part :beat :drum :snare :time 0 :amp 0.3})
(live/play (->> [{:time 0 :duration 1 :drum :fat-kick :part :beat}
{:time 1 :duration 1 :drum :fat-kick :part :beat}
{:time 1 :duration 1 :drum :snare :part :beat}
{:time 2 :duration 1 :drum :fat-kick :part :beat}
{:time 3 :duration 1 :drum :fat-kick :part :beat}
{:time 3 :duration 1 :drum :snare :part :beat}]
(all :amp 0.5)
(tempo (bpm 110))))
(l/reset-track {:da-funk []})
(->> (reduce with
[
(t/tap :fat-kick (range 8) 8 :amp 0.5)
(t/tap :kick (range 8) 8 :amp 0.5)
#_(->> (t/tap :horn [0 1/2 5/4 2 11/4] 4)
(all :amp 0.4)
(times 2))
(t/tap :snare (range 1 8 2) 8 :amp 0.5)
(t/tap :close-hat (sort (concat [3.75 7.75] (range 1/2 8 1))) 8)
])
(all :part :beat)
(times 2)
(l/assoc-track :beat))
(live/play @(l/track))
(live/jam (l/track))
(l/assoc-track :da-funk (->> da-funk-phrase
(all :amp 0.4)
(all :part :da-funk)))
(live/stop))
;; Samples and loop support
(comment
(l/reset-track {:beat []})
(reset! t/metro 110))
(s/load-samples! (io/file "work/samples"))
(comment
(live/play-note {:time 0 :part :sampler :sample :da-funk-303 :bpm 110 :beats 4 :amp 0.7})
(live/play-note {:time 0 :part :sampler :sample :dhs-drum-loop-1b :bpm 110 :beats 4})
(live/play-note {:time 0 :part :sampler :sample :dhs-drum-loop-1b :bpm 110 :beats 2})
(live/play-note {:time 0 :part :sampler :sample :dhs-drum-loop-1b :bpm 110 :beats 1})
(live/play-note {:time 0 :part :sampler :sample :dhs-drum-loop-1b :bpm 110 :beats 1/2})
(live/play-note {:time 0 :part :sampler :sample :da-funk-303 :bpm 110 :beats 1/4 :start-beat 1/2})
(live/play-note {:time 0 :part :sampler :sample :da-funk-303 :bpm 110 :beats 1/4 :start-beat 1})
;; http://www.junglebreaks.co.uk/breaks.html
(live/play-note {:time 0 :part :sampler :sample :skull-snaps :bpm 110 :beats 4})
(live/play-note {:time 0 :part :sampler :sample :funky-drummer :bpm 110 :beats 4})
(live/play-note {:time 0 :part :sampler :sample :smack-beat :bpm 110 :beats 4})
(live/play-note {:time 0 :part :sampler :sample :apache :bpm 110 :beats 4})
(live/play-note {:time 0 :part :sampler :sample :giorgio-arp :bpm 110 :beats 8})
(->> [
[0 :giorgio-arp 8 :amp 0.75]
[(range 0 8 4) :skull-snaps 4 :amp 0.75]
[(range 0 8 4) :hotpants 4 :amp 0.5]
;[0 :dhs-drum-loop-1b 8 :amp 0.5]
;[0 :dhs-drum-loop-2b 8 :amp 0.5]
;[0 :dhs-drum-loop-4c 8 :amp 0.5]
]
(t/sampler)
(tempo (bpm 110))
(live/play)))
(comment
(l/reset-track {:beat []})
(l/assoc-track :sampler (->> [
;[(range 4 5 1/4) :da-funk-303 1/16 :start-beat 1 :amp 0.75]
;[(range 5 6 1/4) :da-funk-303 1/16 :start-beat 1/2 :amp 0.75]
;[(range 12 16 3/8) :da-funk-303 1/8 :start-beat 1 :amp 0.75]
;[[0 8] :dhs-bass-loop-1 4 :start-beat 16 :amp 1 :cutoff 1000]
;[[2 10] :dhs-flute-loop 6 :start-beat 2 :amp 0.4 :cutoff 5000]
;[0 :dhs-pluck-loop-1 16 :amp 0.4 :cutoff 7000]
;[0 :dhs-flute-loop 16 :amp 1 :cutoff 7000]
;[(range 0 16 1) :dhs-flute-loop 1 :amp 1 :cutoff 7000]
;[0 :dhs-noise 16 :amp 1 :cutoff 6700]
;[[0 8] :da-funk 5 :amp 0.5 :cutoff 5000]
;[(range 0 16 1) :dhs-drum-loop-1b 1/16 :amp 0.75 :cutoff 7000]
;[(range 0 16 1/2) :dhs-drum-loop-1b 1/16 :amp 0.75 :cutoff 7000]
;[(range 0 16 1/4) :dhs-drum-loop-1b 1/16 :amp 0.75 :cutoff 7000]
;[(range 0 16 1/8) :dhs-drum-loop-1b 1/16 :amp 0.75 :cutoff 7000]
;[[0 8] :dhs-drum-loop-2a 8 :amp 0.75 :cutoff 7000]
;[[0 8] :dhs-drum-loop-4c 8 :amp 0.5 :cutoff 5000]
;[(range 0 16 4) :skull-snaps 4 :amp 1]
;[(range 0 16 4) :hotpants 4 :amp 1]
]
(t/sampler)))
(l/assoc-track :da-funk
(->> (phrase [6 1 1]
[nil 1 2])
(where :pitch (comp scale/low scale/G scale/minor))
(all :part :da-funk)
(all :amp 0.5)
(all :cutoff 1700)
(times 2)))
(->> (reduce with
[
;(->> (t/tap :horn [2 11/4] 4) (all :amp 0.2) (times 2))
(t/tap :snare (range 1 8 2) 8 :amp 0.5)
])
(all :part :beat)
(times 2)
(l/assoc-track :beat))
(l/assoc-track :stab [] :plucky [])
(l/assoc-track :beat [] :da-funk [])
(l/assoc-track :da-funk [])
(l/assoc-track :supersaw [] :plucky [])
(l/assoc-track :sampler [] :beat [])
(live/jam (l/track))
(live/stop))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment