;;
MIDI-tools_2.html
;; neuromuse
;;Frederic Voisin, 2001 -2003
;; ce fichier a servi a l'execution temps-reel du
programme LISP neuromuse#0.lisp utilise pour la creation de "L'Ecarlate"
;;(Gourfink, Toeplitz et Voisin), IRCAM, Festival Agora 2001
(defvar *midi-data* nil)
(defvar
*moment-vectors* nil)
(defvar
*temp-vector* nil)
(defvar *angle*
nil)
(defvar *speed*
nil)
(defvar
*amplitude* nil)
(defvar *dur*
nil)
(defvar *ecarts*
nil)
(defvar
*supports* nil)
(defvar
*distances* nil)
;(defparameter
*get-midi-process* nil)
(setf
*MIDI-PROCESS-NAMES*
(append *MIDI-PROCESS-NAMES* '("get-midi")))
(defun
reset-data ()
(setf
*angle* nil
*speed* nil
*dur* nil
*moment-vectors* nil
*temp-vector* nil
*ecarts* nil
*supports* nil
*midi-data* nil
*distances* nil))
(defvar *gate* t)
;(reset-data)
(defun get-midi
(refnum)
(format t
"~% Ready to get data...")
(loop
(do ((event (midishare::MidiGetEv refnum) (midishare::MidiGetEv
refnum)))
((%null-ptr-p event))
(let ((chan (midishare::chan event)))
(when chan
(let ((ctl (midishare::field event 0))
(value (midishare::field event 1)))
(cond ((< chan 10)
(setf *temp-vector* (append (list (list ctl value chan))
*temp-vector*))
(when (and (= 18 ctl) (= 9 chan))
(format t "~% receiving vector..."))
(when (and (= 1 ctl) (= 0 chan))
(format t "~% Vector received.")
(get-moment))
)
((= chan 10)
(when *gate*
(case ctl
(1
(setf *angle* (append *angle* (list value)))
(format t "receiving angle = ~S" value))
(2
(setf *speed* (append *speed* (list value)))
(format t "receiving speed = ~S" value))
(3
(setf *dur* (append *dur* (list value)))
(format t "receiving dur = ~S" value))
(4
(setf *amplitude* (append *amplitude* (list value)))
(format t "receiving amplitude = ~S" value))
(5
(setf *ecarts* (append *ecarts* (list value)))
(format t "receiving ecart = ~S" value))
(6
(setf *supports* (append *supports* (list value)))
(format t "receiving support = ~S" value))
)))
(t
(push (list ctl (midishare::field event 1) chan)
*midi-data*)
))))
))
(process-wait "waiting events" #'waiting-events-p refnum)))
(defun getmidi ()
(setf
*midi-monitor-process*
(process-run-function
'(:name "get-midi" :priority 0)
#'get-midi
*refnum*)))
;(reset-data)
;(getmidi)
;(PROCESS-KILL
*midi-monitor-process*)
(defun distance
(a b)
(let ((r))
(loop for i in a for j in b
do
(push (* (- j i) (- j i)) r))
(sqrt (apply #'+ r))))
(defvar
*distances* nil)
(defun
get-moment ()
(let ((r
(make-list 180 :initial-element .0))
activation
)
(when *temp-vector*
(dolist (m *temp-vector*)
(let* ((dim (elt m 2))
(max (case dim (0 2.) (1 5.) (2 17.) (3 5.) (4 5.) (5 8.) (6 5.) (7 8.)
(8 12.) (9 13.))))
(setf (elt r (+ (* (1- (elt m 0)) 10) (elt m 2)))
(scale (elt m 1) 0. max 0. 1.)))))
(setf *temp-vector* nil
*moment-vectors* (append *moment-vectors* (list (coerce r 'vector)))
activation (coerce (run-aa (car (last *moment-vectors*)) ecarl180-1)
'list))
(make-activation-window
(coerce activation 'list)
:scalex 14 :scaley 14 :col 10 :lin 18 :title (format nil "moment ~D"
(length *moment-vectors*)))
(setf *distances* (append *distances*
(list (distance activation (coerce (car (last *moment-vectors*))
'list)))
))
(format t "~%> ecarl180 : distance = ~S." (car (last *distances*
)))))
#|
(get-moment)
(length
*moment-vectors*
)
(defvar
copy-of-*ecarts* (copy-tree *ecarts*))
(setf *ecarts*
(echant (remove 0 *ecarts*) 100))
*moment-vectors*
(length
*angle*
)
(length
*speed*
)
(length
*dur*
)
(length
*ecarts*
)
(length
*supports*
)
(length
(reverse
*distances*)
)
(make-trace-window
*speed* 10 2 "")
(loop for s from
0 to (1- (length *moment-vectors*))
do
(make-activation-window (coerce (elt *moment-vectors* s) 'list)
:scalex 15 :scaley 15 :col 10 :lin 18 :title (format nil "M ~S" s)))
(make-trace-window
(remove 0 *ecarts*) 2 5 "ecarts")
(make-trace-window
(scale *dur*
(apply #'min *dur*) (apply #'max *dur*) 1 100)
10 5 "durees")
|#
;;fredv