Search the Community
Showing results for tags 'lispworks'.
-
Inspired by the example from this thread but I could not find the related function been shipped with the OM application. The code requires OM3.0 because of LispWorks specific API but the concept should be simple enough to be implemented in Clozure CL. After some midi objects has been compiled and inserted to the playlist one can use run-playlist to start play. While it is still playing one can feed more midi objects queued to the playlist. When the playlist is empty and after the specified seconds of timeout, the player process would exit. (setq midi1 (compile-score 'score1)) (setq midi2 (compile-score 'score2)) (setq midi3 (compile-score 'score3)) (defparameter *playlist* (mp:make-mailbox)) (defun push-to-list (item) (let ((midi (cond ((eq (type-of item) 'midi:midi) item) ((symbolp item) (compile-score item)) ((or (stringp item) (pathnamep item)) (midi:read-midi-file item))))) (mp:mailbox-send *playlist* midi))) (defun run-playlist (&key (timeout 5) (ignore-ports nil)) (mp:process-run-function "Playing..." () (lambda () (loop (let ((current (mp:mailbox-read *playlist* "Wait for feed tracks" timeout))) (if current (mp:process-join (start-midi current :ignore-ports ignore-ports)) (return))))))) (push-to-list midi1) (push-to-list midi2) (run-playlist 5) (push-to-list midi3)