Skip to content

Instantly share code, notes, and snippets.

@lspector
Last active November 28, 2017 05:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lspector/249adaf7d066406cbcdefbac3a534ae4 to your computer and use it in GitHub Desktop.
Save lspector/249adaf7d066406cbcdefbac3a534ae4 to your computer and use it in GitHub Desktop.
Turning a self-eval map into music for AI at Hampshire College: http://viewer.gorilla-repl.org/view.html?source=gist&id=249adaf7d066406cbcdefbac3a534ae4
;; gorilla-repl.fileformat = 1
;; **
;;; # Self-eval music
;;;
;;; Lee Spector, 2017
;;;
;;; This is code for turning self-evaluations into music, for CS263: Artificial Intelligence at Hampshire College. The output can be played via [Klangmeister](http://ctford.github.io/klangmeister/).
;;;
;; **
;; @@
(ns self-eval-music)
;; @@
;; =>
;;; {"type":"html","content":"<span class='clj-nil'>nil</span>","value":"nil"}
;; <=
;; @@
(defn words-to-beats
[words]
(map #(* 1/16 (count %)) words))
;; @@
;; =>
;;; {"type":"html","content":"<span class='clj-var'>#&#x27;self-eval-music/words-to-beats</span>","value":"#'self-eval-music/words-to-beats"}
;; <=
;; @@
(words-to-beats ["I" "attended" "every" "class"])
;; @@
;; =>
;;; {"type":"list-like","open":"<span class='clj-lazy-seq'>(</span>","close":"<span class='clj-lazy-seq'>)</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-ratio'>1/16</span>","value":"1/16"},{"type":"html","content":"<span class='clj-ratio'>1/2</span>","value":"1/2"},{"type":"html","content":"<span class='clj-ratio'>5/16</span>","value":"5/16"},{"type":"html","content":"<span class='clj-ratio'>5/16</span>","value":"5/16"}],"value":"(1/16 1/2 5/16 5/16)"}
;; <=
;; @@
(defn words-to-pitches
[words]
(map (fn [w]
(nth (cycle (for [octave (range 2 8)
pitch [0 4 7 11]]
(+ (* octave 12) pitch)))
(if (empty? w)
0
(int (/ (reduce + (map int w))
(count w))))))
words))
;; @@
;; =>
;;; {"type":"html","content":"<span class='clj-var'>#&#x27;self-eval-music/words-to-pitches</span>","value":"#'self-eval-music/words-to-pitches"}
;; <=
;; @@
(words-to-pitches ["I" "attended" "every" "class"])
;; @@
;; =>
;;; {"type":"list-like","open":"<span class='clj-lazy-seq'>(</span>","close":"<span class='clj-lazy-seq'>)</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-long'>28</span>","value":"28"},{"type":"html","content":"<span class='clj-long'>52</span>","value":"52"},{"type":"html","content":"<span class='clj-long'>71</span>","value":"71"},{"type":"html","content":"<span class='clj-long'>55</span>","value":"55"}],"value":"(28 52 71 55)"}
;; <=
;; @@
(use 'clojure.string)
;; @@
;; =>
;;; {"type":"html","content":"<span class='clj-nil'>nil</span>","value":"nil"}
;; <=
;; @@
(defn self-eval-music
[m]
(let [tokenized (map #(split % #"\s+")
(map str (vals (dissoc m :name :submission :attendance :rice))))
num-notes 32
parts (map #(list 'phrase
(vec (take num-notes (cycle (words-to-beats %))))
(vec (take num-notes (cycle (words-to-pitches %)))))
(map #(apply concat %) (partition 2 tokenized)))]
(cons '->> (cons (first parts)
(concat (map #(list 'with %)
(rest parts))
'((all :instrument marimba)))))))
;; @@
;; =>
;;; {"type":"html","content":"<span class='clj-var'>#&#x27;self-eval-music/self-eval-music</span>","value":"#'self-eval-music/self-eval-music"}
;; <=
;; @@
(self-eval-music
{:attendance "I attended every class and participated with enthusiasm."
:code "My code computes the answer to the ultimate question of life, the universe, and everything."
:results "42"
:presentation "I presented my code, showing that it always gives the same answer."
:knowledge "I have learned how to produce all truths using only a few lazy functions."})
;; @@
;; =>
;;; {"type":"list-like","open":"<span class='clj-list'>(</span>","close":"<span class='clj-list'>)</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-symbol'>-&gt;&gt;</span>","value":"->>"},{"type":"list-like","open":"<span class='clj-list'>(</span>","close":"<span class='clj-list'>)</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-symbol'>phrase</span>","value":"phrase"},{"type":"list-like","open":"<span class='clj-vector'>[</span>","close":"<span class='clj-vector'>]</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"},{"type":"html","content":"<span class='clj-ratio'>1/4</span>","value":"1/4"},{"type":"html","content":"<span class='clj-ratio'>1/2</span>","value":"1/2"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>3/8</span>","value":"3/8"},{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>1/2</span>","value":"1/2"},{"type":"html","content":"<span class='clj-ratio'>1/2</span>","value":"1/2"},{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"},{"type":"html","content":"<span class='clj-ratio'>5/16</span>","value":"5/16"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>9/16</span>","value":"9/16"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>11/16</span>","value":"11/16"},{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"},{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"},{"type":"html","content":"<span class='clj-ratio'>1/4</span>","value":"1/4"},{"type":"html","content":"<span class='clj-ratio'>1/2</span>","value":"1/2"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>3/8</span>","value":"3/8"},{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>1/2</span>","value":"1/2"},{"type":"html","content":"<span class='clj-ratio'>1/2</span>","value":"1/2"},{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"},{"type":"html","content":"<span class='clj-ratio'>5/16</span>","value":"5/16"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>9/16</span>","value":"9/16"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>11/16</span>","value":"11/16"},{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"}],"value":"[1/8 1/4 1/2 3/16 3/8 1/8 3/16 1/2 1/2 1/8 5/16 3/16 9/16 3/16 11/16 1/8 1/8 1/4 1/2 3/16 3/8 1/8 3/16 1/2 1/2 1/8 5/16 3/16 9/16 3/16 11/16 1/8]"},{"type":"list-like","open":"<span class='clj-vector'>[</span>","close":"<span class='clj-vector'>]</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-long'>35</span>","value":"35"},{"type":"html","content":"<span class='clj-long'>43</span>","value":"43"},{"type":"html","content":"<span class='clj-long'>67</span>","value":"67"},{"type":"html","content":"<span class='clj-long'>59</span>","value":"59"},{"type":"html","content":"<span class='clj-long'>64</span>","value":"64"},{"type":"html","content":"<span class='clj-long'>76</span>","value":"76"},{"type":"html","content":"<span class='clj-long'>59</span>","value":"59"},{"type":"html","content":"<span class='clj-long'>60</span>","value":"60"},{"type":"html","content":"<span class='clj-long'>71</span>","value":"71"},{"type":"html","content":"<span class='clj-long'>55</span>","value":"55"},{"type":"html","content":"<span class='clj-long'>84</span>","value":"84"},{"type":"html","content":"<span class='clj-long'>59</span>","value":"59"},{"type":"html","content":"<span class='clj-long'>43</span>","value":"43"},{"type":"html","content":"<span class='clj-long'>43</span>","value":"43"},{"type":"html","content":"<span class='clj-long'>47</span>","value":"47"},{"type":"html","content":"<span class='clj-long'>35</span>","value":"35"},{"type":"html","content":"<span class='clj-long'>35</span>","value":"35"},{"type":"html","content":"<span class='clj-long'>43</span>","value":"43"},{"type":"html","content":"<span class='clj-long'>67</span>","value":"67"},{"type":"html","content":"<span class='clj-long'>59</span>","value":"59"},{"type":"html","content":"<span class='clj-long'>64</span>","value":"64"},{"type":"html","content":"<span class='clj-long'>76</span>","value":"76"},{"type":"html","content":"<span class='clj-long'>59</span>","value":"59"},{"type":"html","content":"<span class='clj-long'>60</span>","value":"60"},{"type":"html","content":"<span class='clj-long'>71</span>","value":"71"},{"type":"html","content":"<span class='clj-long'>55</span>","value":"55"},{"type":"html","content":"<span class='clj-long'>84</span>","value":"84"},{"type":"html","content":"<span class='clj-long'>59</span>","value":"59"},{"type":"html","content":"<span class='clj-long'>43</span>","value":"43"},{"type":"html","content":"<span class='clj-long'>43</span>","value":"43"},{"type":"html","content":"<span class='clj-long'>47</span>","value":"47"},{"type":"html","content":"<span class='clj-long'>35</span>","value":"35"}],"value":"[35 43 67 59 64 76 59 60 71 55 84 59 43 43 47 35 35 43 67 59 64 76 59 60 71 55 84 59 43 43 47 35]"}],"value":"(phrase [1/8 1/4 1/2 3/16 3/8 1/8 3/16 1/2 1/2 1/8 5/16 3/16 9/16 3/16 11/16 1/8 1/8 1/4 1/2 3/16 3/8 1/8 3/16 1/2 1/2 1/8 5/16 3/16 9/16 3/16 11/16 1/8] [35 43 67 59 64 76 59 60 71 55 84 59 43 43 47 35 35 43 67 59 64 76 59 60 71 55 84 59 43 43 47 35])"},{"type":"list-like","open":"<span class='clj-list'>(</span>","close":"<span class='clj-list'>)</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-symbol'>with</span>","value":"with"},{"type":"list-like","open":"<span class='clj-list'>(</span>","close":"<span class='clj-list'>)</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-symbol'>phrase</span>","value":"phrase"},{"type":"list-like","open":"<span class='clj-vector'>[</span>","close":"<span class='clj-vector'>]</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-ratio'>1/16</span>","value":"1/16"},{"type":"html","content":"<span class='clj-ratio'>9/16</span>","value":"9/16"},{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"},{"type":"html","content":"<span class='clj-ratio'>5/16</span>","value":"5/16"},{"type":"html","content":"<span class='clj-ratio'>7/16</span>","value":"7/16"},{"type":"html","content":"<span class='clj-ratio'>1/4</span>","value":"1/4"},{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"},{"type":"html","content":"<span class='clj-ratio'>3/8</span>","value":"3/8"},{"type":"html","content":"<span class='clj-ratio'>5/16</span>","value":"5/16"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>1/4</span>","value":"1/4"},{"type":"html","content":"<span class='clj-ratio'>7/16</span>","value":"7/16"},{"type":"html","content":"<span class='clj-ratio'>1/16</span>","value":"1/16"},{"type":"html","content":"<span class='clj-ratio'>1/4</span>","value":"1/4"},{"type":"html","content":"<span class='clj-ratio'>7/16</span>","value":"7/16"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"},{"type":"html","content":"<span class='clj-ratio'>7/16</span>","value":"7/16"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>3/8</span>","value":"3/8"},{"type":"html","content":"<span class='clj-ratio'>5/16</span>","value":"5/16"},{"type":"html","content":"<span class='clj-ratio'>1/4</span>","value":"1/4"},{"type":"html","content":"<span class='clj-ratio'>1/16</span>","value":"1/16"},{"type":"html","content":"<span class='clj-ratio'>3/16</span>","value":"3/16"},{"type":"html","content":"<span class='clj-ratio'>1/4</span>","value":"1/4"},{"type":"html","content":"<span class='clj-ratio'>5/8</span>","value":"5/8"},{"type":"html","content":"<span class='clj-ratio'>1/16</span>","value":"1/16"},{"type":"html","content":"<span class='clj-ratio'>9/16</span>","value":"9/16"},{"type":"html","content":"<span class='clj-ratio'>1/8</span>","value":"1/8"},{"type":"html","content":"<span class='clj-ratio'>5/16</span>","value":"5/16"},{"type":"html","content":"<span class='clj-ratio'>7/16</span>","value":"7/16"},{"type":"html","content":"<span class='clj-ratio'>1/4</span>","value":"1/4"}],"value":"[1/16 9/16 1/8 5/16 7/16 1/4 1/8 3/8 5/16 3/16 1/4 7/16 1/16 1/4 7/16 3/16 1/8 7/16 3/16 3/8 5/16 1/4 1/16 3/16 1/4 5/8 1/16 9/16 1/8 5/16 7/16 1/4]"},{"type":"list-like","open":"<span class='clj-vector'>[</span>","close":"<span class='clj-vector'>]</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-long'>28</span>","value":"28"},{"type":"html","content":"<span class='clj-long'>59</span>","value":"59"},{"type":"html","content":"<span class='clj-long'>83</span>","value":"83"},{"type":"html","content":"<span class='clj-long'>83</span>","value":"83"},{"type":"html","content":"<span class='clj-long'>64</span>","value":"64"},{"type":"html","content":"<span class='clj-long'>60</span>","value":"60"},{"type":"html","content":"<span class='clj-long'>67</span>","value":"67"},{"type":"html","content":"<span class='clj-long'>64</span>","value":"64"},{"type":"html","content":"<span class='clj-long'>60</span>","value":"60"},{"type":"html","content":"<span class='clj-long'>59</span>","value":"59"},{"type":"html","content":"<span class='clj-long'>52</span>","value":"52"},{"type":"html","content":"<span class='clj-long'>36</span>","value":"36"},{"type":"html","content":"<span class='clj-long'>28</span>","value":"28"},{"type":"html","content":"<span class='clj-long'>52</span>","value":"52"},{"type":"html","content":"<span class='clj-long'>48</span>","value":"48"},{"type":"html","content":"<span class='clj-long'>71</span>","value":"71"},{"type":"html","content":"<span class='clj-long'>76</span>","value":"76"},{"type":"html","content":"<span class='clj-long'>59</span>","value":"59"},{"type":"html","content":"<span class='clj-long'>48</span>","value":"48"},{"type":"html","content":"<span class='clj-long'>76</span>","value":"76"},{"type":"html","content":"<span class='clj-long'>67</span>","value":"67"},{"type":"html","content":"<span class='clj-long'>72</span>","value":"72"},{"type":"html","content":"<span class='clj-long'>28</span>","value":"28"},{"type":"html","content":"<span class='clj-long'>59</span>","value":"59"},{"type":"html","content":"<span class='clj-long'>72</span>","value":"72"},{"type":"html","content":"<span class='clj-long'>47</span>","value":"47"},{"type":"html","content":"<span class='clj-long'>28</span>","value":"28"},{"type":"html","content":"<span class='clj-long'>59</span>","value":"59"},{"type":"html","content":"<span class='clj-long'>83</span>","value":"83"},{"type":"html","content":"<span class='clj-long'>83</span>","value":"83"},{"type":"html","content":"<span class='clj-long'>64</span>","value":"64"},{"type":"html","content":"<span class='clj-long'>60</span>","value":"60"}],"value":"[28 59 83 83 64 60 67 64 60 59 52 36 28 52 48 71 76 59 48 76 67 72 28 59 72 47 28 59 83 83 64 60]"}],"value":"(phrase [1/16 9/16 1/8 5/16 7/16 1/4 1/8 3/8 5/16 3/16 1/4 7/16 1/16 1/4 7/16 3/16 1/8 7/16 3/16 3/8 5/16 1/4 1/16 3/16 1/4 5/8 1/16 9/16 1/8 5/16 7/16 1/4] [28 59 83 83 64 60 67 64 60 59 52 36 28 52 48 71 76 59 48 76 67 72 28 59 72 47 28 59 83 83 64 60])"}],"value":"(with (phrase [1/16 9/16 1/8 5/16 7/16 1/4 1/8 3/8 5/16 3/16 1/4 7/16 1/16 1/4 7/16 3/16 1/8 7/16 3/16 3/8 5/16 1/4 1/16 3/16 1/4 5/8 1/16 9/16 1/8 5/16 7/16 1/4] [28 59 83 83 64 60 67 64 60 59 52 36 28 52 48 71 76 59 48 76 67 72 28 59 72 47 28 59 83 83 64 60]))"},{"type":"list-like","open":"<span class='clj-list'>(</span>","close":"<span class='clj-list'>)</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-symbol'>all</span>","value":"all"},{"type":"html","content":"<span class='clj-keyword'>:instrument</span>","value":":instrument"},{"type":"html","content":"<span class='clj-symbol'>marimba</span>","value":"marimba"}],"value":"(all :instrument marimba)"}],"value":"(->> (phrase [1/8 1/4 1/2 3/16 3/8 1/8 3/16 1/2 1/2 1/8 5/16 3/16 9/16 3/16 11/16 1/8 1/8 1/4 1/2 3/16 3/8 1/8 3/16 1/2 1/2 1/8 5/16 3/16 9/16 3/16 11/16 1/8] [35 43 67 59 64 76 59 60 71 55 84 59 43 43 47 35 35 43 67 59 64 76 59 60 71 55 84 59 43 43 47 35]) (with (phrase [1/16 9/16 1/8 5/16 7/16 1/4 1/8 3/8 5/16 3/16 1/4 7/16 1/16 1/4 7/16 3/16 1/8 7/16 3/16 3/8 5/16 1/4 1/16 3/16 1/4 5/8 1/16 9/16 1/8 5/16 7/16 1/4] [28 59 83 83 64 60 67 64 60 59 52 36 28 52 48 71 76 59 48 76 67 72 28 59 72 47 28 59 83 83 64 60])) (all :instrument marimba))"}
;; <=
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment