Music as data

79
Hackers and Rockstars Live programming Music in Clojure John Vlachoyiannis @jonromero [email protected] Http://mad.emotionull.com

description

My presentation at #dyncon.

Transcript of Music as data

Page 1: Music as data

Hackers and RockstarsLive programming Music in Clojure

John Vlachoyiannis@jonromero

[email protected]://mad.emotionull.com

Page 2: Music as data

Who am I?

Page 3: Music as data

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

Hackers

Page 5: Music as data
Page 6: Music as data

Not really

Page 7: Music as data

Hackers = Creators

Page 8: Music as data
Page 9: Music as data
Page 10: Music as data

Rockstars

Page 11: Music as data

> (equals? programming making-music)true

Page 12: Music as data

> (equals? music is-data true)true

Page 13: Music as data

Notes are data and code

Page 14: Music as data
Page 15: Music as data

Supercollider

Page 16: Music as data

{ [SinOsc.ar(440, 0, 0.2), SinOsc.ar(442, 0, 0.2)] }.play;

Page 17: Music as data

Chuck

Page 18: Music as data

// 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

Impromptu

Page 20: Music as data

; 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

Toplap.orgTemporary Organisation for the Proliferation of Live Artistic

Programming

Page 22: Music as data

I can do it better!

Page 23: Music as data

Python

Page 24: Music as data

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

●Time (duration) is written like in real music● Easy to understand● Hand-made REPL

Page 26: Music as data

# 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

● This bracket syntax is HARD ● Not so easy to add effects

● Concurrency bye-bye

Page 28: Music as data

Something “feels” wrong

Page 29: Music as data

Meet Clojure

Page 30: Music as data

What is Clojure?

Page 31: Music as data

Ok, what is Lisp?

Page 32: Music as data

“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

“LISP stands for: Lots of Insane Stupid Parentheses”

AnonymousAnonymous

Page 34: Music as data

The Truth about Lisp

Page 35: Music as data

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

Clojure

● Lisp in JVM● Concurrent programming● Dynamic Development (REPL)● Lazy sequences● No side effects (almost)

Page 37: Music as data

clojure might be a better java than java

Page 38: Music as data

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

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

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

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

public isBlank(str) {every (ch in str) {

Character.isWhitespace(ch);}

}

Page 43: Music as data

(defn blank? [s] (every? #(Character/isWhitespace %) s))

Page 44: Music as data

Everything is code

Page 45: Music as data

(println "Hello World")

function argument

Page 46: Music as data

Everything is data

Page 47: Music as data

(println "Hello World")

symbol string

list

Page 48: Music as data

Where is the correlation?

Page 49: Music as data

Let's get M.A.D!

Page 50: Music as data

● Live programming (REPL)● Using Processing (processing.org)

● Easy to extend● Easy to understand

● Fun!

Page 51: Music as data

> (p (pattern [kick]));; 1/1 is kick

Page 52: Music as data

(defsample “kick” path-of-sample);; create as sample kick

Page 53: Music as data

(defnote A#4 @*sine*);; create a note

Page 54: Music as data

(create-notes);; creates all defnotes for notes

;; helping function

Page 55: Music as data

Everything is one data structure

Page 56: Music as data

(defrecord Melement [volume pitch duration play-fn data])

Page 57: Music as data

play-fn can be anything you like

Page 58: Music as data

(defn play-sample [sample] (.trigger (:data sample)))

;; for samples

Page 59: Music as data

> (p (pattern [kick]));; 1/1 is kick

Page 60: Music as data

pattern calculates the correct timing updates the :duration for notes

Page 61: Music as data

> (p (pattern [kick kick]));; play two kicks

;; ½ kick;; ½ kick

Page 62: Music as data

p plays each note at the correct timing

Page 63: Music as data

(p (pattern [kick (+snare hihat)]));; two times again

;; ½ kick;; ½ snare with hihat

Page 64: Music as data

(p (pattern [kick [snare snare snare]]));; two times again

;; ½ kick;; (½ / 3) snare;; (½ / 3) snare;; (½ / 3) snare

Page 65: Music as data

Just like real music

Page 66: Music as data

Now fun! Hint: transformations

Page 67: Music as data

(p (pattern [A4 B4 C5 D5 E5 F5 G5]))

Page 68: Music as data

(p (reverse (pattern [A4 B4 C5 D5 E5 F5 G5])))

Page 69: Music as data

(p (map #(assoc % :pitch (.nextInt (java.util.Random.) 1100))

(pattern [E4 G4 B4 E5 B4 G4]))

Page 70: Music as data

You can manipulate music as a data structure

Page 71: Music as data

(keep-looping)

Page 72: Music as data

(play! [[E4 G4 E4] [E5 B4 G4 D4 A4 E4 G4 A4]])

Page 73: Music as data

play! Lets you experiment in real timeLive programming

Page 74: Music as data

Using Processing for Visual effects

Page 75: Music as data
Page 76: Music as data

Limit? The audio sky!

Page 77: Music as data

(play! (text-to-notes (get-latest-twits));; add markov-chains

Page 78: Music as data

Searching for members forBand of Emacs

Give me a twit at @jonromero if interested

Page 79: Music as data

Thanks! Questions?

[email protected] it at mad.emotionull.com