Last active
November 28, 2017 05:03
-
-
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
This file contains hidden or 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
;; 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'>#'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'>#'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'>#'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'>->></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