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
 	   ))