diff implementations/midi-db/classes.lisp @ 236:a5d065905f6d

Add midi-db. Ignore-this: c6f4fc32efa4453ddbdc478793eedd52 A basic implementation for working with MIDI files stored in the database. It is a test case for `versioned' data, but only partially implemented at the moment. darcs-hash:20100223152703-16a00-4388d2720907d777a1c6c6b3a010885ce0fe06a7.gz committer: Jamie Forth <j.forth@gold.ac.uk>
author j.forth <j.forth@gold.ac.uk>
date Thu, 24 Feb 2011 11:23:18 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/implementations/midi-db/classes.lisp	Thu Feb 24 11:23:18 2011 +0000
@@ -0,0 +1,177 @@
+(cl:in-package #:amuse-midi-db)
+
+(defclass midi-db-object (amuse-object) ())
+
+(defclass midi-db-identifier (identifier midi-db-object) ())
+
+(defclass midi-db-collection-identifier (midi-db-identifier)
+  ((collection-id :initarg :collection-id
+		  :accessor collection-id
+		  :initform nil))
+  (:documentation "Class to represent midi-db collection identifiers."))
+
+(defun make-midi-db-collection-identifier (collection-id)
+  (make-instance 'midi-db-collection-identifier
+		 :collection-id collection-id))
+
+(defclass midi-db-composition-identifier (composition-identifier
+					  midi-db-identifier)
+  ((composition-id :reader composition-id
+		   :initarg :composition-id))
+  (:documentation "Class to represent midi-db composition identifiers."))
+
+(defun make-midi-db-composition-identifier (composition-id)
+  (make-instance 'midi-db-composition-identifier
+		 :composition-id composition-id))
+
+(defclass midi-db-composition (midi-composition midi-db-object)
+  ((collection-identifier :initarg :collection-identifier
+			  :reader collection-identifier)
+   (filename :initarg :filename
+	     :reader filename)
+   (owner :initarg :owner
+	  :reader owner)
+   (version :initarg :version
+	    :reader version)
+   (creation-timestamp :initarg :creation-timestamp
+		       :reader creation-timestamp)
+   (deletion-timestamp :initarg :deletion-timestamp
+		       :reader deletion-timestamp))
+  (:documentation "Midi-db class with slots for additional database
+  fields. FIXME: This should perhaps be a subclass of 'versioned
+  constituents'?"))
+
+(defun make-midi-db-composition (events start duration tempi timesigs
+				 keysigs identifier
+				 collection-identifier timebase
+				 filename owner version
+				 creation-timestamp
+				 deletion-timestamp)
+  "Make a midi-db composition. This does not do the usual
+adjust-sequence initialisation (calling
+%recompute-standard-composition-period). FIXME: Is this bad?"
+  (make-instance 'midi-db-composition
+		 :%data events
+		 :time start
+		 :interval duration
+		 :time-signatures timesigs
+		 :tempi tempi
+		 :key-signatures keysigs
+		 :identifier identifier
+		 :collection-identifier collection-identifier
+		 :midi-timebase timebase
+		 :filename filename
+		 :owner owner
+		 :version version
+		 :creation-timestamp creation-timestamp
+		 :deletion-timestamp deletion-timestamp))
+
+(defmethod initialize-instance :after ((composition
+					midi-db-composition) &key)
+  "Initialize each event so that it knows what composition it belongs
+to."
+  (sequence:dosequence (e composition t)
+    (%set-composition composition e)))
+
+(defclass midi-db-event (midi-db-object linked-event)
+  ((collection-identifier :initarg :collection-identifier
+			  :reader collection-identifier)
+   (composition-identifier :initarg :composition-identifier
+			   :reader composition-identifier)
+   (identifier :initarg :identifier
+	       :reader identifier)
+   (version :initarg :version
+	    :reader version)))
+
+(defclass midi-db-pitched-event (midi-pitched-event midi-db-event)
+  ()
+  (:documentation "Midi-db class with slots for additional database
+  fields. FIXME: This should perhaps be a subclass of 'versioned
+  constituents'?"))
+
+(defclass midi-db-percussive-event (midi-percussive-event midi-db-event)
+  ()
+  (:documentation "Midi-db class with slots for additional database
+  fields. FIXME: This should perhaps be a subclass of 'versioned
+  constituents'?"))
+
+(defun make-midi-db-pitched-event (collection-identifier
+				   composition-identifier
+				   event-identifier track channel
+				   patch pitch velocity start duration
+				   version &optional composition)
+  (make-instance 'midi-db-pitched-event
+		 :collection-identifier collection-identifier
+		 :composition-identifier composition-identifier
+		 :identifier event-identifier
+		 :track track
+		 :channel channel
+		 :patch patch
+		 :number pitch
+		 :velocity velocity
+		 :time start
+		 :interval duration
+		 :version version
+		 :composition composition))
+
+(defun make-midi-db-percussive-event (collection-identifier
+				      composition-identifier
+				      event-identifier track channel
+				      patch drum-sound velocity start
+				      duration version &optional
+				      composition)
+  (make-instance 'midi-db-percussive-event
+		 :collection-identifier collection-identifier
+		 :composition-identifier composition-identifier
+		 :identifier event-identifier
+		 :track track
+		 :channel channel
+		 :patch patch
+		 :sound drum-sound
+		 :velocity velocity
+		 :time start
+		 :interval duration
+		 :version version
+		 :composition composition))
+
+(defclass midi-db-tempi (standard-tempo-period midi-db-object)
+  ((version :initarg :version
+	    :reader version))
+  (:documentation "FIXME: subclass versioned constituent"))
+
+(defun make-midi-db-tempo (start duration microsecs-per-crotchet version)
+  (make-instance 'midi-db-tempi
+		 :time start
+		 :interval duration
+		 :bpm (microsecond-per-crotchet-to-bpm
+		       microsecs-per-crotchet)
+		 :version version))
+
+(defclass midi-db-timesig (standard-time-signature-period
+			   midi-db-object)
+  ((version :initarg :version
+	    :reader version))
+  (:documentation "FIXME: subclass versioned constituent"))
+
+(defun make-midi-db-timesig (start duration numerator denominator
+			     version)
+  (make-instance 'midi-db-timesig
+		 :time start
+		 :interval duration
+		 :numerator numerator
+		 :denominator denominator
+		 :version version))
+
+(defclass midi-db-keysig (midi-key-signature-period
+			  midi-db-object)
+  ((version :initarg :version
+	    :reader version))
+  (:documentation "FIXME: subclass versioned constituent"))
+
+(defun make-midi-db-keysig (start duration mode sharp-count version)
+  (make-instance 'midi-db-keysig
+		 :time start
+		 :interval duration
+		 :mode mode
+		 :sharp-count sharp-count
+		 :version version))