X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpitch.cc;h=566b729e24fdacd7c1bca1df2ff8aecc6f071357;hb=1759a10e0e322868d2eefb13ebd13b047c6afd55;hp=8b4ace156766cf278752d43a3dd830bc9e212675;hpb=545092a25d8ca41dc90b87482474b3719f7130a9;p=lilypond.git diff --git a/lily/pitch.cc b/lily/pitch.cc index 8b4ace1567..566b729e24 100644 --- a/lily/pitch.cc +++ b/lily/pitch.cc @@ -3,12 +3,14 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2005 Han-Wen Nienhuys + (c) 1998--2006 Han-Wen Nienhuys */ #include "pitch.hh" -#include "warn.hh" + #include "main.hh" +#include "string-convert.hh" +#include "warn.hh" #include "ly-smobs.icc" @@ -17,6 +19,7 @@ Pitch::Pitch (int o, int n, int a) notename_ = n; alteration_ = a; octave_ = o; + scale_ = default_global_scale; normalise (); } @@ -25,6 +28,7 @@ Pitch::Pitch () { notename_ = 0; alteration_ = 0; + scale_ = default_global_scale; octave_ = 0; } @@ -47,11 +51,13 @@ Pitch::compare (Pitch const &m1, Pitch const &m2) int Pitch::steps () const { - return notename_ + octave_ * 7; + return notename_ + octave_ * scale_->step_semitones_.size (); } /* Should be settable from input? */ -static Byte diatonic_scale_semitones[ ] = { 0, 2, 4, 5, 7, 9, 11 }; +// static Byte diatonic_scale_semitones[ ] = { 0, 2, 4, 5, 7, 9, 11 }; + + /* Calculate pitch height in 12th octave steps. Don't assume normalised pitch as this function is used to normalise the pitch. */ @@ -62,15 +68,15 @@ Pitch::semitone_pitch () const int n = notename_; while (n < 0) { - n += 7; + n += scale_->step_semitones_.size (); o--; } if (alteration_ % 2) programming_error ("semitone_pitch () called on quarter tone alteration."); - return ((o + n / 7) * 12 - + diatonic_scale_semitones[n % 7] + return ((o + n / scale_->step_semitones_.size ()) * 12 + + scale_->step_semitones_[n % scale_->step_semitones_.size ()] + (alteration_ / 2)); } @@ -81,12 +87,12 @@ Pitch::quartertone_pitch () const int n = notename_; while (n < 0) { - n += 7; + n += scale_->step_semitones_.size (); o--; } - return ((o + n / 7) * 24 - + 2 * diatonic_scale_semitones[n % 7] + return ((o + n / scale_->step_semitones_.size ()) * 24 + + 2 * scale_->step_semitones_[n % scale_->step_semitones_.size ()] + alteration_); } @@ -94,15 +100,15 @@ void Pitch::normalise () { int pitch = quartertone_pitch (); - while (notename_ >= 7) + while (notename_ >= (int) scale_->step_semitones_.size ()) { - notename_ -= 7; + notename_ -= scale_->step_semitones_.size (); octave_++; alteration_ -= quartertone_pitch () - pitch; } while (notename_ < 0) { - notename_ += 7; + notename_ += scale_->step_semitones_.size (); octave_--; alteration_ -= quartertone_pitch () - pitch; } @@ -164,13 +170,13 @@ pitch_interval (Pitch const &from, Pitch const &to) char const *accname[] = {"eses", "eseh", "es", "eh", "", "ih", "is", "isih", "isis"}; -String +string Pitch::to_string () const { - int n = (notename_ + 2) % 7; - String s = ::to_string (char (n + 'a')); + int n = (notename_ + 2) % scale_->step_semitones_.size (); + string s = ::to_string (char (n + 'a')); if (alteration_) - s += String (accname[alteration_ - DOUBLE_FLAT]); + s += string (accname[alteration_ - DOUBLE_FLAT]); if (octave_ >= 0) { @@ -232,11 +238,11 @@ Pitch::down_to (int notename) } IMPLEMENT_TYPE_P (Pitch, "ly:pitch?"); - SCM -Pitch::mark_smob (SCM) +Pitch::mark_smob (SCM x) { - return SCM_EOL; + Pitch *p = (Pitch*) SCM_CELL_WORD_1 (x); + return p->scale_->self_scm (); } IMPLEMENT_SIMPLE_SMOBS (Pitch); @@ -245,7 +251,7 @@ Pitch::print_smob (SCM s, SCM port, scm_print_state *) { Pitch *r = (Pitch *) SCM_CELL_WORD_1 (s); scm_puts ("#to_string ().to_str0 ()), port); + scm_display (scm_makfrom0str (r->to_string ().c_str ()), port); scm_puts (" >", port); return 1; }