view implementations/midi-db/classes.lisp @ 310:f99fd6a7bbfc

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
author j.forth <j.forth@gold.ac.uk>
date Tue, 23 Feb 2010 15:27:03 +0000
parents
children
line wrap: on
line source
(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))