j@190
|
1 (cl:in-package #:amuse)
|
j@190
|
2
|
j@190
|
3 ;; top-level amuse object
|
j@190
|
4
|
j@190
|
5 (defclass amuse-object () ())
|
j@190
|
6
|
j@190
|
7 ;; types of information-specifiers
|
j@190
|
8
|
j@190
|
9 (defclass identifier (amuse-object) ()
|
j@190
|
10 (:documentation "DEPRECATED: Base class to allow specification of
|
j@288
|
11 composition to get. Must be subclassed.")) ; FIXME: Why deprecated?
|
j@190
|
12
|
j@190
|
13 (defclass constituent-identifier (identifier) ()
|
j@288
|
14 (:documentation "Base class to allow specification of
|
j@288
|
15 constituents"))
|
j@288
|
16
|
j@190
|
17 (defclass composition-identifier (constituent-identifier) ()
|
j@288
|
18 (:documentation "Base class to allow specification of
|
j@288
|
19 compositions constituents"))
|
j@288
|
20
|
j@288
|
21 (defclass event-identifier (identifier) ()
|
j@288
|
22 (:documentation "Base class to allow specification of events."))
|
j@190
|
23
|
j@190
|
24 (defclass moment (amuse-object) ()
|
j@190
|
25 (:documentation "Object indicating a point in time"))
|
j@190
|
26 (defclass period (amuse-object) ()
|
j@190
|
27 (:documentation "Object indicating a region of time"))
|
j@190
|
28 (defclass anchored-period (moment period) ()
|
j@190
|
29 (:documentation "Object indicating a region of time starting at
|
j@190
|
30 a specific point in time"))
|
j@190
|
31 (defclass pitch (amuse-object) ()
|
j@190
|
32 (:documentation "Object indicating some sort of pitch"))
|
j@190
|
33 (defclass pitch-interval (amuse-object) ()
|
j@190
|
34 (:documentation "Object indicating a distance in pitch space"))
|
j@190
|
35
|
j@190
|
36 ;; time-related classes
|
j@190
|
37
|
j@190
|
38 (defclass standard-moment (moment)
|
j@190
|
39 ((time :accessor %moment-time :initarg :time))
|
j@190
|
40 (:documentation "A moment that has time represented on a
|
j@190
|
41 continuous, progressive number line"))
|
j@190
|
42
|
j@190
|
43 (defclass standard-period (period)
|
j@190
|
44 ((interval :accessor %period-interval :initarg :interval))
|
j@190
|
45 (:documentation "A period that places time intervals
|
j@190
|
46 on a progressive number-line"))
|
j@190
|
47
|
j@190
|
48 (defclass standard-anchored-period (standard-period standard-moment anchored-period) ()
|
j@190
|
49 (:documentation "Number-line-based anchored period"))
|
j@190
|
50
|
j@190
|
51 ;; pitch-related classes
|
j@190
|
52
|
j@190
|
53 (defclass frequency-pitch (pitch) ())
|
j@190
|
54
|
j@190
|
55 (defclass chromatic-pitch (pitch)
|
j@296
|
56 ((number :accessor %chromatic-pitch-number
|
j@296
|
57 :reader chromatic-pitch-number :initarg :number))
|
j@296
|
58 (:documentation "A pitch represented as a number, with chromatic
|
j@296
|
59 pitches having distinct values. FIXME: We should not be using the cl
|
j@296
|
60 symbol NUMBER."))
|
j@296
|
61
|
j@190
|
62 (defclass diatonic-pitch (pitch)
|
j@190
|
63 ((cp :initarg :cp :accessor %p-pc :reader diatonic-pitch-cp)
|
j@190
|
64 (mp :initarg :mp :accessor %p-pm :reader diatonic-pitch-mp))
|
j@190
|
65 (:documentation "A diatonic pitch, represented using MIPS: cp is an
|
j@190
|
66 integer representing chromatic pitch (An0 = 0, middle C = 39); mp is
|
j@190
|
67 an integer representing the morphetic pitch (An0 = 0, middle C =
|
j@190
|
68 23)."))
|
j@190
|
69
|
j@190
|
70 (defclass chromatic-pitch-interval (pitch-interval)
|
j@190
|
71 ((span :accessor %chromatic-pitch-interval-span :initarg :span))
|
j@190
|
72 (:documentation "An interval represented as a number, recording
|
j@190
|
73 the number of ascending chromatic pitches between two pitches."))
|
j@190
|
74
|
j@190
|
75 (defclass diatonic-pitch-interval (pitch-interval)
|
j@190
|
76 ((span :accessor %diatonic-pitch-interval-span :initarg :span :reader span))
|
j@190
|
77 (:documentation "How is this inplemented?"))
|
j@190
|
78
|
j@190
|
79 ;; events
|
j@190
|
80
|
j@190
|
81 (defclass event (anchored-period) ()
|
j@190
|
82 (:documentation "Notelike object"))
|
j@311
|
83
|
j@297
|
84 (defclass linked-event (amuse-object)
|
j@297
|
85 ((composition :reader composition
|
j@297
|
86 :writer %set-composition
|
j@297
|
87 :initarg :composition))
|
j@306
|
88 (:documentation "This provides a composition slot for events. The
|
j@306
|
89 generic function initialize-instance can be specialized on an
|
j@306
|
90 implementation composition to assign the event slots when a
|
j@306
|
91 composition instance is created. Or the slot can be assigned within
|
j@306
|
92 the composition constructor function. FIXME: Not sure about this -
|
j@306
|
93 was there a good reason why events should not know the composition
|
j@306
|
94 they belong to? MTP-events have a slot for composition-id (an
|
j@306
|
95 integer number), but here the slot is intended to be assigned the
|
j@306
|
96 composition object itself. Doing this means that potentially some
|
j@306
|
97 generic functions could loose the extra composition parameter. I
|
j@306
|
98 made this change because of SIA projection related stuff, the only
|
j@306
|
99 function that relies on it in amuse is find-next-event. JF"))
|
j@306
|
100
|
j@190
|
101 (defclass pitched-event (event pitch) ()
|
j@190
|
102 (:documentation "Event with pitch information"))
|
j@311
|
103
|
j@190
|
104 (defclass standard-pitched-event (pitched-event
|
j@190
|
105 standard-anchored-period) ()
|
j@190
|
106 (:documentation "Event with pitch information"))
|
j@311
|
107
|
j@190
|
108 (defclass chromatic-pitched-event (pitched-event chromatic-pitch) ()
|
j@190
|
109 (:documentation "Event with chromatic pitch information"))
|
j@311
|
110
|
j@190
|
111 (defclass standard-chromatic-pitched-event (chromatic-pitched-event
|
j@190
|
112 standard-anchored-period) ()
|
j@190
|
113 (:documentation "Event with chromatic pitch information and
|
j@190
|
114 standard-period"))
|
j@311
|
115
|
j@283
|
116 (defclass diatonic-pitched-event (pitched-event diatonic-pitch) ()
|
j@283
|
117 (:documentation "Event with diatonic pitch information"))
|
j@311
|
118
|
j@283
|
119 (defclass standard-diatonic-pitched-event (diatonic-pitched-event
|
j@283
|
120 standard-anchored-period) ()
|
j@283
|
121 (:documentation "Event with diatonic pitch information and
|
j@283
|
122 standard-period"))
|
j@311
|
123
|
j@190
|
124 (defclass percussive-event (event) ()
|
j@190
|
125 (:documentation "Unpitched percussion Event. There's an issue
|
j@190
|
126 with this name - is there a reason why this is unpitched
|
j@190
|
127 necessarily, or why I'm not counting piano, etc in this? Perhaps
|
j@190
|
128 what I mean is that it should be renamed unpitched-event?
|
j@190
|
129 Actually, is this necessary? Isn't this just an event?"))
|
j@311
|
130
|
j@190
|
131 (defclass standard-percussive-event (event standard-anchored-period) ()
|
j@190
|
132 (:documentation "Unpitched percussion Event. There's an issue
|
j@190
|
133 with this name - is there a reason why this is unpitched
|
j@190
|
134 necessarily, or why I'm not counting piano, etc in this? Perhaps
|
j@190
|
135 what I mean is that it should be renamed unpitched-event?
|
j@190
|
136 Actually, is this necessary? Isn't this just an event?
|
j@190
|
137 Timbral/instrumental information will be generalised later but is
|
j@190
|
138 less agreed-on than pitch."))
|
j@190
|
139
|
j@190
|
140 ;;; Range-based `constituents'
|
j@190
|
141 ;; Whilst these are all constituents in the CHARM sense, their
|
j@190
|
142 ;; properties apply to a timed range rather than to a set of
|
j@190
|
143 ;; events. As such, they can be regarded as anchored-periods with
|
j@190
|
144 ;; properties.
|
j@190
|
145
|
j@190
|
146 (defclass time-signature (amuse-object) ()
|
j@190
|
147 (:documentation "Abstract class for time signature"))
|
j@190
|
148
|
j@190
|
149 (defclass time-signature-period (time-signature anchored-period) ()
|
j@190
|
150 (:documentation "Abstract class for time signatures in time"))
|
j@190
|
151
|
j@190
|
152 (defclass standard-time-signature (time-signature)
|
j@190
|
153 ((numerator :accessor %basic-time-signature-numerator
|
j@190
|
154 :initarg :numerator)
|
j@190
|
155 (denominator :accessor %basic-time-signature-denominator
|
j@190
|
156 :initarg :denominator))
|
j@190
|
157 (:documentation "Class with slots for numerator and
|
j@190
|
158 denominator. Can only deal with numeric signatures."))
|
j@190
|
159
|
j@190
|
160 (defclass standard-time-signature-period (standard-time-signature
|
j@190
|
161 time-signature-period
|
j@190
|
162 standard-anchored-period)
|
j@190
|
163 ()
|
j@190
|
164 (:documentation "STANDARD-TIME-SIGNATURE on a time number line"))
|
j@190
|
165
|
j@190
|
166 (defclass key-signature (amuse-object) ()
|
j@190
|
167 (:documentation "Base class for key signature"))
|
j@190
|
168
|
j@190
|
169 (defclass key-signature-period (key-signature anchored-period) ()
|
j@190
|
170 (:documentation "Abstract class for time signatures in time"))
|
j@190
|
171
|
j@190
|
172 (defclass standard-key-signature (key-signature)
|
j@190
|
173 ((sharp-count :accessor %basic-key-signature-sharp-count
|
j@190
|
174 :initarg :sharp-count))
|
j@190
|
175 (:documentation "Simple class - Only has line-of-fifths
|
j@190
|
176 distance from c, so custom signatures won't work"))
|
j@190
|
177
|
j@190
|
178 (defclass standard-key-signature-period (standard-key-signature
|
j@190
|
179 key-signature-period
|
j@190
|
180 standard-anchored-period)
|
j@190
|
181 ()
|
j@190
|
182 (:documentation "STANDARD-KEY-SIGNATURE on a time number line"))
|
j@190
|
183
|
j@190
|
184 (defclass midi-key-signature (standard-key-signature)
|
j@190
|
185 ((mode :accessor %midi-key-signature-mode
|
j@190
|
186 :initarg :mode))
|
j@190
|
187 (:documentation "MIDI-based flavour of basic key signature,
|
j@190
|
188 adding a slot for mode: 0 = major key; 1 = minor key"))
|
j@190
|
189
|
j@190
|
190 (defclass midi-key-signature-period (standard-key-signature-period
|
j@190
|
191 midi-key-signature)
|
j@190
|
192 ()
|
j@190
|
193 (:documentation "MIDI-KEY-SIGNATURE on a time number line"))
|
j@190
|
194
|
j@190
|
195 (defclass tempo (amuse-object) ()
|
j@190
|
196 (:documentation "Abstract class for tempo"))
|
j@190
|
197 (defclass tempo-period (tempo anchored-period) ()
|
j@190
|
198 (:documentation "Abstract class for tempo associated with a
|
j@190
|
199 time period"))
|
j@190
|
200 (defclass standard-tempo (tempo)
|
j@190
|
201 ((bpm :accessor %tempo-bpm
|
j@190
|
202 :initarg :bpm))
|
j@190
|
203 (:documentation "Rather literal reading of absolute tempo.
|
j@190
|
204 accel and rit in symbolic encoding will need other structures,
|
j@190
|
205 as will textual tempo markings."))
|
j@190
|
206 (defclass standard-tempo-period (standard-tempo
|
j@190
|
207 tempo-period
|
j@190
|
208 standard-anchored-period)
|
j@190
|
209 ()
|
j@190
|
210 (:documentation "Tempo associated with a standard-anchored-period"))
|
j@319
|
211
|
j@319
|
212
|
j@319
|
213 ;;;=====================================================================
|
j@319
|
214 ;;; Constituents: collections of more than one event
|
j@319
|
215 ;;;=====================================================================
|
j@190
|
216
|
j@190
|
217 (defclass constituent (anchored-period) ()
|
j@190
|
218 (:documentation "Base class for constituents"))
|
j@311
|
219
|
j@190
|
220 (defclass standard-constituent (constituent standard-anchored-period) ()
|
j@190
|
221 (:documentation "Base class for constituents using standard
|
j@190
|
222 time representation"))
|
j@190
|
223
|
j@190
|
224 (defclass time-ordered-constituent (constituent list-slot-sequence)
|
j@190
|
225 ;; this won't work if lisp implementation doesn't support extensible
|
j@190
|
226 ;; sequences.
|
j@190
|
227 ())
|
j@311
|
228
|
j@190
|
229 (defclass standard-time-ordered-constituent (time-ordered-constituent
|
j@311
|
230 standard-constituent)
|
j@190
|
231 ;; this won't work if lisp implementation doesn't support extensible
|
j@190
|
232 ;; sequences.
|
j@190
|
233 ())
|
j@190
|
234
|
j@190
|
235 (defclass composition (time-ordered-constituent) ()
|
j@190
|
236 (:documentation "Base class for compositions"))
|
j@190
|
237
|
j@190
|
238 (defclass standard-composition (composition
|
j@190
|
239 standard-time-ordered-constituent) ()
|
j@190
|
240 (:documentation "Base class for compositions using standard
|
j@190
|
241 time representation"))
|
j@311
|
242
|
j@190
|
243 (defclass monody (composition) ()
|
j@190
|
244 (:documentation "Class for indicating suitability for analysis
|
j@190
|
245 requiring a monody"))
|
j@311
|
246
|
j@190
|
247 (defclass standard-monody (monody standard-composition) ())
|
j@190
|
248
|
j@319
|
249 ;; Floating Constituents
|
j@319
|
250
|
j@319
|
251 (defclass floating-constituent (period) ()
|
j@319
|
252 (:documentation "Base class for non-anchored constituents"))
|
j@319
|
253
|
j@319
|
254 (defclass standard-floating-constituent (floating-constituent
|
j@319
|
255 standard-period) ()
|
j@319
|
256 (:documentation "Base class for floating constituents using standard
|
j@319
|
257 time representation"))
|
j@319
|
258
|
j@319
|
259 (defclass time-ordered-floating-constituent (floating-constituent
|
j@319
|
260 list-slot-sequence)
|
j@319
|
261 ;; this won't work if lisp implementation doesn't support extensible
|
j@319
|
262 ;; sequences.
|
j@319
|
263 ())
|
j@319
|
264
|
j@319
|
265 (defclass standard-time-ordered-floating-constituent
|
j@319
|
266 (time-ordered-floating-constituent standard-floating-constituent)
|
j@319
|
267 ;; this won't work if lisp implementation doesn't support extensible
|
j@319
|
268 ;; sequences.
|
j@319
|
269 ())
|
j@319
|
270
|
io901tp@323
|
271 ;;; Simultaneities are constituents whose particles have an overlapping time period.
|
io901tp@323
|
272 (defclass simultaneity (constituent)
|
io901tp@323
|
273 ((particles :initarg :particles :accessor %particles
|
io901tp@323
|
274 :documentation "particles"))
|
io901tp@323
|
275 (:documentation "Class for simultaneity constituent. A simultaneity is a constituent which is formed of particles that have an intersecting time period."))
|
io901tp@323
|
276
|
j@190
|
277 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
j@190
|
278 ;;
|
j@190
|
279 ;; Experimental:
|
j@190
|
280 ;;
|
j@190
|
281
|
j@190
|
282 (defclass clef (amuse-object) ()
|
j@190
|
283 (:documentation "Abstract class for clef implementations"))
|
j@190
|
284
|
j@190
|
285 (defclass clef-period (clef anchored-period) ()
|
j@190
|
286 (:documentation "Abstract class for clef implementations in time"))
|
j@190
|
287
|
j@190
|
288 (defclass standard-clef (clef)
|
j@190
|
289 ((type :accessor %standard-clef-type
|
j@190
|
290 :initarg :type)
|
j@190
|
291 (line :accessor %standard-clef-line
|
j@190
|
292 :initarg :line)
|
j@190
|
293 (octave-shift :accessor %standard-clef-octave-shift
|
j@190
|
294 :initarg :octave-shift
|
j@190
|
295 :initform nil))
|
j@190
|
296 (:documentation "Class of clef with slots for type (a keyword
|
j@190
|
297 from :F, :G and :C, probably), line (counting from the lowest line =
|
j@190
|
298 1) and octave shift (nil or a positive or negative integer
|
j@190
|
299 representing transposition up or down"))
|
j@190
|
300
|
j@190
|
301 (defclass standard-clef-period (standard-clef clef-period standard-anchored-period)
|
j@190
|
302 ()
|
j@190
|
303 (:documentation "Standard clef on a timeline"))
|