Last active
August 24, 2022 02:37
-
-
Save pjagielski/db81fb7f8d3e736e66d7b369f7720777 to your computer and use it in GitHub Desktop.
My talk from Dutch Clojure Days 2017
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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