2 musical-pitch.cc -- implement Musical_pitch
4 source file of the GNU LilyPond music typesetter
6 (c) 1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "musical-pitch.hh"
13 Musical_pitch::Musical_pitch ()
19 Musical_pitch::init ()
24 cautionary_b_ = false;
28 Musical_pitch::print () const
36 Musical_pitch::compare (Musical_pitch const &m1, Musical_pitch const &m2)
38 int o= m1.octave_i_ - m2.octave_i_;
39 int n = m1.notename_i_ - m2.notename_i_;
40 int a = m1.accidental_i_ - m2.accidental_i_;
52 Musical_pitch::steps () const
54 return notename_i_ + octave_i_*7;
58 should be settable from input to allow "viola"-mode
60 static Byte pitch_byte_a[ ] = { 0, 2, 4, 5, 7, 9, 11 };
63 Musical_pitch::semitone_pitch () const
65 return pitch_byte_a[ notename_i_ % 7 ] + accidental_i_ + octave_i_ * 12;
69 Musical_pitch::transpose (Musical_pitch delta)
71 int old_pitch = semitone_pitch ();
72 int delta_pitch = delta.semitone_pitch ();
73 octave_i_ += delta.octave_i_;
74 notename_i_ += delta.notename_i_;
77 while (notename_i_ >= 7)
83 int new_pitch = semitone_pitch ();
84 int delta_acc = new_pitch - old_pitch - delta_pitch;
85 accidental_i_ -= delta_acc;
90 // nice test for internationalisation strings
91 char const *accname[] = {"double flat", "flat", "natural",
92 "sharp" , "double sharp"};
94 char const *accname[] = {"eses", "es", "", "is" , "isis"};
98 Musical_pitch::str () const
100 int n = (notename_i_ + 2) % 7;
101 String s = to_str (char(n + 'a'));
103 s += String (accname[accidental_i_ + 2]);
106 s += String ((octave_i_> 0)? "^": "_") + to_str (octave_i_);
112 change me to relative, counting from last pitch p
113 return copy of resulting pitch
116 Musical_pitch::to_relative_octave (Musical_pitch p)
118 int oct_mod = octave_i_ + 1; // account for c' = octave 1 iso. 0 4
119 Musical_pitch up_pitch (p);
120 Musical_pitch down_pitch (p);
122 up_pitch.accidental_i_ = accidental_i_;
123 down_pitch.accidental_i_ = accidental_i_;
125 Musical_pitch n = *this;
126 up_pitch.up_to (notename_i_);
127 down_pitch.down_to (notename_i_);
130 if (abs (up_pitch.steps () - h) < abs (down_pitch.steps () - h))
135 if (find_quarts_global_b)
137 int d = this->semitone_pitch () - n.semitone_pitch ();
140 int i = 1 + (abs (d) - 1) / 12;
141 String quote_str = d < 0 ? to_str (',', i) : to_str ('\'', i);
142 Musical_pitch w = *this;
144 String name_str = w.str ();
145 name_str + quote_str;
146 w.warning (_f ("Interval greater than quart, relative: %s",
147 name_str + quote_str));
148 // don't actually do any relative stuff
153 n.octave_i_ += oct_mod;
160 Musical_pitch::up_to (int notename)
162 if (notename_i_ > notename)
166 notename_i_ = notename;
170 Musical_pitch::down_to (int notename)
172 if (notename_i_ < notename)
176 notename_i_ = notename;