X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpitch.cc;h=0fd75129476a7a1d889d751c504e290f22c30843;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=fa1a45089c1eee6a0a9578c372f073b1117423a4;hpb=bdbcd520701951f81c4e04dd36591086c4c23da5;p=lilypond.git diff --git a/lily/pitch.cc b/lily/pitch.cc index fa1a45089c..0fd7512947 100644 --- a/lily/pitch.cc +++ b/lily/pitch.cc @@ -1,9 +1,20 @@ /* - musical-pitch.cc -- implement Pitch + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1998--2015 Han-Wen Nienhuys - (c) 1998--2007 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "pitch.hh" @@ -13,15 +24,14 @@ #include "string-convert.hh" #include "warn.hh" -#include "ly-smobs.icc" - +#include Pitch::Pitch (int o, int n, Rational a) { notename_ = n; alteration_ = a; octave_ = o; - scale_ = default_global_scale; + scale_ = default_global_scale; normalize_octave (); } @@ -29,8 +39,9 @@ Pitch::Pitch (int o, int n, Rational a) Pitch::Pitch () { notename_ = 0; - scale_ = default_global_scale; + scale_ = default_global_scale; octave_ = 0; + alteration_ = (Rational)0; } int @@ -45,8 +56,8 @@ Pitch::compare (Pitch const &m1, Pitch const &m2) if (n) return n; if (a) - return a; - + return a > (Rational)0 ? 1 : -1; + return 0; } @@ -67,13 +78,13 @@ Pitch::tone_pitch () const int Pitch::rounded_semitone_pitch () const { - return int (double (tone_pitch () * Rational (2))); + return int (floor (double (tone_pitch () * Rational (2) + Rational (1, 2)))); } int Pitch::rounded_quartertone_pitch () const { - return int (double (tone_pitch () * Rational (4))); + return int (floor (double (tone_pitch () * Rational (4) + Rational (1, 2)))); } void @@ -126,9 +137,9 @@ pitch_interval (Pitch const &from, Pitch const &to) { Rational sound = to.tone_pitch () - from.tone_pitch (); Pitch pt (to.get_octave () - from.get_octave (), - to.get_notename () - from.get_notename (), + to.get_notename () - from.get_notename (), - to.get_alteration () - from.get_alteration ()); + to.get_alteration () - from.get_alteration ()); return pt.transposed (Pitch (0, 0, sound - pt.tone_pitch ())); } @@ -136,28 +147,29 @@ pitch_interval (Pitch const &from, Pitch const &to) /* 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 Pitch::to_string () const { int n = (notename_ + 2) % scale_->step_count (); string s = ::to_string (char (n + 'a')); - Rational qtones = alteration_ * Rational (4,1); + Rational qtones = alteration_ * Rational (4, 1); int qt = int (rint (Real (qtones))); - + s += string (accname[qt + 4]); if (octave_ >= 0) { int o = octave_ + 1; while (o--) - s += "'"; + s += "'"; } else if (octave_ < 0) { int o = (-octave_) - 1; while (o--) - s += ::to_string (','); + s += ::to_string (','); } return s; @@ -206,21 +218,19 @@ Pitch::down_to (int notename) notename_ = notename; } -IMPLEMENT_TYPE_P (Pitch, "ly:pitch?"); +const char Pitch::type_p_name_[] = "ly:pitch?"; + SCM -Pitch::mark_smob (SCM x) +Pitch::mark_smob () { - Pitch *p = (Pitch*) SCM_CELL_WORD_1 (x); - return p->scale_->self_scm (); + return scale_->self_scm (); } -IMPLEMENT_SIMPLE_SMOBS (Pitch); int -Pitch::print_smob (SCM s, SCM port, scm_print_state *) +Pitch::print_smob (SCM port, scm_print_state *) { - Pitch *r = (Pitch *) SCM_CELL_WORD_1 (s); scm_puts ("#to_string ()), port); + scm_display (ly_string2scm (to_string ()), port); scm_puts (" >", port); return 1; } @@ -232,8 +242,8 @@ Pitch::equal_p (SCM a, SCM b) Pitch *q = (Pitch *) SCM_CELL_WORD_1 (b); bool eq = p->notename_ == q->notename_ - && p->octave_ == q->octave_ - && p->alteration_ == q->alteration_; + && p->octave_ == q->octave_ + && p->alteration_ == q->alteration_; return eq ? SCM_BOOL_T : SCM_BOOL_F; } @@ -242,8 +252,8 @@ MAKE_SCHEME_CALLBACK (Pitch, less_p, 2); SCM Pitch::less_p (SCM p1, SCM p2) { - Pitch *a = unsmob_pitch (p1); - Pitch *b = unsmob_pitch (p2); + Pitch *a = Pitch::unsmob (p1); + Pitch *b = Pitch::unsmob (p2); if (compare (*a, *b) < 0) return SCM_BOOL_T; @@ -277,6 +287,14 @@ Pitch::transposed (Pitch d) const 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);