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 String Musical_pitch::name_str_arr_arr_[7][5];
15 Musical_pitch::Musical_pitch (int n, int a, int o)
23 Musical_pitch::print () const
31 Musical_pitch::compare (Musical_pitch const &m1, Musical_pitch const &m2)
33 int o= m1.octave_i_ - m2.octave_i_;
34 int n = m1.notename_i_ - m2.notename_i_;
35 int a = m1.accidental_i_ - m2.accidental_i_;
47 Musical_pitch::steps () const
49 return notename_i_ + octave_i_*7;
53 should be settable from input to allow "viola"-mode
55 static Byte pitch_byte_a[ ] = { 0, 2, 4, 5, 7, 9, 11 };
58 Musical_pitch::semitone_pitch () const
60 return pitch_byte_a[ notename_i_ % 7 ] + accidental_i_ + octave_i_ * 12;
64 Musical_pitch::transpose (Musical_pitch delta)
66 int old_pitch = semitone_pitch ();
67 int delta_pitch = delta.semitone_pitch ();
68 octave_i_ += delta.octave_i_;
69 notename_i_ += delta.notename_i_;
72 while (notename_i_ >= 7)
78 int new_pitch = semitone_pitch ();
79 int delta_acc = new_pitch - old_pitch - delta_pitch;
80 accidental_i_ -= delta_acc;
84 Musical_pitch::str () const
86 String s = name_str_arr_arr_[notename_i_ % 7][accidental_i_ + 2];
90 int o = octave_i_ + 1;
94 else if (octave_i_ <0)
96 int o = (-octave_i_) - 1;
104 change me to relative, counting from last pitch p
105 return copy of resulting pitch
108 Musical_pitch::to_relative_octave (Musical_pitch p)
110 int oct_mod = octave_i_ + 1; // account for c' = octave 1 iso. 0 4
111 Musical_pitch up_pitch (p);
112 Musical_pitch down_pitch (p);
114 up_pitch.accidental_i_ = accidental_i_;
115 down_pitch.accidental_i_ = accidental_i_;
117 Musical_pitch n = *this;
118 up_pitch.up_to (notename_i_);
119 down_pitch.down_to (notename_i_);
122 if (abs (up_pitch.steps () - h) < abs (down_pitch.steps () - h))
127 n.octave_i_ += oct_mod;
134 Musical_pitch::up_to (int notename)
136 if (notename_i_ > notename)
140 notename_i_ = notename;
144 Musical_pitch::down_to (int notename)
146 if (notename_i_ < notename)
150 notename_i_ = notename;