Skip to content

Instantly share code, notes, and snippets.

@CircuV
Created May 12, 2015 11:28
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save CircuV/0834dbbd2034b82b7706 to your computer and use it in GitHub Desktop.
Save CircuV/0834dbbd2034b82b7706 to your computer and use it in GitHub Desktop.
Transscript of live performance based on Andrew Sorensen "A Study in Keith"
;;; 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