j@310: (cl:in-package #:amuse-midi-db) j@310: j@310: (defclass midi-db-object (amuse-object) ()) j@310: j@310: (defclass midi-db-identifier (identifier midi-db-object) ()) j@310: j@310: (defclass midi-db-collection-identifier (midi-db-identifier) j@310: ((collection-id :initarg :collection-id j@310: :accessor collection-id j@310: :initform nil)) j@310: (:documentation "Class to represent midi-db collection identifiers.")) j@310: j@310: (defun make-midi-db-collection-identifier (collection-id) j@310: (make-instance 'midi-db-collection-identifier j@310: :collection-id collection-id)) j@310: j@310: (defclass midi-db-composition-identifier (composition-identifier j@310: midi-db-identifier) j@310: ((composition-id :reader composition-id j@310: :initarg :composition-id)) j@310: (:documentation "Class to represent midi-db composition identifiers.")) j@310: j@310: (defun make-midi-db-composition-identifier (composition-id) j@310: (make-instance 'midi-db-composition-identifier j@310: :composition-id composition-id)) j@310: j@310: (defclass midi-db-composition (midi-composition midi-db-object) j@310: ((collection-identifier :initarg :collection-identifier j@310: :reader collection-identifier) j@310: (filename :initarg :filename j@310: :reader filename) j@310: (owner :initarg :owner j@310: :reader owner) j@310: (version :initarg :version j@310: :reader version) j@310: (creation-timestamp :initarg :creation-timestamp j@310: :reader creation-timestamp) j@310: (deletion-timestamp :initarg :deletion-timestamp j@310: :reader deletion-timestamp)) j@310: (:documentation "Midi-db class with slots for additional database j@310: fields. FIXME: This should perhaps be a subclass of 'versioned j@310: constituents'?")) j@310: j@310: (defun make-midi-db-composition (events start duration tempi timesigs j@310: keysigs identifier j@310: collection-identifier timebase j@310: filename owner version j@310: creation-timestamp j@310: deletion-timestamp) j@310: "Make a midi-db composition. This does not do the usual j@310: adjust-sequence initialisation (calling j@310: %recompute-standard-composition-period). FIXME: Is this bad?" j@310: (make-instance 'midi-db-composition j@310: :%data events j@310: :time start j@310: :interval duration j@310: :time-signatures timesigs j@310: :tempi tempi j@310: :key-signatures keysigs j@310: :identifier identifier j@310: :collection-identifier collection-identifier j@310: :midi-timebase timebase j@310: :filename filename j@310: :owner owner j@310: :version version j@310: :creation-timestamp creation-timestamp j@310: :deletion-timestamp deletion-timestamp)) j@310: j@310: (defmethod initialize-instance :after ((composition j@310: midi-db-composition) &key) j@310: "Initialize each event so that it knows what composition it belongs j@310: to." j@310: (sequence:dosequence (e composition t) j@310: (%set-composition composition e))) j@310: j@310: (defclass midi-db-event (midi-db-object linked-event) j@310: ((collection-identifier :initarg :collection-identifier j@310: :reader collection-identifier) j@310: (composition-identifier :initarg :composition-identifier j@310: :reader composition-identifier) j@310: (identifier :initarg :identifier j@310: :reader identifier) j@310: (version :initarg :version j@310: :reader version))) j@310: j@310: (defclass midi-db-pitched-event (midi-pitched-event midi-db-event) j@310: () j@310: (:documentation "Midi-db class with slots for additional database j@310: fields. FIXME: This should perhaps be a subclass of 'versioned j@310: constituents'?")) j@310: j@310: (defclass midi-db-percussive-event (midi-percussive-event midi-db-event) j@310: () j@310: (:documentation "Midi-db class with slots for additional database j@310: fields. FIXME: This should perhaps be a subclass of 'versioned j@310: constituents'?")) j@310: j@310: (defun make-midi-db-pitched-event (collection-identifier j@310: composition-identifier j@310: event-identifier track channel j@310: patch pitch velocity start duration j@310: version &optional composition) j@310: (make-instance 'midi-db-pitched-event j@310: :collection-identifier collection-identifier j@310: :composition-identifier composition-identifier j@310: :identifier event-identifier j@310: :track track j@310: :channel channel j@310: :patch patch j@310: :number pitch j@310: :velocity velocity j@310: :time start j@310: :interval duration j@310: :version version j@310: :composition composition)) j@310: j@310: (defun make-midi-db-percussive-event (collection-identifier j@310: composition-identifier j@310: event-identifier track channel j@310: patch drum-sound velocity start j@310: duration version &optional j@310: composition) j@310: (make-instance 'midi-db-percussive-event j@310: :collection-identifier collection-identifier j@310: :composition-identifier composition-identifier j@310: :identifier event-identifier j@310: :track track j@310: :channel channel j@310: :patch patch j@310: :sound drum-sound j@310: :velocity velocity j@310: :time start j@310: :interval duration j@310: :version version j@310: :composition composition)) j@310: j@310: (defclass midi-db-tempi (standard-tempo-period midi-db-object) j@310: ((version :initarg :version j@310: :reader version)) j@310: (:documentation "FIXME: subclass versioned constituent")) j@310: j@310: (defun make-midi-db-tempo (start duration microsecs-per-crotchet version) j@310: (make-instance 'midi-db-tempi j@310: :time start j@310: :interval duration j@310: :bpm (microsecond-per-crotchet-to-bpm j@310: microsecs-per-crotchet) j@310: :version version)) j@310: j@310: (defclass midi-db-timesig (standard-time-signature-period j@310: midi-db-object) j@310: ((version :initarg :version j@310: :reader version)) j@310: (:documentation "FIXME: subclass versioned constituent")) j@310: j@310: (defun make-midi-db-timesig (start duration numerator denominator j@310: version) j@310: (make-instance 'midi-db-timesig j@310: :time start j@310: :interval duration j@310: :numerator numerator j@310: :denominator denominator j@310: :version version)) j@310: j@310: (defclass midi-db-keysig (midi-key-signature-period j@310: midi-db-object) j@310: ((version :initarg :version j@310: :reader version)) j@310: (:documentation "FIXME: subclass versioned constituent")) j@310: j@310: (defun make-midi-db-keysig (start duration mode sharp-count version) j@310: (make-instance 'midi-db-keysig j@310: :time start j@310: :interval duration j@310: :mode mode j@310: :sharp-count sharp-count j@310: :version version))