Created
May 12, 2015 11:28
-
-
Save CircuV/0834dbbd2034b82b7706 to your computer and use it in GitHub Desktop.
Transscript of live performance based on Andrew Sorensen "A Study in Keith"
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
;;; as_keith_midi.xtm -- live performance | |
;; based on Andrew Sorensen "A Study in Keith" Impromptu performance | |
;; "A Study In Keith" is a work for solo piano (NI's Akoustik Piano) | |
;; by Andrew Sorensen inspired by Keith Jarrett's Sun Bear concerts. | |
;; Orginal code transposed to Extempore | |
;; http://extempore.moso.com.au | |
;; | |
;; Author: cv | |
;; Keywords: extempore, live-coding, impromptu, keith jarret | |
;;; Commentary: | |
;;; Code: | |
;; load MIDI library | |
(sys:load "libs/external/rtmidi.xtm") | |
;; midi stuff | |
(define *midi-out* (midi_new_outdevice)) | |
;; query for valid midi output devices | |
(midi_query_outports *midi-out*) | |
;; now open output port (assuming port 0) | |
(midi_open_outport *midi-out* 0) | |
;; play midi test note | |
(play-midi-note (now) *midi-out* 72 20 10000 0) | |
;; reuires pc_ivl-lib Pitch Class Library | |
(sys:load "libs/core/pc_ivl.xtm") | |
;; Performance adapted from Andrew Sorensen: "A Study In Keith" | |
;; http://vimeo.com/2433947 | |
;; snippet | |
;;(define name | |
;; (lambda (beat ps ds) | |
;; (play inst (car ps) volume (car ds)) | |
;; (callback (*metro* (+ beat (* 0.5 ( car ds)))) 'name (+ beat (car ds)) | |
;; (rotate ps -1) | |
;; (rotate ds -1)))) | |
;; | |
;;(name (*metro* 'get-beat 4) pitches durations) | |
;; | |
;; end snippet | |
;;(define *metro* (make-metro 110 '(0 . 0))) | |
(*metro* 'set-tempo 110) | |
;; define scale | |
(define scale (pc:scale 0 'aeolian)) | |
;; performance starts here 2:00 | |
(define chords | |
(lambda (time degree dur) | |
(println time degree dur) | |
(if (member degree '(i)) (set! dur 3)) | |
(for-each (lambda (p) | |
(play-midi-note (*metro* time) *midi-out* p | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur) 0)) | |
(pc:make-chord 50 70 2 (pc:diatonic 0 '- degree))) | |
(callback (*metro* (+ time (* 0.5 dur))) 'chords (+ time dur) | |
(random (assoc degree '((i vii) | |
(vii i)))) | |
dur))) | |
(chords (*metro* 'get-beat 4) 'i 3) | |
;; modify tune 3:01 | |
(define chords | |
(lambda (time degree dur) | |
(if (member degree '(i)) (set! dur 3.0)) | |
(println time degree dur) | |
(for-each (lambda (p) | |
(let* ((dur1 (* dur (random '(0.5 1)))) | |
(dur2 (- dur dur1))) | |
(play-midi-note (*metro* time) *midi-out* p | |
(real->integer(+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur1) 0) | |
(if (> dur2 0) | |
(play-midi-note (*metro* (+ time dur1)) *midi-out* | |
(pc:relative p (random '(-2 -1 1 2)) | |
(pc:scale 0 'aeolian)) | |
(real->integer (+ 50 (* 20 (cos (* pi (+ time dur1)))))) | |
(*metro* 'dur dur2) 0 )))) | |
(pc:make-chord 50 70 2 (pc:diatonic 0 '- degree))) | |
(callback (*metro* (+ time (* 0.5 dur))) 'chords (+ time dur) | |
(random (assoc degree '((i vii) | |
(vii i)))) | |
(random (list 1 2 3))))) | |
;; modify tune 3:22 | |
(define chords | |
(lambda (time degree dur) | |
(if (member degree '(i)) (set! dur (random (list 3.0 6.0)))) | |
(println time degree dur) | |
(for-each (lambda (p) | |
(let* ((dur1 (* dur (random '(0.5 1)))) | |
(dur2 (- dur dur1))) | |
(play-midi-note (*metro* time) *midi-out* p | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur1) 0) | |
(if (> dur2 0) | |
(play-midi-note (*metro* (+ time dur1)) *midi-out* | |
(pc:relative p (random '(-2 -1 1 2)) | |
(pc:scale 0 'aeolian)) | |
(real->integer (+ 50 (* 20 (cos (* pi (+ time dur1)))))) | |
(*metro* 'dur dur2) 0 )))) | |
(pc:make-chord 50 70 2 (pc:diatonic 0 '- degree))) | |
(callback (*metro* (+ time (* 0.5 dur))) 'chords (+ time dur) | |
(random (assoc degree '((i vii) | |
(vii i v) | |
(v i)))) | |
(random (list 1 2 3))))) | |
;; modify tune 4:00 | |
(define chords | |
(lambda (time degree dur) | |
(if (member degree '(i)) (set! dur (random (list 3.0 6.0)))) | |
(println time degree dur) | |
(play-midi-note (*metro* time) *midi-out* | |
(pc:random 40 50 (list (car (pc:diatonic 0 '- degree)))) | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur) 0) | |
(for-each (lambda (p) | |
(let* ((dur1 (* dur (random '(0.5 1)))) | |
(dur2 (- dur dur1))) | |
(play-midi-note (*metro* time) *midi-out* p | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur1) 0) | |
(if (> dur2 0) | |
(play-midi-note (*metro* (+ time dur1)) *midi-out* | |
(pc:relative p (random '(-2 -1 1 2)) | |
(pc:scale 0 'aeolian)) | |
(real->integer (+ 50 (* 20 (cos (* pi (+ time dur1)))))) | |
(*metro* 'dur dur2) 0)))) | |
(pc:make-chord 50 70 3 (pc:diatonic 0 '- degree))) | |
(callback (*metro* (+ time (* 0.5 dur))) 'chords (+ time dur) | |
(random (assoc degree '((i vii) | |
(vii i v) | |
(v i vi) | |
(vi ii) | |
(ii v vii)))) | |
(random (list 1 2 3))))) | |
;; add pulse 5:00 | |
(define pulse | |
(lambda (time) | |
(play-midi-note (*metro* time) *midi-out* 60 | |
(real->integer (+ 40 (* 20 (cos (* pi time))))) (*metro* 'dur (+ 0.2 (* 0.5 (random)))) 0) | |
(callback (*metro* (+ time (* 0.5 0.5))) 'pulse (+ time 0.5)))) | |
(pulse (*metro* 'get-beat 4.0)) | |
;; modify chords 5:19 | |
(define chords | |
(lambda (time degree dur) | |
(if (member degree '(i)) (set! dur (random (list 3.0 6.0)))) | |
(println time degree dur) | |
(play-midi-note (*metro* time) *midi-out* | |
(pc:random 40 50 (list (car (pc:diatonic 0 '- degree)))) | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur) 0) | |
(for-each (lambda (p) | |
(let* ((dur1 (* dur (random '(0.5 1)))) | |
(dur2 (- dur dur1))) | |
(play-midi-note (*metro* time) *midi-out* p | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur1) 0) | |
(if (> dur2 0) | |
(play-midi-note (*metro* (+ time dur1)) *midi-out* | |
(pc:relative p (random '(-2 -1 1 2)) | |
(pc:scale 0 'aeolian)) | |
(real->integer (+ 50 (* 20 (cos (* pi (+ time dur1)))))) | |
(*metro* 'dur dur2) 0)))) | |
(pc:make-chord 50 (if (> (random) .8) 80 70) 3 (pc:diatonic 0 '- degree))) | |
(callback (*metro* (+ time (* 0.5 dur))) 'chords (+ time dur) | |
(random (assoc degree '((i vii) | |
(vii i v) | |
(v i vi) | |
(vi ii) | |
(ii v vii)))) | |
(random (list 1 2 3))))) | |
;; define runs 6:54 | |
(define runs | |
(lambda (time pitch leap dur) | |
(play-midi-note (*metro* time) *midi-out* pitch | |
(if (= 0 (modulo pitch 12)) (random 70 90) (random 40 60)) | |
(*metro* 'dur dur) 0) | |
(if (and (pc:? pitch '(0)) | |
(> (random) 0.3)) | |
'done | |
(callback (*metro* (+ time .1)) 'runs (+ time dur) | |
(pc:relative pitch leap (pc:scale 0 'aeolian)) | |
(if (> (random) .8) (* -1 leap) leap) | |
dur)))) | |
;; modify pulse 7:16 | |
(define pulse | |
(lambda (time) | |
(play-midi-note (*metro* time) *midi-out* 48 | |
(real->integer (+ 40 (* 20 (cos (* pi time))))) (*metro* 'dur (+ 0.2 (* 0.5 (random)))) 0) | |
(play-midi-note (*metro* time) *midi-out* 36 | |
(real->integer (+ 40 (* 20 (cos (* pi time))))) (*metro* 'dur (+ 0.2 (* 0.5 (random)))) 0) | |
(callback (*metro* (+ time (* 0.5 0.5))) 'pulse (+ time 0.5)))) | |
;; modify chords insert runs 7:53 | |
(define chords | |
(lambda (time degree dur) | |
(if (member degree '(i)) (set! dur (random (list 3.0 6.0)))) | |
(println time degree dur) | |
(play-midi-note (*metro* time) *midi-out* | |
(pc:random 40 50 (list (car (pc:diatonic 0 '- degree)))) | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur) 0) | |
(for-each (lambda (p) | |
(if (> (random) .8) | |
(runs time p (random '(-2 -1 1 2 3 4)) (random '(0.25 0.125)))) | |
(let* ((dur1 (* dur (random '(0.5 1)))) | |
(dur2 (- dur dur1))) | |
(play-midi-note (*metro* time) *midi-out* p | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur1) 0) | |
(if (> dur2 0) | |
(play-midi-note (*metro* (+ time dur1)) *midi-out* | |
(pc:relative p (random '(-2 -1 1 2)) | |
(pc:scale 0 'aeolian)) | |
(real->integer (+ 50 (* 20 (cos (* pi (+ time dur1)))))) | |
(*metro* 'dur dur2) 0)))) | |
(pc:make-chord 50 (if (> (random) .8) 80 70) 3 (pc:diatonic 0 '- degree))) | |
(callback (*metro* (+ time (* 0.5 dur))) 'chords (+ time dur) | |
(random (assoc degree '((i vii) | |
(vii i v) | |
(v i vi) | |
(vi ii) | |
(ii v vii)))) | |
(random (list 1 2 3))))) | |
;; modify pulse 8:08 | |
(define pulse | |
(lambda (time) | |
(play-midi-note (*metro* time) *midi-out* 48 | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) (*metro* 'dur (+ 0.2 (* 0.5 (random)))) 0) | |
(play-midi-note (*metro* time) *midi-out* 36 | |
(real->integer (+ 40 (* 20 (cos (* pi time))))) (*metro* 'dur (+ 0.2 (* 0.5 (random)))) 0) | |
(callback (*metro* (+ time (* 0.5 0.5))) 'pulse (+ time 0.5)))) | |
;; modify chords 8:22 | |
(define chords | |
(lambda (time degree dur) | |
(if (member degree '(i)) (set! dur (random (list 3.0 6.0)))) | |
(println time degree dur) | |
(play-midi-note (*metro* time) *midi-out* | |
(pc:random 40 50 (list (car (pc:diatonic 0 '- degree)))) | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur) 0) | |
(for-each (lambda (p) | |
(if (> (random) .8) | |
(runs time p (random '(-2 -1 1 2 3 4)) (random '(0.25 0.125)))) | |
(let* ((dur1 (* dur (random '(0.5 1)))) | |
(dur2 (- dur dur1))) | |
(play-midi-note (*metro* time) *midi-out* p | |
(real->integer (+ 50 (* 25 (cos (* pi time))))) | |
(*metro* 'dur dur1) 0) | |
(if (> dur2 0) | |
(play-midi-note (*metro* (+ time dur1)) *midi-out* | |
(pc:relative p (random '(-2 -1 1 2)) | |
(pc:scale 0 'aeolian)) | |
(real->integer (+ 50 (* 20 (cos (* pi (+ time dur1)))))) | |
(*metro* 'dur dur2) 0)))) | |
(pc:make-chord 50 (if (> (random) .8) 80 70) 4 (pc:diatonic 0 '- degree))) | |
(callback (*metro* (+ time (* 0.5 dur))) 'chords (+ time dur) | |
(random (assoc degree '((i vii) | |
(vii i v) | |
(v i vi) | |
(vi ii) | |
(ii v vii)))) | |
(random (list 1 2 3))))) | |
;; modify pulse 8:34 | |
(define pulse | |
(lambda (time) | |
(play-midi-note (*metro* time) *midi-out* 48 | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) (*metro* 'dur (+ 0.2 (* 0.5 (random)))) 0) | |
(play-midi-note (*metro* time) *midi-out* 36 | |
(real->integer (+ 40 (* 20 (cos (* pi time))))) (*metro* 'dur (+ 0.3 (* 0.5 (random)))) 0) | |
(callback (*metro* (+ time (* 0.5 0.5))) 'pulse (+ time 0.5)))) | |
;; modify chords 8:50 | |
(define chords | |
(lambda (time degree dur) | |
(if (member degree '(i)) (set! dur (random (list 3.0 6.0)))) | |
(println time degree dur) | |
(play-midi-note (*metro* time) *midi-out* | |
(pc:random 40 50 (list (car (pc:diatonic 0 '- degree)))) | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur) 0) | |
(for-each (lambda (p) | |
(if (> (random) .8) | |
(runs time p (random '(-2 -1 1 2 3 4)) (random '(0.25 0.125)))) | |
(let* ((dur1 (* dur (random '(0.5 1)))) | |
(dur2 (- dur dur1))) | |
(play-midi-note (*metro* time) *midi-out* p | |
(real->integer (+ 60 (* 30 (cos (* pi time))))) | |
(*metro* 'dur dur1) 0) | |
(if (> dur2 0) | |
(play-midi-note (*metro* (+ time dur1)) *midi-out* | |
(pc:relative p (random '(-2 -1 1 2)) | |
(pc:scale 0 'aeolian)) | |
(real->integer (+ 60 (* 30 (cos (* pi (+ time dur1)))))) | |
(*metro* 'dur dur2) 0)))) | |
(pc:make-chord 50 (if (> (random) .8) 80 70) 4 (pc:diatonic 0 '- degree))) | |
(callback (*metro* (+ time (* 0.5 dur))) 'chords (+ time dur) | |
(random (assoc degree '((i vii) | |
(vii i v) | |
(v i vi) | |
(vi ii) | |
(ii v vii)))) | |
(random (list 1 2 3))))) | |
;; modify runs 8:57 | |
(define runs | |
(lambda (time pitch leap dur) | |
(play-midi-note (*metro* time) *midi-out* pitch | |
(if (= 0 (modulo pitch 12)) (random 80 100) (random 40 60)) | |
(*metro* 'dur dur) 0) | |
(if (and (pc:? pitch '(0)) | |
(> (random) 0.3)) | |
'done | |
(callback (*metro* (+ time .1)) 'runs (+ time dur) | |
(pc:relative pitch leap (pc:scale 0 'aeolian)) | |
(if (> (random) .8) (* -1 leap) leap) | |
dur)))) | |
;; modify runs 9:20 | |
(define runs | |
(lambda (time pitch leap dur) | |
(play-midi-note (*metro* time) *midi-out* pitch | |
(if (= 0 (modulo pitch 12)) (random 60 70) (random 20 40)) | |
(*metro* 'dur dur) 0) | |
(if (and (pc:? pitch '(0)) | |
(> (random) 0.3)) | |
'done | |
(callback (*metro* (+ time .1)) 'runs (+ time dur) | |
(pc:relative pitch leap (pc:scale 0 'aeolian)) | |
(if (> (random) .8) (* -1 leap) leap) | |
dur)))) | |
;; modify chords 9:25 | |
(define chords | |
(lambda (time degree dur) | |
(if (member degree '(i)) (set! dur (random (list 3.0 6.0)))) | |
(println time degree dur) | |
(play-midi-note (*metro* time) *midi-out* | |
(pc:random 40 50 (list (car (pc:diatonic 0 '- degree)))) | |
(real->integer (+ 50 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur) 0) | |
(for-each (lambda (p) | |
(if (> (random) .8) | |
(runs time p (random '(-2 -1 1 2 3 4)) (random '(0.25 0.125)))) | |
(let* ((dur1 (* dur (random '(0.5 1)))) | |
(dur2 (- dur dur1))) | |
(play-midi-note (*metro* time) *midi-out* p | |
(real->integer (+ 40 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur1) 0) | |
(if (> dur2 0) | |
(play-midi-note (*metro* (+ time dur1)) *midi-out* | |
(pc:relative p (random '(-2 -1 1 2)) | |
(pc:scale 0 'aeolian)) | |
(real->integer (+ 40 (* 20 (cos (* pi (+ time dur1)))))) | |
(*metro* 'dur dur2) 0)))) | |
(pc:make-chord 70 (if (> (random) .6) 90 80) 3 (pc:diatonic 0 '- degree))) | |
(callback (*metro* (+ time (* 0.5 dur))) 'chords (+ time dur) | |
(random (assoc degree '((i vii vi) | |
(vii i v) | |
(v i vi) | |
(vi ii) | |
(ii v vii)))) | |
(random (list 1 2 3))))) | |
;; modify chords 9:54 | |
(define chords | |
(lambda (time degree dur) | |
(if (member degree '(i)) (set! dur (random (list 3.0 6.0)))) | |
(println time degree dur) | |
(for-each (lambda (p) | |
(if (> (random) .8) | |
(runs time p (random '(-2 -1 1 2 3 4)) (random '(0.25 0.125)))) | |
(let* ((dur1 (* dur (random '(0.5 1)))) | |
(dur2 (- dur dur1))) | |
(play-midi-note (*metro* time) *midi-out* p | |
(real->integer (+ 40 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur1) 0) | |
(if (> dur2 0) | |
(play-midi-note (*metro* (+ time dur1)) *midi-out* | |
(pc:relative p (random '(-2 -1 1 2)) | |
(pc:scale 0 'aeolian)) | |
(real->integer (+ 40 (* 20 (cos (* pi (+ time dur1)))))) | |
(*metro* 'dur dur2) 0)))) | |
(pc:make-chord 70 (if (> (random) .6) 90 80) 3 (pc:diatonic 0 '- degree))) | |
(callback (*metro* (+ time (* 0.5 dur))) 'chords (+ time dur) | |
(random (assoc degree '((i vii vi) | |
(vii i v) | |
(v i vi) | |
(vi ii) | |
(ii v vii)))) | |
(random (list 1 2 3))))) | |
;; modify pulse 10:05 | |
(define pulse | |
(lambda (time) | |
(play-midi-note (*metro* time) *midi-out* 60 | |
(real->integer (+ 40 (* 20 (cos (* pi time))))) (*metro* 'dur (+ 0.3 (* 0.5 (random)))) 0) | |
(callback (*metro* (+ time (* 0.5 0.5))) 'pulse (+ time 0.5)))) | |
;; modify pulse 10:10 | |
(define pulse | |
(lambda (time) | |
(play-midi-note (*metro* time) *midi-out* 60 | |
(real->integer (+ 30 (* 10 (cos (* pi time))))) (*metro* 'dur (+ 0.3 (* 0.5 (random)))) 0) | |
(callback (*metro* (+ time (* 0.5 0.5))) 'pulse (+ time 0.5)))) | |
;; modify pulse 10:20 | |
(define pulse | |
(lambda (time) | |
(play-midi-note (*metro* time) *midi-out* 60 | |
(real->integer (+ 25 (* 10 (cos (* pi time))))) (*metro* 'dur (+ 0.3 (* 0.5 (random)))) 0) | |
(callback (*metro* (+ time (* 0.5 0.5))) 'pulse (+ time 0.5)))) | |
;; modify pulse 10:25 | |
(define pulse | |
(lambda (time) | |
(play-midi-note (*metro* time) *midi-out* 60 | |
(real->integer (+ 20 (* 7 (cos (* pi time))))) (*metro* 'dur (+ 0.3 (* 0.5 (random)))) 0) | |
(callback (*metro* (+ time (* 0.5 0.5))) 'pulse (+ time 0.5)))) | |
;; modify pulse 10:27 | |
(define pulse | |
(lambda (time) | |
(play-midi-note (*metro* time) *midi-out* 60 | |
(real->integer (+ 10 (* 5 (cos (* pi time))))) (*metro* 'dur (+ 0.3 (* 0.5 (random)))) 0) | |
(callback (*metro* (+ time (* 0.5 0.5))) 'pulse (+ time 0.5)))) | |
;; end pulse 10:34 | |
(define pulse) | |
;; modify chords 10:41 | |
(define chords | |
(lambda (time degree dur) | |
(if (member degree '(i)) (set! dur (random (list 3.0 6.0)))) | |
(println time degree dur) | |
(for-each (lambda (p) | |
(if (> (random) .8) | |
(runs time p (random '(-2 -1 1 2 3 4)) (random '(0.25 0.125)))) | |
(let* ((dur1 (* dur (random '(0.5 1)))) | |
(dur2 (- dur dur1))) | |
(play-midi-note (*metro* time) *midi-out* p | |
(real->integer (+ 40 (* 20 (cos (* pi time))))) | |
(*metro* 'dur dur1) 0) | |
(if (> dur2 0) | |
(play-midi-note (*metro* (+ time dur1)) *midi-out* | |
(pc:relative p (random '(-2 -1 1 2)) | |
(pc:scale 0 'aeolian)) | |
(real->integer (+ 40 (* 20 (cos (* pi (+ time dur1)))))) | |
(*metro* 'dur dur2) 0)))) | |
(pc:make-chord 70 (if (> (random) .6) 90 80) 2 (pc:diatonic 0 '- degree))) | |
(callback (*metro* (+ time (* 0.5 dur))) 'chords (+ time dur) | |
(random (assoc degree '((i vii vi) | |
(vii i v) | |
(v i vi) | |
(vi ii) | |
(ii v vii)))) | |
(random (list 1 2 3))))) | |
;; modify chords 11:21 | |
(define chords | |
(lambda (time degree dur) | |
(runs time 89 -2 .25) | |
(play-midi-note (*metro* time) *midi-out* 36 | |
30 | |
(*metro* 'dur 8) 0))) | |
;; the end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment