along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef MUSICAL_PITCH_HH
-#define MUSICAL_PITCH_HH
+#ifndef PITCH_HH
+#define PITCH_HH
#include "lily-proto.hh"
#include "smobs.hh"
#include "rational.hh"
-/** A "tonal" pitch. This is a pitch used in diatonal western music
- (24 quartertones in an octave), as opposed to a frequency in Hz or a
- integer number of semitones.
-
- Pitch is lexicographically ordered by (octave, notename,
- alteration).
+/*
+ A "tonal" pitch. This is a pitch used in diatonal western music
+ (24 quartertones in an octave), as opposed to a frequency in Hz or a
+ integer number of semitones.
+ Pitch is lexicographically ordered by (octave, notename, alteration).
*/
+
class Pitch
{
private:
Pitch transposed (Pitch) const;
Pitch to_relative_octave (Pitch) const;
+ Pitch normalized () const;
+
static int compare (Pitch const &, Pitch const &);
int steps () const;
DOUBLE_SHARP,
};
-extern Rational DOUBLE_FLAT_ALTERATION;
-extern Rational THREE_Q_FLAT_ALTERATION;
-extern Rational FLAT_ALTERATION;
-extern Rational SEMI_FLAT_ALTERATION;
-extern Rational NATURAL_ALTERATION;
-extern Rational SEMI_SHARP_ALTERATION;
-extern Rational SHARP_ALTERATION;
-extern Rational THREE_Q_SHARP_ALTERATION;
-extern Rational DOUBLE_SHARP_ALTERATION;
+extern Rational DOUBLE_FLAT_ALTERATION;
+extern Rational THREE_Q_FLAT_ALTERATION;
+extern Rational FLAT_ALTERATION;
+extern Rational SEMI_FLAT_ALTERATION;
+extern Rational NATURAL_ALTERATION;
+extern Rational SEMI_SHARP_ALTERATION;
+extern Rational SHARP_ALTERATION;
+extern Rational THREE_Q_SHARP_ALTERATION;
+extern Rational DOUBLE_SHARP_ALTERATION;
SCM ly_pitch_diff (SCM pitch, SCM root);
SCM ly_pitch_transpose (SCM p, SCM delta);
extern SCM pitch_less_proc;
Pitch pitch_interval (Pitch const &from, Pitch const &to);
-#endif /* MUSICAL_PITCH_HH */
-
+#endif /* PITCH_HH */
{
length_callback_ = SCM_EOL;
start_callback_ = SCM_EOL;
-
+
length_callback_ = get_property ("length-callback");
if (!ly_is_procedure (length_callback_))
length_callback_ = duration_length_callback_proc;
SCM callback = get_property ("to-relative-callback");
if (ly_is_procedure (callback))
{
- Pitch *p = unsmob_pitch (scm_call_2 (callback, self_scm (), last.smobbed_copy ()));
+ Pitch *p = unsmob_pitch (scm_call_2 (callback, self_scm (),
+ last.smobbed_copy ()));
return *p;
}
compress_music_list (get_property ("elements"), factor);
Duration *d = unsmob_duration (get_property ("duration"));
if (d)
- set_property ("duration", d->compressed (factor.main_part_).smobbed_copy ());
+ set_property ("duration",
+ d->compressed (factor.main_part_).smobbed_copy ());
}
/*
SCM prop = scm_car (entry);
SCM val = scm_cdr (entry);
SCM new_val = val;
-
+
if (Pitch *p = unsmob_pitch (val))
{
Pitch transposed = p->transposed (delta);
if (transposed.get_alteration ().abs () > Rational (1,1))
{
- warning (_f ("transposition by %s makes alteration larger than double",
- delta.to_string ()));
+ string delta_str;
+ if (delta.get_alteration ().abs () > Rational (1, 1))
+ delta_str = (delta.normalized ().to_string ()
+ + " " + _ ("(normalized pitch)"));
+ else
+ delta_str = delta.to_string ();
+
+ warning (_f ("Transposing %s by %s makes alteration larger than double",
+ p->to_string (),
+ delta_str));
+ transposed = transposed.normalized ();
}
new_val = transposed.smobbed_copy ();
// catch programming mistakes.
if (!internal_is_music_type (class_name))
- {
- programming_error ("Not a music type");
- }
+ programming_error ("Not a music type");
Stream_event *e = new Stream_event (class_name, mutable_property_alist_);
Moment length = get_length ();
Music *
unsmob_music (SCM m)
{
- return dynamic_cast<Music*> (unsmob_prob (m));
+ return dynamic_cast<Music *> (unsmob_prob (m));
}
-
string s = ::to_string (char (n + 'a'));
Rational qtones = alteration_ * Rational (4,1);
int qt = int (rint (Real (qtones)));
-
+
s += string (accname[qt + 4]);
if (octave_ >= 0)
{
return p;
}
+Pitch
+Pitch::normalized () const
+{
+ Pitch p = *this;
+ p.normalize ();
+ return p;
+}
+
Rational NATURAL_ALTERATION (0);
Rational FLAT_ALTERATION (-1, 2);
Rational DOUBLE_FLAT_ALTERATION (-1);