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