]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/pitch.cc
Merge branch 'cvs-head' of ssh+git://hanwen@repo.or.cz/srv/git/lilypond into master...
[lilypond.git] / lily / pitch.cc
index 8b4ace156766cf278752d43a3dd830bc9e212675..566b729e24fdacd7c1bca1df2ff8aecc6f071357 100644 (file)
@@ -3,12 +3,14 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #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 ("#<Pitch ", port);
-  scm_display (scm_makfrom0str (r->to_string ().to_str0 ()), port);
+  scm_display (scm_makfrom0str (r->to_string ().c_str ()), port);
   scm_puts (" >", port);
   return 1;
 }