2 musical-pitch.cc -- implement Musical_pitch
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "musical-pitch.hh"
13 Musical_pitch::Musical_pitch (int n
, int a
, int o
)
21 Musical_pitch::print () const
29 Musical_pitch::compare (Musical_pitch
const &m1
, Musical_pitch
const &m2
)
31 int o
= m1
.octave_i_
- m2
.octave_i_
;
32 int n
= m1
.notename_i_
- m2
.notename_i_
;
33 int a
= m1
.accidental_i_
- m2
.accidental_i_
;
45 Musical_pitch::steps () const
47 return notename_i_
+ octave_i_
*7;
51 should be settable from input to allow "viola"-mode
53 static Byte pitch_byte_a
[ ] = { 0, 2, 4, 5, 7, 9, 11 };
56 Musical_pitch::semitone_pitch () const
58 return pitch_byte_a
[ notename_i_
% 7 ] + accidental_i_
+ octave_i_
* 12;
62 Musical_pitch::transpose (Musical_pitch delta
)
64 int old_pitch
= semitone_pitch ();
65 int delta_pitch
= delta
.semitone_pitch ();
66 octave_i_
+= delta
.octave_i_
;
67 notename_i_
+= delta
.notename_i_
;
70 while (notename_i_
>= 7)
76 int new_pitch
= semitone_pitch ();
77 int delta_acc
= new_pitch
- old_pitch
- delta_pitch
;
78 accidental_i_
-= delta_acc
;
83 // nice test for internationalisation strings
84 char const *accname
[] = {"double flat", "flat", "natural",
85 "sharp" , "double sharp"};
87 char const *accname
[] = {"eses", "es", "", "is" , "isis"};
91 Musical_pitch::str () const
93 int n
= (notename_i_
+ 2) % 7;
94 String s
= to_str (char(n
+ 'a'));
96 s
+= String (accname
[accidental_i_
+ 2]);
100 int o
= octave_i_
+ 1;
104 else if (octave_i_
<0)
106 int o
= (-octave_i_
) - 1;
116 change me to relative, counting from last pitch p
117 return copy of resulting pitch
120 Musical_pitch::to_relative_octave (Musical_pitch p
)
122 int oct_mod
= octave_i_
+ 1; // account for c' = octave 1 iso. 0 4
123 Musical_pitch
up_pitch (p
);
124 Musical_pitch
down_pitch (p
);
126 up_pitch
.accidental_i_
= accidental_i_
;
127 down_pitch
.accidental_i_
= accidental_i_
;
129 Musical_pitch n
= *this;
130 up_pitch
.up_to (notename_i_
);
131 down_pitch
.down_to (notename_i_
);
134 if (abs (up_pitch
.steps () - h
) < abs (down_pitch
.steps () - h
))
139 n
.octave_i_
+= oct_mod
;
146 Musical_pitch::up_to (int notename
)
148 if (notename_i_
> notename
)
152 notename_i_
= notename
;
156 Musical_pitch::down_to (int notename
)
158 if (notename_i_
< notename
)
162 notename_i_
= notename
;