[Fluxus] tapping out the bpm
evan.raskob [lists]
lists at lowfrequency.org
Tue Sep 8 03:01:38 PDT 2009
one thing I like to do with my animations is tap out the bpm with the
spacebar - I seem to be much better at finding the beat than 100% of
the software I've used to do it, could be something to do with the
fact that I'm a human being and have evolved over the last few million
years to do just that.
Anyway, here's my example code, feel free to clean it up / use it for
god/evil:
(clear)
;--- trig constants
(define PI 3.14159265)
(define HALF_PI (* PI 0.5))
(define TWO_PI (* PI 2))
;--- key press variables, for timing
(define lastKeyPress 0)
(define lastKeyPresses (list 0 0 0))
;--- calculate the bpm based on the time of last key press
;--- and a list of previous key presses
(define (calc-bpm max-interval)
(let ([dt (- (time) lastKeyPress)])
;--- only count this beat if within max-interval ms
(cond [(> dt 0.1) ; also don't count if interval is too short
(cond [(< dt max-interval)
(set! lastKeyPresses (append (cdr lastKeyPresses) (list
dt)))
]
[else (set! lastKeyPresses (list dt dt dt))]
)
(set! lastKeyPress (time))
])
)
(display lastKeyPresses)(newline)
;-- return median time for multiplying by (time)
(let [(t (median lastKeyPresses))]
(cond [(> t 0) (/ 1 t)]
[else 0])
)
)
(define (median l)
(cond [(null? l) 0]
[else (list-ref (sort l <) (inexact->exact (round (/ (length
l) 2))))]
)
)
(define cubey (build-cube))
;-- gimmie a number btw 0 and 1 based on time
(define (time-ramp tscale tmax)
(/ (fmod (* (- (time) lastKeyPress) tscale) tmax) tmax)
)
;-- gimmie a number based on time and sine curve - 0 to 1
(define (time-curve tscale tmax)
(sin (* HALF_PI (time-ramp tscale tmax)))
)
(define msPerBeat 1)
(define (do-something)
(define num-objs 6)
(define half-num-objs (/ (- num-objs 1) 2))
(when (key-pressed " ") (set! msPerBeat (calc-bpm 2500)))
;-- generate a 4 beat long ramp, use to rotate cubes
(let* ([base-ramp (time-ramp msPerBeat 4)]
[ramp1 (* base-ramp 360)]
)
; (display ramp1)(newline)
(with-state
(colour (vector 1 1 0))
(for ([i (in-range num-objs)])
(let [(x (* 9 (/ (- i half-num-objs) half-num-objs)))
(y 0)
(z 0)]
(with-state
(identity)
(rotate (vector ramp1 0 0))
(translate (vector x y z))
(draw-instance cubey)
)
)
)
)
)
)
(every-frame (do-something))
More information about the Fluxus
mailing list