source file of the GNU LilyPond music typesetter
- (c) 1998--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1998--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include "pitch.hh"
notename_ = n;
alteration_ = a;
octave_ = o;
-
- if (n < 0 || n >= 7 ||
- a < -2 || a > 2)
- {
- String s = _ ("Pitch arguments out of range");
- s += ": alteration = " + to_string (a);
- s += ", notename = " + to_string (n);
- warning (s);
- }
normalise ();
}
void
Pitch::transpose (Pitch delta)
{
- int old_semi = semitone_pitch ();
- int delta_semi = delta.semitone_pitch ();
+ int new_semi = semitone_pitch () +delta.semitone_pitch();
octave_ += delta.octave_;
notename_ += delta.notename_;
-
- int new_semi = semitone_pitch ();
- int delta_acc = new_semi - old_semi - delta_semi;
- alteration_ -= delta_acc;
+ alteration_ += new_semi - semitone_pitch();
normalise ();
}
+Pitch
+interval (Pitch const & from , Pitch const & to )
+{
+ int sound = to.semitone_pitch() - from.semitone_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.semitone_pitch()));
+}
+
/* FIXME
Merge with *pitch->text* funcs in chord-name.scm
char const *accname[] = {"eses", "es", "", "is" , "isis"};
String
-Pitch::string () const
+Pitch::to_string () const
{
int n = (notename_ + 2) % 7;
- String s = to_string (char (n + 'a'));
+ String s = ::to_string (char (n + 'a'));
if (alteration_)
s += String (accname[alteration_ + 2]);
{
int o = (-octave_) - 1;
while (o--)
- s += to_string (',');
+ s += ::to_string (',');
}
return s;
return copy of resulting pitch
*/
Pitch
-Pitch::to_relative_octave (Pitch p)
+Pitch::to_relative_octave (Pitch p) const
{
int oct_mod = octave_ + 1; // account for c' = octave 1 iso. 0 4
Pitch up_pitch (p);
n = down_pitch;
n.octave_ += oct_mod;
-
- *this = n;
- return *this;
+ return n;
}
void
}
LY_DEFINE(ly_pitch_transpose,
- "ly-transpose-pitch", 2, 0, 0,
+ "ly:pitch-transpose", 2, 0, 0,
(SCM p, SCM delta),
- "Transpose @var{p} by the amount @var{delta}, where @var{delta} is the
-pitch that central C is transposed to.
-")
+ "Transpose @var{p} by the amount @var{delta}, where @var{delta} is the "
+" pitch that central C is transposed to.")
{
Pitch* t = unsmob_pitch (p);
Pitch *d = unsmob_pitch (delta);
SCM_ASSERT_TYPE(t, p, SCM_ARG1, __FUNCTION__, "pitch") ;
SCM_ASSERT_TYPE(d, delta, SCM_ARG1, __FUNCTION__, "pitch") ;
- Pitch tp =*t;
- tp.transpose (*d);
- return tp.smobbed_copy ();
+ return t->transposed (*d).smobbed_copy ();
}
/****************************************************************/
-IMPLEMENT_TYPE_P (Pitch, "pitch?");
+IMPLEMENT_TYPE_P (Pitch, "ly:pitch?");
SCM
Pitch::mark_smob (SCM)
Pitch *r = (Pitch *) ly_cdr (s);
scm_puts ("#<Pitch ", port);
- scm_display (scm_makfrom0str (r->string ().to_str0 ()), port);
+ scm_display (scm_makfrom0str (r->to_string ().to_str0 ()), port);
scm_puts (" >", port);
return 1;
should add optional args
*/
-LY_DEFINE(make_pitch, "make-pitch", 3, 0, 0,
+LY_DEFINE(make_pitch, "ly:make-pitch", 3, 0, 0,
(SCM o, SCM n, SCM a),
- "
-@var{octave} is specified by an integer, zero for the octave containing
-middle C. @var{note} is a number from 0 to 6, with 0 corresponding to C
-and 6 corresponding to B. The shift is zero for a natural, negative for
-flats, or positive for sharps.
-
-")
+ "@var{octave} is specified by an integer, zero for the octave containing "
+ "middle C. @var{note} is a number from 0 to 6, with 0 corresponding to C "
+ "and 6 corresponding to B. The shift is zero for a natural, negative for "
+ "flats, or positive for sharps. ")
{
SCM_ASSERT_TYPE(gh_number_p (o), o, SCM_ARG1, __FUNCTION__, "number");
SCM_ASSERT_TYPE(gh_number_p (n), n, SCM_ARG2, __FUNCTION__, "number");
return p.smobbed_copy ();
}
+LY_DEFINE(pitch_steps, "ly:pitch-steps", 1, 0,0,
+ (SCM p),
+ "Number of steps counted from central C of the pitch @var{p}.")
+{
+ Pitch *pp = unsmob_pitch (p);
+ SCM_ASSERT_TYPE(pp, p, SCM_ARG1, __FUNCTION__, "Pitch");
+
+ return gh_int2scm (pp->steps());
+}
-LY_DEFINE(pitch_octave, "pitch-octave", 1, 0, 0,
+LY_DEFINE(pitch_octave, "ly:pitch-octave", 1, 0, 0,
(SCM pp),
"extract the octave from pitch @var{p}.")
{
Pitch *p = unsmob_pitch (pp);
- SCM_ASSERT_TYPE(p, pp, SCM_ARG1, __FUNCTION__, "Pitch");
+ SCM_ASSERT_TYPE(p, pp, SCM_ARG1, __FUNCTION__, "Pitch");
int q = p->get_octave ();
return gh_int2scm (q);
}
-LY_DEFINE(pitch_alteration, "pitch-alteration", 1, 0, 0,
+LY_DEFINE(pitch_alteration, "ly:pitch-alteration", 1, 0, 0,
(SCM pp),
"extract the alteration from pitch @var{p}.")
{
return gh_int2scm (q);
}
-LY_DEFINE(pitch_notename, "pitch-notename", 1, 0, 0,
+LY_DEFINE(pitch_notename, "ly:pitch-notename", 1, 0, 0,
(SCM pp),
"extract the note name from pitch @var{pp}.")
{
return gh_int2scm (q);
}
-LY_DEFINE(pitch_semitones, "pitch-semitones", 1, 0, 0,
+LY_DEFINE(pitch_semitones, "ly:pitch-semitones", 1, 0, 0,
(SCM pp),
"calculate the number of semitones of @var{p} from central C.")
{
int q = p->semitone_pitch ();
- // Was :
- //
- //int q = p->steps ();
- //
- // As the function is called "pitch_semitones", I assume it was a mistake !
- // Jiba
-
return gh_int2scm (q);
}
-LY_DEFINE(pitch_less, "pitch<?", 2,0,0, (SCM p1, SCM p2),
+LY_DEFINE(pitch_less, "ly:pitch<?", 2,0,0, (SCM p1, SCM p2),
"Is @var{p1} lower than @var{p2}? This uses lexicographic ordening.")
{
- return Pitch::less_p (ly_car (p1), ly_car (p2));
+ Pitch *a = unsmob_pitch (p1);
+ Pitch *b = unsmob_pitch (p2);
+
+ SCM_ASSERT_TYPE(a, p1, SCM_ARG1, __FUNCTION__, "Pitch");
+ SCM_ASSERT_TYPE(b, p2, SCM_ARG2, __FUNCTION__, "Pitch");
+
+ if (Pitch::compare (*a, *b) < 0)
+ return SCM_BOOL_T;
+ else
+ return SCM_BOOL_F;
+}
+
+LY_DEFINE(ly_pitch_diff, "ly:pitch-diff", 2 ,0 ,0,
+ (SCM pitch, SCM root),
+ "Return pitch with value DELTA = PITCH - ROOT, ie, "
+"ROOT == (ly:pitch-transpose root delta).")
+{
+ Pitch *p = unsmob_pitch (pitch);
+ Pitch *r = unsmob_pitch (root);
+ SCM_ASSERT_TYPE(p, pitch, SCM_ARG1, __FUNCTION__, "Pitch");
+ SCM_ASSERT_TYPE(r, root, SCM_ARG2, __FUNCTION__, "Pitch");
+
+ return interval (*r, *p).smobbed_copy();
}
+
+
+
+
SCM
Pitch::smobbed_copy ()const
{
return alteration_;
}
+Pitch
+Pitch::transposed (Pitch d) const
+{
+ Pitch p =*this;
+ p.transpose (d);
+ return p;
+}