comparison base/methods.lisp @ 106:8528c316fbcc

delete diatonic-pitch (as was) Delete the diatonic-pitch class, in preparation for MIPS pitch being our single representation. Add a DIATONIC-PITCH-OCTAVE generic, and make OCTAVE return the octave based on a MIDI-PITCH-NUMBER (and make sure that it returns an integer, too). darcs-hash:20070726121235-dc3a5-4cbd1058145163eecbfc84384234904e2353fead.gz
author c.rhodes <c.rhodes@gold.ac.uk>
date Thu, 26 Jul 2007 13:12:35 +0100
parents 7f139c81752e
children a9a1c7aa86a9
comparison
equal deleted inserted replaced
105:7f139c81752e 106:8528c316fbcc
10 (let ((e1 (elt m i)) 10 (let ((e1 (elt m i))
11 (e2 (elt m (1+ i)))) 11 (e2 (elt m (1+ i))))
12 (unless (or (before e1 e2) (meets e1 e2)) 12 (unless (or (before e1 e2) (meets e1 e2))
13 (setf result nil)))))) 13 (setf result nil))))))
14 14
15 ;;; diatonic pitch
16
17 (defmethod octave ((dp diatonic-pitch))
18 (%diatonic-pitch-octave dp))
19
20 (defmethod diatonic-pitch-accidental ((dp diatonic-pitch))
21 (%diatonic-pitch-accidental dp))
22
23 (defmethod pitch= ((p1 diatonic-pitch) (p2 diatonic-pitch))
24 (let ((n1 (%diatonic-pitch-name p1))
25 (a1 (%diatonic-pitch-accidental p1))
26 (o1 (%diatonic-pitch-accidental p1))
27 (n2 (%diatonic-pitch-name p2))
28 (a2 (%diatonic-pitch-accidental p2))
29 (o2 (%diatonic-pitch-accidental p2)))
30 (and n1 n2 (= n1 n2)
31 a1 a2 (= a1 a2)
32 o1 o2 (= o1 o2))))
33
34 (defmethod middle-c ((dp diatonic-pitch))
35 (make-diatonic-pitch 2 0 4))
36
37 (defmethod diatonic-pitch ((dp diatonic-pitch))
38 dp)
39
40 (defmethod diatonic-pitch-name ((dp diatonic-pitch))
41 (elt "ABCDEFG" (%diatonic-pitch-name dp)))
42
43 (defmethod asa-pitch-string ((dp diatonic-pitch))
44 (concatenate 'string
45 (diatonic-pitch-name dp)
46 (let ((a (%diatonic-pitch-accidental dp)))
47 (cond ((plusp a)
48 (make-sequence 'string a :initial-element "s"))
49 ((minusp a)
50 (make-sequence 'string (abs a) :initial-element "f"))
51 (t "n")))
52 (%diatonic-pitch-octave dp)))
53
54 (defmethod mips-pitch ((dp diatonic-pitch))
55 (let ((mips-pitch (mips:pn-p (asa-pitch-string dp))))
56 (make-mips-pitch (first mips-pitch) (second mips-pitch))))
57 (defmethod midi-pitch-number ((dp diatonic-pitch))
58 (midi-pitch-number (mips-pitch dp)))
59 (defmethod chromatic-pitch ((dp diatonic-pitch))
60 (make-chromatic-pitch (midi-pitch-number dp)))
61 (defmethod meredith-chromatic-pitch-number ((dp diatonic-pitch))
62 (meredith-chromatic-pitch-number (mips-pitch dp)))
63 (defmethod meredith-morphetic-pitch-number ((dp diatonic-pitch))
64 (meredith-morphetic-pitch-number (mips-pitch dp)))
65
66 ;;; MIPS pitch 15 ;;; MIPS pitch
67 16
68 (defmethod octave ((mp mips-pitch)) 17 (defmethod asa-pitch-string ((mp mips-pitch))
69 (octave (diatonic-pitch mp))) 18 (mips:p-pn (list (%p-pc mp) (%p-pm mp))))
19
20 (defmethod diatonic-pitch-octave ((mp mips-pitch))
21 (let* ((asa-string (asa-pitch-string mp))
22 (start (position-if #'digit-char-p asa-string)))
23 (values (parse-integer asa-string :start start))))
70 24
71 (defmethod diatonic-pitch-accidental ((mp mips-pitch)) 25 (defmethod diatonic-pitch-accidental ((mp mips-pitch))
72 (diatonic-pitch-accidental (diatonic-pitch mp))) 26 (let* ((asa-string (asa-pitch-string mp))
27 (start 1)
28 (end (position-if #'digit-char-p asa-string))
29 (malist '((#\n . 0) (#\s . +1) (#\f . -1)))
30 (multiplier (cdr (assoc (char asa-string 1) malist))))
31 (* multiplier (- end start))))
32
33 (defmethod diatonic-pitch-name ((mp mips-pitch))
34 (elt (asa-pitch-string mp) 0))
73 35
74 (defmethod pitch= ((p1 mips-pitch) (p2 mips-pitch)) 36 (defmethod pitch= ((p1 mips-pitch) (p2 mips-pitch))
75 (let ((c1 (meredith-chromatic-pitch-number p1)) 37 (let ((c1 (%p-pc p1)) (m1 (%p-pm p1))
76 (m1 (meredith-morphetic-pitch-number p1)) 38 (c2 (%p-pc p2)) (m2 (%p-pm p2)))
77 (c2 (meredith-chromatic-pitch-number p2))
78 (m2 (meredith-morphetic-pitch-number p2)))
79 (and c1 c2 (= c1 c2) 39 (and c1 c2 (= c1 c2)
80 m1 m2 (= m1 m2)))) 40 m1 m2 (= m1 m2))))
81 41
82 (defmethod middle-c ((mp mips-pitch)) 42 (defmethod middle-c ((mp mips-pitch))
83 (make-mips-pitch 39 23)) 43 (make-mips-pitch 39 23))
84 44
85 (defmethod mips-pitch ((mp mips-pitch)) 45 (defmethod midi-pitch-number ((mp mips-pitch))
46 (+ (%p-pc mp) 21))
47
48 (defmethod octave ((mp mips-pitch))
49 (1- (floor (midi-pitch-number mp) 12)))
50
51 (defmethod diatonic-pitch ((mp mips-pitch))
86 mp) 52 mp)
87 53
88 (defmethod diatonic-pitch ((mp mips-pitch)) 54 (defmethod print-object ((o mips-pitch) stream)
89 (let ((asa-pitch (mips:p-pn (list (%p-pc mp) (%p-pm mp)))) 55 (print-unreadable-object (o stream :type t)
90 (accidental-count nil)) 56 (let ((asa-string (asa-pitch-string o)))
91 (make-diatonic-pitch 57 (write asa-string :stream stream))))
92 (position (elt asa-pitch 0) "ABCDEFG")
93 (ecase (elt asa-pitch 1)
94 (#\n 0)
95 (#\s
96 (let ((c (count #\s asa-pitch)))
97 (setf accidental-count c)
98 c))
99 (#\f
100 (let ((c (count #\f asa-pitch)))
101 (setf accidental-count c)
102 (- c))))
103 (parse-integer
104 asa-pitch :start (if accidental-count (1+ accidental-count) 2)))))
105
106 (defmethod meredith-chromatic-pitch-number ((mp mips-pitch))
107 (%p-pc mp))
108 (defmethod meredith-morphetic-pitch-number ((mp mips-pitch))
109 (%p-pm mp))
110 (defmethod midi-pitch-number ((mp mips-pitch))
111 (+ (meredith-chromatic-pitch-number mp) 21))
112 (defmethod chromatic-pitch ((mp mips-pitch))
113 (make-chromatic-pitch (midi-pitch-number mp)))
114 (defmethod asa-pitch-string ((mp mips-pitch))
115 (mips:p-pn (list (meredith-chromatic-pitch-number mp)
116 (meredith-morphetic-pitch-number mp))))
117 (defmethod diatonic-pitch-name ((mp mips-pitch))
118 (elt (asa-pitch-string mp) 0))
119 58
120 ;;; Chromatic pitch 59 ;;; Chromatic pitch
121 60
122 (defmethod octave ((cp chromatic-pitch)) 61 (defmethod octave ((cp chromatic-pitch))
123 (1- (/ (%chromatic-pitch-number cp) 12))) 62 (1- (floor (%chromatic-pitch-number cp) 12)))
124 63
125 (defmethod middle-c ((cp chromatic-pitch)) 64 (defmethod middle-c ((cp chromatic-pitch))
126 (make-chromatic-pitch 60)) 65 (make-chromatic-pitch 60))
127 66
128 (defmethod chromatic-pitch ((pitch-designator chromatic-pitch)) 67 (defmethod chromatic-pitch ((pitch-designator chromatic-pitch))