m@24: (cl:in-package #:amuse) m@24: m@24: ;; collections of more than one event m@24: d@33: (defclass constituent (anchored-period) ()) d@33: (defclass time-ordered-constituent (constituent list-slot-sequence) d@33: ;; this won't work if lisp implementation doesn't support extensible d@33: ;; sequences. d@33: ()) d@33: (defclass composition (time-ordered-constituent) ()) m@89: (defclass monody (composition) ()) m@24: m@24: ;; types of information-specifiers m@24: d@35: (defclass identifier () ()) ;; for composition specification d@100: (defclass moment-designator () () d@100: (:documentation "Object indicating a point in time")) d@100: (defclass period-designator () () d@100: (:documentation "Object indicating a region of time")) d@100: (defclass anchored-period-designator (moment-designator period-designator) () d@100: (:documentation "Object indicating a region of time starting at d@100: a specific point in time")) d@100: (defclass pitch-designator () () d@100: (:documentation "Object indicating some sort of pitch")) d@100: (defclass pitch-interval-designator () () d@100: (:documentation "Object indicating a distance in pitch space")) m@24: m@24: ;; time-related classes m@24: m@24: (defclass moment (moment-designator) d@100: ((time :accessor %moment-time :initarg :time)) d@100: (:documentation "A moment represented on a number line")) m@24: m@24: (defclass period (period-designator) d@100: ((interval :accessor %period-interval :initarg :interval)) d@100: (:documentation "A number-line-based period")) m@24: d@100: (defclass floating-period (period) () d@100: (:documentation "A simple numeric period")) d@100: (defclass anchored-period (period moment anchored-period-designator) () d@100: (:documentation "Number-line-based anchored period")) m@24: m@24: ;; pitch-related classes m@24: m@24: (defclass frequency () ()) m@24: m@24: (defclass pitch (pitch-designator) ()) m@24: (defclass chromatic-pitch (pitch) d@100: ((number :accessor %chromatic-pitch-number :initarg :number)) d@100: (:documentation "A pitch represented as a number, with higher d@100: values representing high pitches.")) c@109: (defclass diatonic-pitch (pitch) c@108: ((cp :initarg :cp :accessor %p-pc :reader diatonic-pitch-cp) c@108: (mp :initarg :mp :accessor %p-pm :reader diatonic-pitch-mp)) c@109: (:documentation "A diatonic pitch, represented using MIPS: cp is an c@109: integer representing chromatic pitch (An0 = 0, middle C = 39); mp is c@109: an integer representing the morphetic pitch (An0 = 0, middle C = c@109: 23).")) m@81: c@111: (defclass chromatic-pitch-interval (pitch-interval-designator) c@111: ((span :accessor %chromatic-pitch-interval-span :initarg :span))) c@111: c@111: (defclass diatonic-pitch-interval (pitch-interval-designator) c@111: ((span :accessor %diatonic-pitch-interval-span :initarg :span :reader span))) m@24: m@24: ;; events m@24: m@24: (defclass event (anchored-period) ()) m@24: (defclass pitched-event (event pitch-designator) ()) m@24: (defclass chromatic-pitched-event (pitched-event chromatic-pitch) ()) m@24: (defclass percussive-event (event) ()) m@24: m@24: ;;; Range-based `constituents' m@24: ;; Whilst these are all constituents in the CHARM sense, their m@24: ;; properties apply to a timed range rather than to a set of m@24: ;; events. As such, they can be regarded as anchored-periods with m@24: ;; properties. m@24: m@24: (defclass time-signature (anchored-period) ()) m@24: m@48: (defclass basic-time-signature (time-signature) m@24: ;; N.B. Can only deal with numeric signatures m@24: ((numerator :accessor %basic-time-signature-numerator m@24: :initarg :numerator) m@24: (denominator :accessor %basic-time-signature-denominator m@24: :initarg :denominator))) m@24: m@24: (defclass key-signature (anchored-period) ()) m@24: m@24: (defclass basic-key-signature (key-signature) m@24: ;; Only has line-of-fifths distance from c, so custom signatures m@24: ;; won't work m@24: ((sharp-count :accessor %basic-key-signature-sharp-count m@44: :initarg :sharp-count))) m@24: m@40: (defclass midi-key-signature (basic-key-signature) m@68: ;; mode: 0 = major key; 1 = minor key m@40: ((mode :accessor %midi-key-signature-mode m@44: :initarg :mode))) m@40: m@24: (defclass tempo (anchored-period) m@24: ;; accel and rit in symbolic encoding will need other structures, as m@24: ;; will textual tempo markings. m@24: ((bpm :accessor %tempo-bpm m@24: :initarg :bpm))) m@40: