Mercurial > hg > amuse
changeset 302:ac78ce3d0b10
Add some basic midi predicate and accessor functions.
Ignore-this: ab60873a92efc7f4c3cd98cdb938dcea
darcs-hash:20090918100419-16a00-bd8423ddea7a4700d7e1c5300e4dafd35113897c.gz
author | j.forth <j.forth@gold.ac.uk> |
---|---|
date | Fri, 18 Sep 2009 11:04:19 +0100 |
parents | 58a2d76bb243 |
children | 3c5bf3f7b7a0 |
files | amuse-midi.asd implementations/midi/functions.lisp implementations/midi/methods.lisp implementations/midi/package.lisp |
diffstat | 4 files changed, 99 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/amuse-midi.asd Mon Sep 07 12:04:47 2009 +0100 +++ b/amuse-midi.asd Fri Sep 18 11:04:19 2009 +0100 @@ -10,5 +10,6 @@ ((:file "package") (:file "classes" :depends-on ("package")) (:file "constructors" :depends-on ("package" "classes")) + (:file "functions" :depends-on ("methods")) (:file "midifile-import" :depends-on ("package" "classes")) (:file "methods" :depends-on ("package" "classes"))))))))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/implementations/midi/functions.lisp Fri Sep 18 11:04:19 2009 +0100 @@ -0,0 +1,65 @@ +(cl:in-package #:amuse-midi) + +;;;======================================================================== +;;; Functions that return features given an event. +;;;======================================================================== + +(defun midi-event-type (event) + "Defines an arbitrary ordering for pitched and percussive events." + (if (pitchedp event) 0 1)) + +;;;======================================================================== +;;; Predicates for conditioning on event attributes. +;;; Useful for sia-datapoint-specs. +;;;======================================================================== + +;;; midi-drum-sound +(defun midi-drum-sound-eql (event sound) + (eql (midi-drum-sound event) sound)) + +(defun make-midi-drum-sound-eql (sound) + (lambda (event) + (funcall #'midi-drum-sound-eql event sound))) + +(defun midi-drum-sound-any (event &rest sounds) + (loop for sound in sounds + do (if (midi-drum-sound-eql event sound) + (return t)))) + +(defun make-midi-drum-sound-any (&rest sounds) + (lambda (event) + (apply #'midi-drum-sound-any event sounds))) + +;;; midi-channel +(defun midi-channel-eql (event channel) + (eql (midi-channel event) channel)) + +(defun make-midi-channel-eql (channel) + (lambda (event) + (funcall #'midi-channel-eql event channel))) + +(defun midi-channel-any (event &rest channels) + (loop for channel in channels + do (if (midi-channel-eql event channel) + (return t)))) + +(defun make-midi-channel-any (&rest channels) + (lambda (event) + (apply #'midi-channel-any event channels))) + +;;; midi-track +(defun midi-track-eql (event track) + (eql (midi-track event) track)) + +(defun make-midi-track-eql (track) + (lambda (event) + (funcall #'midi-track-eql event track))) + +(defun midi-track-any (event &rest tracks) + (loop for track in tracks + do (if (midi-track-eql event track) + (return t)))) + +(defun make-midi-track-any (&rest tracks) + (lambda (event) + (apply #'midi-track-any event tracks)))
--- a/implementations/midi/methods.lisp Mon Sep 07 12:04:47 2009 +0100 +++ b/implementations/midi/methods.lisp Fri Sep 18 11:04:19 2009 +0100 @@ -12,7 +12,7 @@ (setf (%midi-pitched-event-patch event) value) event) -(Defgeneric midi-channel (midi-message) +(defgeneric midi-channel (midi-message) (:documentation "MIDI channel. Also used for midi output")) (defmethod midi-channel ((midi-message midi-message)) (%midi-message-channel midi-message)) @@ -35,6 +35,13 @@ (defmethod midi-patch ((event midi-pitched-event)) (%midi-pitched-event-patch event)) +(defgeneric midi-note-number (event) + (:documentation "Same as get-pitch-for-midi")) +(defmethod midi-note-number ((event midi-percussive-event)) + (midi-drum-sound event)) +(defmethod midi-note-number ((event midi-pitched-event)) + (midi-pitch-number event)) + (defgeneric midi-drum-sound (event) (:documentation "MIDI pitch for unpitched events (usually, drum sound for drum kits on channel 10, but also for semi-pitched @@ -42,6 +49,15 @@ (defmethod midi-drum-sound ((event midi-percussive-event)) (%midi-percussive-event-sound event)) +(defgeneric midi-drum-sound= (event1 event2)) +(defmethod midi-drum-sound= ((event1 midi-percussive-event) + (event2 midi-percussive-event)) + (= (midi-drum-sound event1) (midi-drum-sound event2))) +(defmethod midi-drum-sound= ((event1 event) + (event2 event)) + "Return nil for any comparisons involving non-percussive events." + nil) + (defmethod time-signatures ((composition midi-composition)) (%midi-time-signatures composition)) (defmethod (setf time-signatures) (sequence (composition midi-composition))
--- a/implementations/midi/package.lisp Mon Sep 07 12:04:47 2009 +0100 +++ b/implementations/midi/package.lisp Fri Sep 18 11:04:19 2009 +0100 @@ -12,8 +12,24 @@ #:midi-track #:midi-velocity #:midi-patch + #:midi-note-number #:midi-drum-sound + #:midi-drum-sound= #:microsecond-per-crotchet-to-bpm #:midi-patch #:midi-timebase + + #:midi-event-type + #:midi-drum-sound-eql + #:make-midi-drum-sound-eql + #:midi-drum-sound-any + #:make-midi-drum-sound-any + #:midi-channel-eql + #:make-midi-channel-eql + #:midi-channel-any + #:make-midi-channel-any + #:midi-track-eql + #:make-midi-track-eql + #:midi-track-any + #:make-midi-track-any ))