Music as data
-
Upload
jonromer -
Category
Technology
-
view
1.345 -
download
1
description
Transcript of Music as data
![Page 1: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/1.jpg)
Hackers and RockstarsLive programming Music in Clojure
John Vlachoyiannis@jonromero
[email protected]://mad.emotionull.com
![Page 2: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/2.jpg)
Who am I?
![Page 3: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/3.jpg)
Jon VlachoyiannisSoftware Samurai and Serial Entrepreneur
Teaching Parallel Processing [Greece]Founder: Sfalma.com
Founder: busyFounder.comHacker: Niobiumlabs.com
http://www.linkedin.com/in/johnvlachoyiannis
![Page 4: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/4.jpg)
Hackers
![Page 5: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/5.jpg)
![Page 6: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/6.jpg)
Not really
![Page 7: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/7.jpg)
Hackers = Creators
![Page 8: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/8.jpg)
![Page 9: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/9.jpg)
![Page 10: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/10.jpg)
Rockstars
![Page 11: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/11.jpg)
> (equals? programming making-music)true
![Page 12: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/12.jpg)
> (equals? music is-data true)true
![Page 13: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/13.jpg)
Notes are data and code
![Page 14: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/14.jpg)
![Page 15: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/15.jpg)
Supercollider
![Page 16: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/16.jpg)
{ [SinOsc.ar(440, 0, 0.2), SinOsc.ar(442, 0, 0.2)] }.play;
![Page 17: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/17.jpg)
Chuck
![Page 18: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/18.jpg)
// make our patch SinOsc s => dac;
// time-loop, in which the osc's frequency is changed every 100 ms
while( true ) { 100::ms => now;
Std.rand2f(30.0, 1000.0) => s.freq;}
![Page 19: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/19.jpg)
Impromptu
![Page 20: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/20.jpg)
; make sure that everything is disconnected(au:clear-graph)
; setup simple au graph; piano -> output
(define piano (au:make-node "aumu" "dls " "appl"))
(au:connect-node piano 0 *au:output-node* 0)(au:update-graph)
; play note on piano(play-note (now) piano 60 80 (* 1.0 *second*))
![Page 21: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/21.jpg)
Toplap.orgTemporary Organisation for the Proliferation of Live Artistic
Programming
![Page 22: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/22.jpg)
I can do it better!
![Page 23: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/23.jpg)
Python
![Page 24: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/24.jpg)
musik:> [a [ [v a d] [e [f a] ] g] [f g] [a b f [ [d s] f] f a a] ]
musik:> [kaboosh bam [dam vd [vd a]]]
musik:>[ k+s [ k k ] s s [ k+a ] ]
![Page 25: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/25.jpg)
●Time (duration) is written like in real music● Easy to understand● Hand-made REPL
![Page 26: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/26.jpg)
# Thanks Darth Eru for the original version! def parse(self, origString): root = "" tokens = re.compile(r'(\[?\]?\ ?)') origString = [word.strip() for word in tokens.split(origString) if word.strip() != '' ]
stack = [] for element in origString: if element[0] == '[': if element[1:] == "": newLevel = [] else: newLevel = [ element[1:] ] stack.append(newLevel) elif element[-1] == ']': if element[0:-1] != "": stack[-1].append(element[0:-1]) finished = stack.pop() if len(stack): stack[-1].append(finished) elif element[0]: root = finished else: stack[-1].append(element) return root
![Page 27: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/27.jpg)
● This bracket syntax is HARD ● Not so easy to add effects
● Concurrency bye-bye
![Page 28: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/28.jpg)
Something “feels” wrong
![Page 29: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/29.jpg)
Meet Clojure
![Page 30: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/30.jpg)
What is Clojure?
![Page 31: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/31.jpg)
Ok, what is Lisp?
![Page 32: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/32.jpg)
“Lisp is worth learning for the profound enlightenment experience you will have
when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use
Lisp itself a lot."
Eric S. Raymond, "How to Become a Eric S. Raymond, "How to Become a Hacker".Hacker".
![Page 33: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/33.jpg)
“LISP stands for: Lots of Insane Stupid Parentheses”
AnonymousAnonymous
![Page 34: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/34.jpg)
The Truth about Lisp
![Page 35: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/35.jpg)
LISLISt PProcessing
● Second oldest high-level language (first is Fortran)
● Code as Data (Homoiconic)● Perfect for Domain-specific languages
(DSL)● Exploratory programming
![Page 36: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/36.jpg)
Clojure
● Lisp in JVM● Concurrent programming● Dynamic Development (REPL)● Lazy sequences● No side effects (almost)
![Page 37: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/37.jpg)
clojure might be a better java than java
![Page 38: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/38.jpg)
public class StringUtils {public static boolean isBlank(String str) {
int strLen;if (str == null || (strLen = str.length()) == 0) {
return true;}for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;}
}return true;
}}
![Page 39: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/39.jpg)
public class StringUtils {public isBlank(str) {
if (str == null || (strLen = str.length()) == 0) {return true;
}for (i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;}
}return true;
}}
![Page 40: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/40.jpg)
public isBlank(str) {if (str == null || (strLen = str.length()) == 0) {
return true;}for (i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {return false;
}}return true;
}
![Page 41: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/41.jpg)
public isBlank(str) {if (str == null || (strLen = str.length()) == 0) {
return true;}
every (ch in str) {Character.isWhitespace(ch);
} return true;
}
![Page 42: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/42.jpg)
public isBlank(str) {every (ch in str) {
Character.isWhitespace(ch);}
}
![Page 43: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/43.jpg)
(defn blank? [s] (every? #(Character/isWhitespace %) s))
![Page 44: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/44.jpg)
Everything is code
![Page 45: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/45.jpg)
(println "Hello World")
function argument
![Page 46: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/46.jpg)
Everything is data
![Page 47: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/47.jpg)
(println "Hello World")
symbol string
list
![Page 48: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/48.jpg)
Where is the correlation?
![Page 49: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/49.jpg)
Let's get M.A.D!
![Page 50: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/50.jpg)
● Live programming (REPL)● Using Processing (processing.org)
● Easy to extend● Easy to understand
● Fun!
![Page 51: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/51.jpg)
> (p (pattern [kick]));; 1/1 is kick
![Page 52: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/52.jpg)
(defsample “kick” path-of-sample);; create as sample kick
![Page 53: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/53.jpg)
(defnote A#4 @*sine*);; create a note
![Page 54: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/54.jpg)
(create-notes);; creates all defnotes for notes
;; helping function
![Page 55: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/55.jpg)
Everything is one data structure
![Page 56: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/56.jpg)
(defrecord Melement [volume pitch duration play-fn data])
![Page 57: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/57.jpg)
play-fn can be anything you like
![Page 58: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/58.jpg)
(defn play-sample [sample] (.trigger (:data sample)))
;; for samples
![Page 59: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/59.jpg)
> (p (pattern [kick]));; 1/1 is kick
![Page 60: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/60.jpg)
pattern calculates the correct timing updates the :duration for notes
![Page 61: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/61.jpg)
> (p (pattern [kick kick]));; play two kicks
;; ½ kick;; ½ kick
![Page 62: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/62.jpg)
p plays each note at the correct timing
![Page 63: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/63.jpg)
(p (pattern [kick (+snare hihat)]));; two times again
;; ½ kick;; ½ snare with hihat
![Page 64: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/64.jpg)
(p (pattern [kick [snare snare snare]]));; two times again
;; ½ kick;; (½ / 3) snare;; (½ / 3) snare;; (½ / 3) snare
![Page 65: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/65.jpg)
Just like real music
![Page 66: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/66.jpg)
Now fun! Hint: transformations
![Page 67: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/67.jpg)
(p (pattern [A4 B4 C5 D5 E5 F5 G5]))
![Page 68: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/68.jpg)
(p (reverse (pattern [A4 B4 C5 D5 E5 F5 G5])))
![Page 69: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/69.jpg)
(p (map #(assoc % :pitch (.nextInt (java.util.Random.) 1100))
(pattern [E4 G4 B4 E5 B4 G4]))
![Page 70: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/70.jpg)
You can manipulate music as a data structure
![Page 71: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/71.jpg)
(keep-looping)
![Page 72: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/72.jpg)
(play! [[E4 G4 E4] [E5 B4 G4 D4 A4 E4 G4 A4]])
![Page 73: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/73.jpg)
play! Lets you experiment in real timeLive programming
![Page 74: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/74.jpg)
Using Processing for Visual effects
![Page 75: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/75.jpg)
![Page 76: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/76.jpg)
Limit? The audio sky!
![Page 77: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/77.jpg)
(play! (text-to-notes (get-latest-twits));; add markov-chains
![Page 78: Music as data](https://reader034.fdocuments.in/reader034/viewer/2022042813/549ed0e2ac79594c768b488a/html5/thumbnails/78.jpg)
Searching for members forBand of Emacs
Give me a twit at @jonromero if interested