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