]> git.donarmstrong.com Git - lilypond.git/blob - lily/time-signature.cc
2002-07-31 Rune Zedeler <rune@zedeler.dk>
[lilypond.git] / lily / time-signature.cc
1 /*   
2   time-signature.cc --  implement Time_signature
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1996--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10
11 #include "molecule.hh"
12 #include "text-item.hh"
13 #include "time-signature.hh"
14 #include "paper-def.hh"
15 #include "font-interface.hh"
16 #include "warn.hh"
17 #include "staff-symbol-referencer.hh"
18
19 MAKE_SCHEME_CALLBACK (Time_signature,brew_molecule,1);
20 /*
21   TODO: make different functions for special and normal timesigs.
22  */
23 SCM
24 Time_signature::brew_molecule (SCM smob) 
25 {
26   Grob * me = unsmob_grob (smob);
27   SCM st = me->get_grob_property ("style");
28   SCM frac = me->get_grob_property ("fraction");
29   int n = 4;
30   int d = 4;
31   if (gh_pair_p (frac))
32     {
33       n = gh_scm2int (ly_car (frac));
34       d = gh_scm2int (ly_cdr (frac));
35     }
36
37   Molecule m;
38   if (gh_symbol_p (st))
39     {
40       String style (ly_scm2string (scm_symbol_to_string (st)));
41       if (style[0]=='1')
42         {
43           m = time_signature (me, n, 0);
44         }
45       else
46         {
47           m = special_time_signature (me, style, n, d);
48         }
49     }
50   else
51     m = time_signature (me, n,d);
52
53   if (Staff_symbol_referencer::line_count (me) % 2 == 0)
54     m.translate_axis (Staff_symbol_referencer::staff_space (me)/2 , Y_AXIS);
55
56   return m.smobbed_copy ();
57 }
58
59 Molecule
60 Time_signature::special_time_signature (Grob*me, String s, int n, int d)
61 {
62   /*
63     Randomly probing the font sucks?
64   */
65   
66   SCM alist_chain = Font_interface::font_alist_chain (me);
67   
68   SCM style_chain =
69     Font_interface::add_style (me, ly_symbol2scm ("timesig-symbol"),
70                                alist_chain);
71
72   Font_metric *feta = Font_interface::get_font (me, style_chain);
73
74   /*
75     First guess: s contains only the signature style, append fraction.
76   */
77   String symbolname = "timesig-" + s + to_string (n) + "/" + to_string (d);
78   
79   Molecule m = feta->find_by_name (symbolname);
80   if (!m.empty_b ())
81     return m;
82
83   /*
84     Second guess: s contains the full signature name
85   */
86   m = feta->find_by_name ("timesig-" + s);
87   m.align_to (X_AXIS, LEFT);
88   if (!m.empty_b ()) 
89     return m;
90
91   /*
92     If there is no such symbol, we default without warning to the
93     numbered style.
94    */
95   return time_signature (me, n, d);
96 }
97
98
99 Molecule
100 Time_signature::time_signature (Grob*me,int num, int den)
101 {
102   SCM chain = Font_interface::font_alist_chain (me);
103
104   Molecule n = Text_item::text2molecule (me,
105                                          ly_str02scm (to_string (num).to_str0 ()),
106                                          chain);
107   Molecule d = Text_item::text2molecule (me,
108                                          ly_str02scm (to_string (den).to_str0 ()),
109                                          chain);
110   n.align_to (X_AXIS, CENTER);
111   d.align_to (X_AXIS, CENTER);
112   Molecule m;
113   if (den)
114     {
115       m.add_at_edge (Y_AXIS, UP, n, 0.0);
116       m.add_at_edge (Y_AXIS, DOWN, d, 0.0);
117     }
118   else
119     {
120       m = n;
121       m.align_to (Y_AXIS, CENTER);
122     }
123
124   m.align_to (X_AXIS, LEFT);
125   
126   return m;
127 }
128
129
130
131 ADD_INTERFACE (Time_signature,"time-signature-interface",
132   "A time signature, in different styles.
133   The following values for 'style are are recognized:
134
135     @table @samp
136       @item @code{C}
137         4/4 and 2/2 are typeset as C and struck C, respectively.  All
138         other time signatures are written with two digits.
139
140       @item @code{old}
141         2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8 and 9/8 are
142         typeset with old-style mensuration marks.  All other time
143         signatures are written with two digits.
144
145       @item @code{1xxx}
146         All time signatures are typeset with a single
147         digit, e.g. 3/2 is written as 3. (Any symbol starting
148         with the digit @code{1} will do.)
149
150       @item @code{C}@var{M}@code{/}@var{N}, 
151 @code{old}@var{M}@code{/}@var{N} or
152       @code{old6/8alt}
153         Tells LilyPond to use a specific symbol as time signature, 
154         regardless of the actual time signature.
155     @end table
156
157 See also the test-file @file{input/test/time.ly}.
158 ",
159   "fraction style");