lilypond-1.3.15
[lilypond.git] / lily / musical-pitch.cc
blob409c71d92b496b6fb63563cdb317d87498f86d3a
1 /*
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>
8 */
9 #include "musical-pitch.hh"
10 #include "debug.hh"
11 #include "main.hh"
13 Musical_pitch::Musical_pitch (int n, int a, int o)
15 notename_i_ = n;
16 accidental_i_ = a;
17 octave_i_ = o;
20 void
21 Musical_pitch::print () const
23 #ifndef NPRINT
24 DEBUG_OUT << str ();
25 #endif
28 int
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_;
35 if (o)
36 return o;
37 if (n)
38 return n;
39 if (a)
40 return a;
41 return 0;
44 int
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 };
55 int
56 Musical_pitch::semitone_pitch () const
58 return pitch_byte_a[ notename_i_ % 7 ] + accidental_i_ + octave_i_ * 12;
61 void
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)
72 notename_i_ -= 7;
73 octave_i_ ++;
76 int new_pitch = semitone_pitch ();
77 int delta_acc = new_pitch - old_pitch - delta_pitch;
78 accidental_i_ -= delta_acc;
82 #if 0
83 // nice test for internationalisation strings
84 char const *accname[] = {"double flat", "flat", "natural",
85 "sharp" , "double sharp"};
86 #else
87 char const *accname[] = {"eses", "es", "", "is" , "isis"};
88 #endif
90 String
91 Musical_pitch::str () const
93 int n = (notename_i_ + 2) % 7;
94 String s = to_str (char(n + 'a'));
95 if (accidental_i_)
96 s += String (accname[accidental_i_ + 2]);
98 if (octave_i_ > 0)
100 int o = octave_i_ + 1;
101 while (o--)
102 s += "'";
104 else if (octave_i_ <0)
106 int o = (-octave_i_) - 1;
107 while (o--)
108 s += to_str (',');
112 return s;
116 change me to relative, counting from last pitch p
117 return copy of resulting pitch
119 Musical_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_);
133 int h = p.steps ();
134 if (abs (up_pitch.steps () - h) < abs (down_pitch.steps () - h))
135 n = up_pitch;
136 else
137 n = down_pitch;
139 n.octave_i_ += oct_mod;
141 *this = n;
142 return *this;
145 void
146 Musical_pitch::up_to (int notename)
148 if (notename_i_ > notename)
150 octave_i_ ++;
152 notename_i_ = notename;
155 void
156 Musical_pitch::down_to (int notename)
158 if (notename_i_ < notename)
160 octave_i_ --;
162 notename_i_ = notename;