comparison implementations/mtp/methods.lisp @ 326:5271a0aa06d6

Add extra event slots for articulation, commas and ornaments to amuse-mtp.
author Marcus Pearce <marcus.pearce@eecs.qmul.ac.uk>
date Fri, 27 Apr 2012 10:27:57 +0100
parents 80c227c1c0da
children 04940d80aaed
comparison
equal deleted inserted replaced
325:87fb1218ab18 326:5271a0aa06d6
5 #.(clsql:locally-enable-sql-reader-syntax) 5 #.(clsql:locally-enable-sql-reader-syntax)
6 6
7 (defvar *event-attributes* 7 (defvar *event-attributes*
8 (list [dataset-id] [composition-id] [event-id] 8 (list [dataset-id] [composition-id] [event-id]
9 [onset] [dur] [deltast] [cpitch] [mpitch] [accidental] [keysig] [mode] 9 [onset] [dur] [deltast] [cpitch] [mpitch] [accidental] [keysig] [mode]
10 [barlength] [pulses] [phrase] [tempo] [dyn] [voice])) 10 [barlength] [pulses] [phrase] [tempo] [dyn] [voice] [bioi]
11 [ornament] [comma] [articulation]))
11 12
12 (defgeneric get-dataset (identifer)) 13 (defgeneric get-dataset (identifer))
13 14
14 (defmethod get-dataset ((identifier mtp-dataset-identifier)) 15 (defmethod get-dataset ((identifier mtp-dataset-identifier))
15 (let* ((dataset-id (dataset-id identifier)) 16 (let* ((dataset-id (dataset-id identifier))
16 (where-clause [= [dataset-id] dataset-id]) 17 (where-clause [= [dataset-id] dataset-id])
17 (db-dataset (car (clsql:select [*] :from [mtp-dataset] :where where-clause))) 18 (db-dataset (car (clsql:select [*] :from [mtp-dataset] :where where-clause)))
18 (db-compositions (clsql:select [composition-id][description] 19 (db-compositions (clsql:select [composition-id][description][timebase]
19 :from [mtp-composition] 20 :from [mtp-composition]
20 :order-by '(([composition-id] :asc)) 21 :order-by '(([composition-id] :asc))
21 :where where-clause)) 22 :where where-clause))
22 (db-events (apply #'clsql:select 23 (db-events (apply #'clsql:select
23 (append *event-attributes* 24 (append *event-attributes*
31 :midc (fourth db-dataset))) 32 :midc (fourth db-dataset)))
32 (compositions nil) 33 (compositions nil)
33 (events nil)) 34 (events nil))
34 ;; for each db-composition 35 ;; for each db-composition
35 (dolist (dbc db-compositions) 36 (dolist (dbc db-compositions)
36 (let ((composition-id (car dbc)) 37 (let ((composition-id (first dbc))
37 (description (car dbc))) 38 (description (second dbc))
39 (timebase (third dbc)))
38 ;; for each db-event 40 ;; for each db-event
39 (do* ((dbes db-events (cdr dbes)) 41 (do* ((dbes db-events (cdr dbes))
40 (dbe (car dbes) (car dbes)) 42 (dbe (car dbes) (car dbes))
41 (cid (second dbe) (second dbe))) 43 (cid (second dbe) (second dbe)))
42 ((or (null dbes) (not (= cid composition-id))) 44 ((or (null dbes) (not (= cid composition-id)))
43 (setf db-events dbes)) 45 (setf db-events dbes))
44 (when dbe 46 (when dbe
45 (push (db-event->mtp-event dbe) events))) 47 (push (db-event->mtp-event dbe timebase) events)))
46 (when events 48 (when events
47 (let* ((interval (+ (timepoint (car events)) (duration (car events)))) 49 (let* ((interval (+ (timepoint (car events)) (duration (car events))))
48 (composition 50 (composition
49 (make-mtp-composition :dataset-id dataset-id 51 (make-mtp-composition :dataset-id dataset-id
50 :composition-id composition-id 52 :composition-id composition-id
51 :description description 53 :description description
54 :timebase timebase
52 :time 0 55 :time 0
53 :interval interval))) 56 :interval interval)))
54 (sequence:adjust-sequence composition (length events) 57 (sequence:adjust-sequence composition (length events)
55 :initial-contents (nreverse events)) 58 :initial-contents (nreverse events))
56 (setf events nil) 59 (setf events nil)
65 (where-clause [and [= [dataset-id] dataset-id] 68 (where-clause [and [= [dataset-id] dataset-id]
66 [= [composition-id] composition-id]]) 69 [= [composition-id] composition-id]])
67 (description 70 (description
68 (car (clsql:select [description] :from [mtp-composition] 71 (car (clsql:select [description] :from [mtp-composition]
69 :where where-clause :flatp t :field-names nil))) 72 :where where-clause :flatp t :field-names nil)))
73 (timebase
74 (car (clsql:select [timebase] :from [mtp-composition]
75 :where where-clause :flatp t :field-names nil)))
70 (db-events (apply #'clsql:select 76 (db-events (apply #'clsql:select
71 (append *event-attributes* 77 (append *event-attributes*
72 (list :from [mtp-event] 78 (list :from [mtp-event]
73 :order-by '(([event-id] :asc)) 79 :order-by '(([event-id] :asc))
74 :where where-clause)))) 80 :where where-clause))))
75 (events nil)) 81 (events nil))
76 (dolist (e db-events) 82 (dolist (e db-events)
77 (push (db-event->mtp-event e) events)) 83 (push (db-event->mtp-event e timebase) events))
78 (let* ((interval (+ (timepoint (car events)) (duration (car events)))) 84 (let* ((interval (+ (timepoint (car events)) (duration (car events))))
79 (composition 85 (composition
80 (make-mtp-composition :dataset-id dataset-id 86 (make-mtp-composition :dataset-id dataset-id
81 :composition-id composition-id 87 :composition-id composition-id
82 :description description 88 :description description
89 :timebase timebase
83 :time 0 90 :time 0
84 :interval interval))) 91 :interval interval)))
85 (sequence:adjust-sequence composition (length events) 92 (sequence:adjust-sequence composition (length events)
86 :initial-contents (nreverse events)) 93 :initial-contents (nreverse events))
87 composition))) 94 composition)))
88 95
89 #.(clsql:restore-sql-reader-syntax-state) 96 #.(clsql:restore-sql-reader-syntax-state)
90 97
91 (defun db-event->mtp-event (db-event) 98 (defun db-event->mtp-event (db-event timebase)
92 (let* ((slots ; the order must match *event-attributes* 99 (let* ((slots ; the order must match *event-attributes*
93 '(amuse::time amuse::interval deltast cpitch mpitch accidental 100 '(amuse::time amuse::interval deltast cpitch mpitch accidental
94 keysig mode barlength pulses phrase tempo dyn voice bioi)) 101 keysig mode barlength pulses phrase tempo dyn voice bioi
102 ornament comma articulation))
103 (time-slots '(amuse::time amuse::interval deltast barlength bioi))
95 (mtp-event 104 (mtp-event
96 (make-mtp-event :dataset-id (first db-event) 105 (make-mtp-event :dataset-id (first db-event)
97 :composition-id (second db-event) 106 :composition-id (second db-event)
98 :event-id (third db-event)))) 107 :event-id (third db-event))))
99 (do* ((slts slots (cdr slts)) 108 (do* ((slts slots (cdr slts))
100 (db-atts (nthcdr 3 db-event) (cdr db-atts))) 109 (db-atts (nthcdr 3 db-event) (cdr db-atts)))
101 ((null slts) mtp-event) 110 ((null slts) mtp-event)
102 (setf (slot-value mtp-event (car slts)) (car db-atts))))) 111 (if (member (car slts) time-slots :test #'eql)
112 (setf (slot-value mtp-event (car slts)) (convert-time-slot (car db-atts) timebase))
113 (setf (slot-value mtp-event (car slts)) (car db-atts))))))
114
115 (defun convert-time-slot (value timebase)
116 "Convert native representation of time into a representation where
117 a crotchet has a value of 96."
118 (if (or (null value) (null timebase))
119 nil
120 (let ((multiplier (/ 96 timebase)))
121 (* value multiplier))))
103 122
104 ;;; Monodies 123 ;;; Monodies
105 124
106 (defmethod monody ((identifier mtp-composition-identifier)) 125 (defmethod monody ((identifier mtp-composition-identifier))
107 (monody (get-composition identifier))) 126 (monody (get-composition identifier)))
110 ;; using the voice of the first event in the piece 129 ;; using the voice of the first event in the piece
111 (let ((monody (make-instance 'mtp-monody 130 (let ((monody (make-instance 'mtp-monody
112 :dataset-id (dataset-id c) 131 :dataset-id (dataset-id c)
113 :composition-id (composition-id c) 132 :composition-id (composition-id c)
114 :description (description c) 133 :description (description c)
134 :timebase (composition-timebase c)
115 :time 0 135 :time 0
116 :interval (duration c))) 136 :interval (duration c)))
117 (events nil) 137 (events nil)
118 (monody-voice nil)) 138 (monody-voice nil))
119 (sequence:dosequence (event c) 139 (sequence:dosequence (event c)
124 (sequence:adjust-sequence 144 (sequence:adjust-sequence
125 monody (length events) 145 monody (length events)
126 :initial-contents (sort events #'< :key #'amuse:timepoint)) 146 :initial-contents (sort events #'< :key #'amuse:timepoint))
127 monody)) 147 monody))
128 148
149
129 ;;; Constituents from compositions: time-signatures 150 ;;; Constituents from compositions: time-signatures
130 151
131 (defmethod crotchet ((dataset mtp-dataset)) 152 (defmethod crotchet ((dataset mtp-dataset))
132 (amuse:make-standard-period 153 (amuse:make-standard-period
133 (/ (dataset-timebase dataset) 4))) 154 (/ (dataset-timebase dataset) 4)))
134 155
156 (defmethod crotchet ((composition mtp-composition))
157 (amuse:make-standard-period
158 (/ (composition-timebase composition) 4)))
159
135 #.(clsql:locally-enable-sql-reader-syntax) 160 #.(clsql:locally-enable-sql-reader-syntax)
136 (defmethod crotchet ((composition mtp-composition))
137 (let ((timebase
138 (car (clsql:select [timebase] :from [mtp-dataset]
139 :where [= [dataset-id]
140 (dataset-id composition)]
141 :flatp t
142 :field-names nil))))
143 (amuse:make-standard-period (/ timebase 4))))
144 (defmethod crotchet ((event mtp-event)) 161 (defmethod crotchet ((event mtp-event))
145 (let ((timebase 162 (let ((timebase
146 (car (clsql:select [timebase] :from [mtp-dataset] 163 (car (clsql:select [timebase] :from [mtp-composition]
147 :where [= [dataset-id] 164 :where [and [= [dataset-id] (dataset-id event)] [= [composition-id] (composition-id event)]]
148 (dataset-id event)]
149 :flatp t 165 :flatp t
150 :field-names nil)))) 166 :field-names nil))))
151 (amuse:make-standard-period (/ timebase 4)))) 167 (amuse:make-standard-period (/ timebase 4))))
152 #.(clsql:restore-sql-reader-syntax-state) 168 #.(clsql:restore-sql-reader-syntax-state)
153 169