Mercurial > hg > amuse
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))