Mercurial > hg > amuse
view generics.lisp @ 19:2f331bbdfab8
Added preliminary support for time- and key-signatures and for tempi
darcs-hash:20061213155334-f76cc-a1ece6adfd1e6292e1f67418ddb3f38a56ad2233.gz
author | David Lewis <d.lewis@gold.ac.uk> |
---|---|
date | Wed, 13 Dec 2006 15:53:34 +0000 |
parents | 70e76c1c87b7 |
children | 6eb54ad3b8b4 |
line wrap: on
line source
(cl:in-package #:amuse) ;;; Pulling compositions from the database (defgeneric get-composition (identifier)) ;;; Simple Accessors ;; pitch-based (defgeneric pitch (object &key kind)) ; ? Maybe this returns the pitch ; in its ur form? (defgeneric chromatic-pitch (pitch-designator)) ; How simple are these (defgeneric diatonic-pitch (pitch-designator)) ; if has to be computed? (defgeneric frequency (object)) ;? (defgeneric chromatic-pitch-number (pitch-designator)) (defgeneric meredith-chromatic-pitch-number (pitch-designator) ;; David Meredith's PhD and ps13 code (:method (p) (- (chromatic-pitch-number p) 21))) (defgeneric pitch-class (pitch-designator) (:method (p) (mod (chromatic-pitch-number p) 12))) (defgeneric span (pitch-interval-designator)) ;; time (defgeneric duration (period-designator)) (defgeneric (setf duration) (value period-designator)) (defgeneric timepoint (moment-designator)) (defgeneric (setf timepoint) (value moment-designator)) (defgeneric onset (anchored-period-designator) (:method (apd) (timepoint apd))) (defgeneric (setf onset) (value anchored-period-designator)) (defgeneric cut-off (anchored-period-designator) ; name? (:method (apd) (time+ (moment apd) (floating-period apd)))) ;; others ;; I've given the time-sig accessors general names because it allows ;; for symbols in time-signatures as well as numbers - numerator is an ;; odd accessor if the time sig is C (even in common practice) but ;; it's meaning is clear. beat-units-per-bar is clearer, though, I ;; think. (defgeneric beat-units-per-bar (time-signature)) (defgeneric time-signature-numerator (time-signature) (:method (ts) (beat-units-per-bar ts))) (defgeneric beat-units (time-signature)) (defgeneric time-signature-denominator (time-signature) (:method (ts) (beat-units ts))) (defgeneric key-signature-sharps (key-signature)) (defgeneric bpm (tempo)) ;; in bpm (defgeneric microseconds-per-crotchet (tempo) ;; As used (when rounded) in MIDI (:method (tp) (/ 60000000 (bpm tp)))) ;;; Coerce-type accessors ;; Should I be including these default methods? Should the accessors ;; be direct slot accessors or the generics I'm using? Should we ;; return the object itself if it already is in the target class? (defgeneric anchored-period (anchored-period-designator) (:method (apd) (make-anchored-period (onset apd) (duration apd)))) (defgeneric floating-period (period-designator) (:method (pd) (make-floating-period (duration pd)))) (defgeneric moment (moment-designator) (:method (md) (make-moment (timepoint md)))) ;;; Time Protocol (or moments?) ;; negative times/durations -> ERROR? ;; time+: <time> <duration> -> <time> ;; <duration> <time> -> <time> (same as previous?) ;; <duration> <duration> -> <duration> (or a distinct duration+?) ;; <time> <time> -> ERROR? ;; ;; time-: <time> <time> -> <duration> ;; <time> <duration> -> <time> ;; <duration> <duration> -> <duration> (or a distinct duration-?) ;; <duration> <time> -> ERROR? ;; <anchored> <anchored> -> (time- (moment o1) (moment o2)) ? or error? (defgeneric time+ (object1 object2)) (defgeneric time- (object1 object2)) (defgeneric time> (object1 object2)) (defgeneric time< (object1 object2) (:method (o1 o2) (time> o2 o1))) (defgeneric time= (object1 object2)) (defgeneric time>= (object1 object2) (:method (o1 o2) (or (time> o1 o2) (time= o1 o2)))) (defgeneric time<= (object1 object2) (:method (o1 o2) (or (time< o1 o2) (time= o1 o2)))) (defgeneric time/= (object1 object2) (:method (o1 o2) (not (time= o1 o2)))) ;;; Duration protocol (defgeneric duration> (object1 object2)) (defgeneric duration< (object1 object2) (:method (o1 o2) (duration> o2 o1))) (defgeneric duration= (object1 object2)) (defgeneric duration>= (object1 object2) (:method (o1 o2) (or (duration> o1 o2) (duration= o1 o2)))) (defgeneric duration<= (object1 object2) (:method (o1 o2) (or (duration< o1 o2) (duration= o1 o2)))) (defgeneric duration/= (object1 object2) (:method (o1 o2) (not (duration= o1 o2)))) ;; for linear scaling: (defgeneric duration* (object1 object2)) (defgeneric duration/ (object1 number)) ;;; Pitch protocol ;; pitch+: <pitch> <pitch> -> ERROR ;; <pitch> <interval> -> <pitch> ;; <interval> <pitch> -> <pitch> (same as previous?) ;; <interval> <interval> -> <interval> (or a distinct interval+?) ;; ;; pitch-: <pitch> <pitch> -> <interval> ;; <pitch> <interval> -> <pitch> ;; <interval> <interval> -> <interval> ;; <interval> <pitch> -> ERROR (defgeneric pitch+ (object1 object2)) (defgeneric pitch- (object1 object2)) (defgeneric pitch> (object1 object2)) (defgeneric pitch< (object1 object2) (:method (o1 o2) (pitch> o2 o1))) (defgeneric pitch= (object1 object2)) (defgeneric pitch>= (object1 object2) (:method (o1 o2) (or (pitch> o1 o2) (pitch= o1 o2)))) (defgeneric pitch<= (object1 object2) (:method (o1 o2) (or (pitch< o1 o2) (pitch= o1 o2)))) (defgeneric pitch/= (object1 object2) (:method (o1 o2) (not (pitch= o1 o2)))) ;;; Interval protocol (emphasise _pitch_ not _time_ interval?) (defgeneric interval> (object1 object2)) (defgeneric interval< (object1 object2) (:method (o1 o2) (interval> o2 o1))) (defgeneric interval= (object1 object2)) (defgeneric interval>= (object1 object2) (:method (o1 o2) (or (interval> o1 o2) (interval= o1 o2)))) (defgeneric interval<= (object1 object2) (:method (o1 o2) (or (interval< o1 o2) (interval= o1 o2)))) (defgeneric interval/= (object1 object2) (:method (o1 o2) (not (interval= o1 o2)))) ;;; Allen's (1984) interval relations ;;; . equals already defined as INTERVAL= above ;;; . inverses ommitted for now (just use CL:NOT) ;;; . can all be defined in terms of MEETS (apparently) (defgeneric meets (object1 object2)) (defgeneric before (object1 object2)) (defgeneric overlaps (object1 object2)) (defgeneric during (object1 object2)) (defgeneric starts (object1 object2)) (defgeneric ends (object1 object2)) ;;; and extensions thereof ... (defgeneric subinterval (object1 object2) (:method (o1 o2) (or (starts o1 o2) (during o1 o2) (ends o1 o2)))) (defgeneric disjoint (object1 object2) (:method (o1 o2) (or (before o1 o2) (meets o1 o2) (meets o2 o1) (before o2 o1)))) ;;; More time-based functions ;; Return the anchored-period representing the intersection of two ;; anchored-period-specifiers. (defgeneric period-intersection (anchored-period-specifier1 anchored-period-specifier2)) (defgeneric inter-onset-interval (moment-designator1 moment-designator2) (:method (md1 md2) (time- (moment md2) (moment md1)))) ;;; Time Signature (defgeneric get-applicable-time-signatures (object1 object2)) ;;; Tempo (defgeneric get-applicable-tempi (object1 object2)) ;;; Tonality (Key Signature / Mode) (defgeneric get-applicable-key-signatures (object1 object2)) ;;; Dynamics ;;; Voice ;;; Boundary Strength (phrasing)