(progn (defclass qlist-stream (event-stream) ((header :initform nil :initarg :header :accessor qlist-stream-header) (userargs :accessor qlist-userargs :initform '())) #+metaclasses (:metaclass io-class)) (defparameter (find-class 'qlist-stream)) (finalize-class ) (setf (io-class-file-types ) '("*.qlist")) (setf (io-class-mime-type ) "text/x-qlist-score") (values)) (defmethod io-handler-args? ((io qlist-stream)) io t) (defmethod io-handler-args ((io qlist-stream)) (qlist-userargs io)) (defmethod set-io-handler-args! ((io qlist-stream) args) (setf (qlist-userargs io) args) (values)) (defmethod initialize-io ((io qlist-stream)) (let ((header (qlist-stream-header io))) (cond ((consp header) (dolist (h header) (format (io-open io) "~a~%" h))) ((stringp header) (format (io-open io) "~a~%" header)) ((not header) nil) (t (error "Bad .qlist file header: ~A" header))))) ;;And an example fm-object which is aimed at PD (defobject pd-fm-ins () ((ins :initform 'fm :accessor object-name) (time :accessor object-time) (dur :initform 1) (amplitude :initform .5) (keynum :initform 54) (index :initform 3.0)) (:parameters time dur amplitude keynum index) ) (defmethod object->midi ((obj pd-fm-ins)) (new midi :time (object-time obj) :duration (pd-fm-ins-dur obj) :keynum (pd-fm-ins-keynum obj) :amplitude (pd-fm-ins-amplitude obj))) (defmethod write-event ((obj pd-fm-ins) (io qlist-stream) scoretime) (let ((fp (io-open io))) (format fp "dur ~A; key ~A; amp ~A; index ~A;~%~A " (floor (* 1000 (pd-fm-ins-dur obj))) (pd-fm-ins-keynum obj) (pd-fm-ins-amplitude obj) (pd-fm-ins-index obj) (floor (* 1000 (object-time obj)))) (values))) (defprocess test-pd-output (dur tempo) (let ((keys (new funcall :of #'(lambda () (ran :from 30 :below 80)))) (rhys (new heap :of '(q e s s)))) (process while (< (now) dur) for key = (next keys) for rhythm = (rhythm (next rhys) tempo) for amp = (ran :from 0.2 :below 1.0 :type :lp) output (new pd-fm-ins :time (now) :keynum key :dur rhythm :amplitude amp :index 1.0) wait rhythm))) ;; (events (test-pd-output 10.0 120) "test.qlist")