]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/pitch.cc
remove progress again
[lilypond.git] / lily / pitch.cc
index ef912bf130df213296c5f75ac50acd0a5e74c902..566b729e24fdacd7c1bca1df2ff8aecc6f071357 100644 (file)
@@ -1,14 +1,16 @@
 /*
-  musical-pitch.cc --  implement Pitch
+  musical-pitch.cc -- implement Pitch
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2005 Han-Wen Nienhuys <hanwen@cs.uu.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,13 +28,14 @@ Pitch::Pitch ()
 {
   notename_ = 0;
   alteration_ = 0;
+  scale_ = default_global_scale; 
   octave_ = 0;
 }
 
 int
 Pitch::compare (Pitch const &m1, Pitch const &m2)
 {
-  int o =  m1.octave_ - m2.octave_;
+  int o = m1.octave_ - m2.octave_;
   int n = m1.notename_ - m2.notename_;
   int a = m1.alteration_ - m2.alteration_;
 
@@ -47,11 +51,12 @@ 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
@@ -63,15 +68,15 @@ Pitch::semitone_pitch () const
   int n = notename_;
   while (n < 0)
     {
-      n += 7;
-      o --;
+      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));
 }
 
@@ -82,12 +87,12 @@ Pitch::quartertone_pitch () const
   int n = notename_;
   while (n < 0)
     {
-      n += 7;
-      o --;
+      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_);
 }
 
@@ -95,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;
     }
@@ -140,7 +145,7 @@ Pitch::normalise ()
 void
 Pitch::transpose (Pitch delta)
 {
-  int new_semi = quartertone_pitch ()  +delta.quartertone_pitch ();
+  int new_semi = quartertone_pitch () +delta.quartertone_pitch ();
   octave_ += delta.octave_;
   notename_ += delta.notename_;
   alteration_ += new_semi - quartertone_pitch ();
@@ -149,30 +154,29 @@ Pitch::transpose (Pitch delta)
 }
 
 Pitch
-pitch_interval (Pitch const & from , Pitch const & to )
+pitch_interval (Pitch const &from, Pitch const &to)
 {
-  int sound = to.quartertone_pitch ()  - from.quartertone_pitch ();
+  int sound = to.quartertone_pitch () - from.quartertone_pitch ();
   Pitch pt (to.get_octave () - from.get_octave (),
            to.get_notename () - from.get_notename (),
 
            to.get_alteration () - from.get_alteration ());
 
-  return pt.transposed (Pitch (0,0,sound - pt.quartertone_pitch ()));
+  return pt.transposed (Pitch (0, 0, sound - pt.quartertone_pitch ()));
 }
 
-
 /* FIXME
    Merge with *pitch->text* funcs in chord-name.scm  */
 char const *accname[] = {"eses", "eseh", "es", "eh", "",
-                        "ih", "is" , "isih",  "isis"};
+                        "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)
     {
@@ -196,7 +200,7 @@ Pitch
 Pitch::to_relative_octave (Pitch p) const
 {
   /* account for c' = octave 1 iso. 0 4 */
-  int oct_mod = octave_  + 1;
+  int oct_mod = octave_ + 1;
   Pitch up_pitch (p);
   Pitch down_pitch (p);
 
@@ -222,7 +226,7 @@ Pitch::up_to (int notename)
 {
   if (notename_ > notename)
     octave_++;
-  notename_  = notename;
+  notename_ = notename;
 }
 
 void
@@ -234,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);
@@ -247,13 +251,13 @@ 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;
 }
 
 SCM
-Pitch::equal_p (SCM a , SCM b)
+Pitch::equal_p (SCM a, SCM b)
 {
   Pitch *p = (Pitch *) SCM_CELL_WORD_1 (a);
   Pitch *q = (Pitch *) SCM_CELL_WORD_1 (b);
@@ -265,7 +269,6 @@ Pitch::equal_p (SCM a , SCM b)
   return eq ? SCM_BOOL_T : SCM_BOOL_F;
 }
 
-
 MAKE_SCHEME_CALLBACK (Pitch, less_p, 2);
 SCM
 Pitch::less_p (SCM p1, SCM p2)
@@ -279,7 +282,6 @@ Pitch::less_p (SCM p1, SCM p2)
     return SCM_BOOL_F;
 }
 
-
 int
 Pitch::get_octave () const
 {