]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4204: Convert ly::time-signature::print from C++ to Scheme.
authorDan Eble <nine.fierce.ballads@gmail.com>
Mon, 3 Nov 2014 01:32:57 +0000 (20:32 -0500)
committerDan Eble <nine.fierce.ballads@gmail.com>
Tue, 9 Dec 2014 00:05:02 +0000 (19:05 -0500)
The user may add a new time signature style by calling
add-simple-time-signature-style and providing a procedure returning
markup.

input/regression/time-signature-mensural.ly
lily/include/time-signature.hh [deleted file]
lily/slur-scoring.cc
lily/time-signature-engraver.cc
lily/time-signature.cc [deleted file]
scm/define-grob-interfaces.scm
scm/lily.scm
scm/time-signature-settings.scm
scm/time-signature.scm [new file with mode: 0644]

index 3f80eb264215bb041c71b51e91376c8f57fc9670..32081c902fba5900f79c8bafd0c6f7b3f4190a84 100644 (file)
@@ -5,10 +5,10 @@
 }
 
 % N.B. It's strange that these warnings are doubled.
-#(ly:expect-warning "time signature symbol `mensural11' not found")
-#(ly:expect-warning "time signature symbol `mensural11' not found")
-#(ly:expect-warning "time signature symbol `neomensural11' not found")
-#(ly:expect-warning "time signature symbol `neomensural11' not found")
+#(ly:expect-warning "Cannot find glyph timesig.mensural11")
+#(ly:expect-warning "Cannot find glyph timesig.mensural11")
+#(ly:expect-warning "Cannot find glyph timesig.neomensural11")
+#(ly:expect-warning "Cannot find glyph timesig.neomensural11")
 
 \layout { indent = 0 }
 
diff --git a/lily/include/time-signature.hh b/lily/include/time-signature.hh
deleted file mode 100644 (file)
index 784af86..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-  This file is part of LilyPond, the GNU music typesetter.
-
-  Copyright (C) 1996--2014 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 <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef METER_HH
-#define METER_HH
-
-#include "grob-interface.hh"
-#include "lily-proto.hh"
-
-/**
-   Print a time_signature sign.
-
-   TODO:
-
-   2+3+2/8 time_signatures
-*/
-struct Time_signature
-{
-  DECLARE_GROB_INTERFACE ();
-  static Stencil special_time_signature (Grob *, SCM, int, int);
-  static Stencil numbered_time_signature (Grob *, int, int);
-  DECLARE_SCHEME_CALLBACK (print, (SCM));
-};
-#endif // METER_HH
-
index 7ffdacee0c93be0be505b1e41fdc93e1f5180054..bb6b94a8c9db8922091fb78238e4777f168c305c 100644 (file)
@@ -42,7 +42,6 @@
 #include "staff-symbol-referencer.hh"
 #include "staff-symbol.hh"
 #include "stem.hh"
-#include "time-signature.hh"
 #include "warn.hh"
 
 /*
@@ -286,7 +285,7 @@ Slur_score_state::fill (Grob *me)
           && minmax (dir_, encompass_place, y_place) == encompass_place
           && (!extra_encompass_infos_[i].grob_->internal_has_interface (ly_symbol2scm ("key-signature-interface"))
               && !Clef::has_interface (extra_encompass_infos_[i].grob_)
-              && !Time_signature::has_interface (extra_encompass_infos_[i].grob_)))
+              && !extra_encompass_infos_[i].grob_->internal_has_interface (ly_symbol2scm ("time-signature-interface"))))
         {
           for (LEFT_and_RIGHT (d))
             additional_ys[d] = minmax (dir_,
index 587b9bffbcfb16c219855964de4db060d1f6a977..aac2cc231bb545d27de92c98442c1acd776181f3 100644 (file)
@@ -24,7 +24,6 @@
 #include "misc.hh"
 #include "moment.hh"
 #include "stream-event.hh"
-#include "time-signature.hh"
 #include "warn.hh"
 
 #include "translator.icc"
diff --git a/lily/time-signature.cc b/lily/time-signature.cc
deleted file mode 100644 (file)
index c85b891..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
-  This file is part of LilyPond, the GNU music typesetter.
-
-  Copyright (C) 1996--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
-
-  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 <http://www.gnu.org/licenses/>.
-*/
-
-#include "time-signature.hh"
-
-#include "grob.hh"
-#include "font-interface.hh"
-#include "international.hh"
-#include "output-def.hh"
-#include "text-interface.hh"
-
-/*
-  TODO:
-
-  this file should go ; The formatting can completely be done with
-  markups.
-*/
-
-MAKE_SCHEME_CALLBACK (Time_signature, print, 1);
-SCM
-Time_signature::print (SCM smob)
-{
-  Grob *me = Grob::unsmob (smob);
-  SCM st = me->get_property ("style");
-  SCM frac = me->get_property ("fraction");
-  int n = 4;
-  int d = 4;
-  if (scm_is_pair (frac))
-    {
-      n = scm_to_int (scm_car (frac));
-      d = scm_to_int (scm_cdr (frac));
-    }
-
-  Stencil m;
-  if (st == ly_symbol2scm ("single-digit"))
-    m = numbered_time_signature (me, n, 0);
-  else if (scm_is_symbol (st))
-    m = special_time_signature (me, st, n, d);
-  else
-    m = numbered_time_signature (me, n, d);
-
-  return m.smobbed_copy ();
-}
-
-Stencil
-Time_signature::special_time_signature (Grob *me, SCM scm_style, int n, int d)
-{
-  string style = robust_symbol2string (scm_style, "default");
-
-  if (style == "numbered")
-    return numbered_time_signature (me, n, d);
-
-  if ((style == "default") || (style == ""))
-    style = ::to_string ("C");
-  else if (style == "single-C")
-    {
-      if ((n != 2) && (n != 4))
-        return numbered_time_signature (me, n, 0);
-      /* for any d, print 2/d as cut-C, 4/d as C */
-      style = ::to_string ("C");
-      d = n;
-    }
-
-  if (style == "C")
-    {
-      if /* neither C2/2 nor C4/4 */
-      (((n != 2) || (d != 2))
-          && ((n != 4) || (d != 4)))
-        return numbered_time_signature (me, n, d);
-    }
-
-  string char_name = style + ::to_string (n) + ::to_string (d);
-  me->set_property ("font-encoding", ly_symbol2scm ("fetaMusic"));
-  Stencil out = Font_interface::get_default_font (me)
-                ->find_by_name ("timesig." + char_name);
-  if (!out.is_empty ())
-    return out;
-
-  /* If there is no such symbol, we default to the numbered style.
-     (Here really with a warning!) */
-  me->warning (_f ("time signature symbol `%s' not found; "
-                   "reverting to numbered style", char_name));
-  return numbered_time_signature (me, n, d);
-}
-
-Stencil
-Time_signature::numbered_time_signature (Grob *me, int num, int den)
-{
-  SCM chain = me->get_property_alist_chain (Font_interface::text_font_alist_chain (me));
-  chain = scm_cons (scm_list_1 (scm_cons (ly_symbol2scm ("font-encoding"),
-                                          ly_symbol2scm ("fetaText"))),
-                    chain);
-
-  SCM sn = Text_interface::interpret_markup (me->layout ()->self_scm (), chain,
-                                             ly_string2scm (::to_string (num)));
-  SCM sd = Text_interface::interpret_markup (me->layout ()->self_scm (), chain,
-                                             ly_string2scm (::to_string (den)));
-
-  Stencil n = *Stencil::unsmob (sn);
-  Stencil d = *Stencil::unsmob (sd);
-
-  n.align_to (X_AXIS, CENTER);
-  d.align_to (X_AXIS, CENTER);
-  Stencil m;
-  if (den)
-    {
-      m.add_at_edge (Y_AXIS, UP, n, 0.0);
-      m.add_at_edge (Y_AXIS, DOWN, d, 0.0);
-    }
-  else
-    {
-      m = n;
-      m.align_to (Y_AXIS, CENTER);
-    }
-
-  m.align_to (X_AXIS, LEFT);
-
-  return m;
-}
-
-ADD_INTERFACE (Time_signature,
-               "A time signature, in different styles.  The following values"
-               " for @code{style} are are recognized:\n"
-               "\n"
-               "@table @code\n"
-               "@item C\n"
-               "4/4 and 2/2 are typeset as C and struck C, respectively."
-               "  All other time signatures are written with two digits."
-               "  The value @code{default} is equivalent to @code{C}.\n"
-               "@item neomensural\n"
-               "2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8, and 9/8 are"
-               " typeset with neo-mensural style mensuration marks.  All"
-               " other time signatures are written with two digits.\n"
-               "@item mensural\n"
-               "2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8, and 9/8 are"
-               " typeset with mensural style mensuration marks.  All other"
-               " time signatures are written with two digits.\n"
-               "@item single-digit\n"
-               "All time signatures are typeset with a single digit, e.g.,"
-               " 3/2 is written as 3.\n"
-               "@item numbered\n"
-               "All time signatures are typeset with two digits.\n"
-               "@end table",
-
-               /* properties */
-               "fraction "
-               "style "
-              );
index 2321e1c903d4c4b0f50ab87054d38b634b7d8303..0afa960a5f90234e51b29b12db20ef090222f29f 100644 (file)
@@ -317,6 +317,24 @@ interesting enough to maintain a hara-kiri staff."
  "A note head in tablature."
  '(details display-cautionary span-start))
 
+(ly:add-interface
+ 'time-signature-interface
+ "A time signature, in different styles.  The following values for @code{style} are are recognized:
+
+ @table @code
+ @item C
+ 4/4 and 2/2 are typeset as C and struck C, respectively. All other time signatures are written with two digits. The value @code{default} is equivalent to @code{C}.
+ @item neomensural
+ 2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8, and 9/8 are typeset with neo-mensural style mensuration marks.  All other time signatures are written with two digits.
+ @item mensural
+ 2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8, and 9/8 are typeset with mensural style mensuration marks.  All other time signatures are written with two digits.
+ @item single-digit
+ All time signatures are typeset with a single digit, e.g., 3/2 is written as 3.
+ @item numbered
+ All time signatures are typeset with two digits.
+ @end table"
+ '(fraction style))
+
 (ly:add-interface
  'trill-spanner-interface
  "A trill spanner."
index 3ba26bc6dc6eece709b3714ec9e300a41311f46b..7f3f2975ac3c0f4155ca7943fde32693a10e1459 100644 (file)
@@ -555,6 +555,7 @@ messages into errors.")
     "part-combiner.scm"
     "autochange.scm"
     "define-music-properties.scm"
+    "time-signature.scm"
     "time-signature-settings.scm"
     "auto-beam.scm"
     "chord-name.scm"
index 9773f714a6c93bb7e221a2a586628896d52d8ae6..bee620eb9fc7e1fe20adbf0a5e948d5bdc5aeb6a 100644 (file)
@@ -363,6 +363,45 @@ a fresh copy of the list-head is made."
 "
   (interpret-markup layout props (format-compound-time time-sig)))
 
+(add-simple-time-signature-style 'numbered make-compound-meter-markup)
+
+(add-simple-time-signature-style 'single-digit
+  (lambda (fraction) (make-compound-meter-markup (car fraction))))
+
+;;;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+;;; Formatting of symbolic time signatures
+
+(define-public (make-glyph-time-signature-markup style fraction)
+  "Make markup for a symbolic time signature.  If the music font does not have a glyph for the requested style and fraction, issue a warning and make a numbered time signature instead."
+  (make-first-visible-markup
+   (list (make-musicglyph-markup (string-append
+                                  "timesig."
+                                  (symbol->string style)
+                                  (number->string (car fraction))
+                                  (number->string (cdr fraction))))
+         (make-compound-meter-markup fraction))))
+
+(define-public (make-c-time-signature-markup fraction)
+  "Make markup for the `C' time signature style."
+  (let ((n (car fraction))
+        (d (cdr fraction)))
+    ; check specific fractions to avoid warnings when no glyph exists
+    (if (or (and (= n 2) (= d 2))
+            (and (= n 4) (= d 4)))
+        (make-glyph-time-signature-markup 'C fraction)
+        (make-compound-meter-markup fraction))))
+
+(add-simple-time-signature-style 'C make-c-time-signature-markup)
+(add-simple-time-signature-style 'default make-c-time-signature-markup)
+
+(define-public (make-single-c-time-signature-markup fraction)
+  "Make markup for the `single-C' time signature style."
+  (let ((n (car fraction)))
+    (if (or (= n 2) (= n 4)) ; numerator only
+        (make-glyph-time-signature-markup 'C (cons n n))
+        (make-compound-meter-markup n))))
+
+(add-simple-time-signature-style 'single-C make-single-c-time-signature-markup)
 
 ;;;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 ;;; Measure length calculation of (possibly complex) compound time signatures
diff --git a/scm/time-signature.scm b/scm/time-signature.scm
new file mode 100644 (file)
index 0000000..d4f678d
--- /dev/null
@@ -0,0 +1,35 @@
+;;;; This file is part of LilyPond, the GNU music typesetter.
+;;;;
+;;;; Copyright (C) 2014 Daniel Eble <dan@faithful.be>
+;;;;
+;;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-public (ly:time-signature::print grob)
+  "Print routine for time signatures."
+  (let* ((fraction (ly:grob-property grob 'fraction '(4 . 4)))
+         (style (ly:grob-property grob 'style 'default))
+         (proc (assoc-get style time-signature-style-markup-procedures))
+         (markup (if (procedure? proc)
+                     (proc fraction)
+                     (make-glyph-time-signature-markup style fraction))))
+    (grob-interpret-markup grob markup)))
+
+(define-public (add-simple-time-signature-style style proc)
+  "Specify the procedure @{proc} returning markup for a time signature
+style @var{style}.  The procedure is called with one argument, the
+pair @code{(@var{numerator} . @var{denominator})}."
+  (set! time-signature-style-markup-procedures
+        (acons style proc time-signature-style-markup-procedures)))
+
+(define-session time-signature-style-markup-procedures `())