]> git.donarmstrong.com Git - lilypond.git/blob - mf/parmesan-timesig.mf
Merge commit '3160f77'
[lilypond.git] / mf / parmesan-timesig.mf
1 % -%-Fundamental-%- -*-Metafont-*-
2 % parmesan-timesig.mf -- implement ancient time signatures
3
4 % source file of LilyPond's pretty-but-neat music font
5
6 % (c) 1998--2006 Mats Bengtsson <matsb@s3.kth.se>,
7 %                Christian Mondrup <scancm@biobase.dk>
8 % (c) 2002--2006 Juergen Reuter <reuter@ipd.uka.de>
9
10
11 fet_begingroup ("timesig");
12
13
14 path threequartercircle;
15
16 threequartercircle := halfcircle & quartercircle rotated 180;
17
18 save mensural_Cdiameter, mensural_Cthickness, mensural_Chairpin;
19
20 mensural_Cdiameter# := 3/2 staff_space#;
21 mensural_Cthickness# := 2 linethickness#;
22 mensural_Chairpin# := 0.5 linethickness#;
23
24 define_pixels (mensural_Cdiameter, mensural_Cthickness, mensural_Chairpin);
25
26
27 %%%%%%%%
28 %
29 %
30 %
31 % MENSURAL NOTATION
32 %
33 %
34 %
35
36 def draw_nail (expr bottom_left, top_right) =
37         save round;
38
39         round = floor min (blot_diameter,
40                            xpart (top_right-bottom_left),
41                            ypart (top_right-bottom_left));
42
43         pickup pencircle scaled round;
44
45         z2 + (round / 2, round / 2) = top_right +
46                                         (mensural_Cthickness / 2, 0);
47         z4 - (round / 2,round / 2) = bottom_left;
48         y3 = y2;
49         y4 = y1;
50         x2 = x1 + mensural_Cthickness / 2;
51         x2 - x1 = x4 - x3;
52         x5 = x1;
53         x6 = x4;
54         y5 = y6 = y2 - 2 mensural_Cthickness;
55
56         pickup pencircle scaled round;
57
58         fill bot z1{right}
59              .. rt z1{up}
60              -- rt z5{up}
61              .. rt z2
62              .. top z2{left}
63              -- top z3{left}
64              .. lft z3
65              .. lft z6{down}
66              -- lft z4{down}
67              .. bot z4{right}
68              -- cycle;
69
70 %       labels (1, 2, 3, 4, 5, 6);
71 enddef;
72
73
74 def mensural_timesig (expr verbose_name, internal_name,
75                            full_circle, reverse_circle, slashed, dotted) =
76         fet_beginchar (verbose_name, internal_name);
77                 if slashed:
78                         set_char_box (
79                           0,
80                           mensural_Cdiameter# + mensural_Cthickness#,
81                           .75 (mensural_Cdiameter# + mensural_Cthickness#),
82                           .75 (mensural_Cdiameter# + mensural_Cthickness#));
83
84                         if (full_circle or dotted):
85                                 draw_nail ((-mensural_Cthickness / 2, -d),
86                                            (mensural_Cthickness / 2, h));
87                         else:
88                                 draw_nail ((-mensural_Cthickness, -d), (0, h));
89                         fi;
90                 else:
91                         set_char_box (
92                           0,
93                           mensural_Cdiameter# + mensural_Cthickness#,
94                           .5 (mensural_Cdiameter# + mensural_Cthickness#),
95                           .5 (mensural_Cdiameter# + mensural_Cthickness#));
96                 fi;
97
98                 save ellipse, pat;
99                 path ellipse, pat;
100
101                 ellipse := fullcircle xscaled mensural_Cthickness
102                                       yscaled mensural_Chairpin;
103
104                 save rot;
105
106                 if reverse_circle:
107                         rot := 225;
108                 else:
109                         rot := 45;
110                 fi;
111
112                 if full_circle:
113                         pat := fullcircle scaled mensural_Cdiameter;
114
115                         fill get_subpoint (ellipse,
116                                            direction 0 of pat,
117                                            point 0 of pat)
118                              for i = 1 step 1 until length pat:
119                                      .. get_subpoint (ellipse,
120                                                       direction i of pat,
121                                                       point i of pat)
122                              endfor
123                              .. cycle;
124                         unfill get_subpoint (ellipse,
125                                              -direction 0 of pat,
126                                              point 0 of pat)
127                                for i = 1 step 1 until length pat:
128                                        .. get_subpoint (ellipse,
129                                                         -direction i of pat,
130                                                         point i of pat)
131                                endfor
132                                .. cycle;
133                 else:
134                         pat := threequartercircle rotated rot
135                                                   scaled mensural_Cdiameter;
136
137                         fill get_subpath (ellipse,
138                                           -direction 0 of pat,
139                                           direction 0 of pat,
140                                           point 0 of pat)
141                              for i = 1 step 1 until (length pat - 1):
142                                      .. get_subpoint (ellipse,
143                                                       direction i of pat,
144                                                       point i of pat)
145                              endfor
146                              .. get_subpath (ellipse,
147                                              direction infinity of pat,
148                                              -direction infinity of pat,
149                                              point infinity of pat)
150                              for i = (length pat - 1) step -1 until 1:
151                                      .. get_subpoint (ellipse,
152                                                       -direction i of pat,
153                                                       point i of pat)
154                              endfor
155                              .. cycle;
156                 fi;
157
158                 if dotted:
159                         pickup pencircle scaled 4 linethickness;
160                         drawdot (0, 0);
161                 fi;
162
163                 currentpicture := currentpicture
164                                     shifted 0.5 (mensural_Cdiameter
165                                                  + mensural_Cthickness, 0);
166         fet_endchar;
167 enddef;
168
169
170 %% tempus imperfectum cum prolatione imperfecta
171 mensural_timesig ("Mensural 4/4 meter", "mensural44",
172                   false, false, false, false);
173
174
175 %% tempus imperfectum cum prolatione imperfecta proportio dupla
176 mensural_timesig ("Mensural 2/2 meter", "mensural22",
177                   false, false, true, false);
178
179
180 %% tempus perfectum cum prolatione imperfecta
181 mensural_timesig ("Mensural 3/2 meter", "mensural32",
182                   true, false, false, false);
183
184
185 %% tempus imperfectum cum prolatione perfecta
186 mensural_timesig ("Mensural 6/4 meter", "mensural64",
187                   false, false, false, true);
188
189
190 %% tempus perfectum cum prolatione perfecta
191 mensural_timesig ("Mensural 9/4 meter", "mensural94",
192                   true, false, false, true);
193
194
195 %% tempus perfectum cum prolatione imperfecta proportio dupla
196 mensural_timesig ("Mensural 3/4 meter", "mensural34",
197                   true, false, true, false);
198
199
200 %% tempus imperfectum cum prolatione perfecta proportio dupla
201 mensural_timesig ("Mensural 6/8 meter", "mensural68",
202                   false, false, true, true);
203
204
205 %% tempus perfectum cum prolatione perfecta proportio dupla
206 mensural_timesig ("Mensural 9/8 meter", "mensural98",
207                   true, false, true, true);
208
209         
210 %% tempus imperfectum cum prolatione imperfecta diminutio simplex
211 mensural_timesig ("Mensural 4/8 meter", "mensural48",
212                   false, true, false, false);
213
214
215 %% tempus imperfectum cum prolatione perfecta diminutio simplex
216 mensural_timesig ("Mensural 6/8 meter", "mensural68alt",
217                   false, true, false, true);
218
219
220 %% tempus imperfectum cum prolatione imperfecta diminutio duplex
221 mensural_timesig ("Mensural 2/4 meter", "mensural24",
222                   false, true, true, false);
223
224
225 %%%%%%%%
226 %
227 %
228 %
229 % NEO-MENSURAL NOTATION
230 %
231 %
232 %
233
234 save neomensural_Cdiameter, neomensural_Cthickness;
235
236 neomensural_Cdiameter# := 3/2 staff_space#;
237 neomensural_Cthickness# := 2 linethickness#;
238
239 define_pixels (neomensural_Cdiameter, neomensural_Cthickness);
240
241
242 def neomensural_timesig (expr verbose_name, internal_name,
243                               full_circle, reverse_circle, slashed, dotted) =
244         fet_beginchar (verbose_name, internal_name);
245                 set_char_box (
246                   0,
247                   neomensural_Cdiameter# + neomensural_Cthickness#,
248                   .5 (neomensural_Cdiameter# + neomensural_Cthickness#),
249                   .5 (neomensural_Cdiameter# + neomensural_Cthickness#));
250
251                 if slashed:
252                         if (full_circle or dotted):
253                                 draw_block ((-neomensural_Cthickness / 2,
254                                              -d + neomensural_Cthickness / 2),
255                                             (neomensural_Cthickness / 2,
256                                              h - neomensural_Cthickness / 2));
257                         else:
258                                 draw_block ((-neomensural_Cthickness,
259                                              -d + neomensural_Cthickness / 2),
260                                             (0,
261                                              h - neomensural_Cthickness / 2));
262                         fi;
263                 fi;
264
265                 save ellipse, pat;
266                 path ellipse, pat;
267
268                 ellipse := fullcircle scaled neomensural_Cthickness;
269
270                 save rot;
271
272                 if reverse_circle:
273                         rot := 225;
274                 else:
275                         rot := 45;
276                 fi;
277
278                 if full_circle:
279                         pat := fullcircle scaled neomensural_Cdiameter;
280
281                         fill get_subpoint (ellipse,
282                                            direction 0 of pat,
283                                            point 0 of pat)
284                              for i = 1 step 1 until length pat:
285                                      .. get_subpoint (ellipse,
286                                                       direction i of pat,
287                                                       point i of pat)
288                              endfor
289                              .. cycle;
290                         unfill get_subpoint (ellipse,
291                                              -direction 0 of pat,
292                                              point 0 of pat)
293                                for i = 1 step 1 until length pat:
294                                        .. get_subpoint (ellipse,
295                                                         -direction i of pat,
296                                                         point i of pat)
297                                endfor
298                                .. cycle;
299                 else:
300                         pat := threequartercircle rotated rot
301                                                   scaled neomensural_Cdiameter;
302
303                         fill get_subpath (ellipse,
304                                           -direction 0 of pat,
305                                           direction 0 of pat,
306                                           point 0 of pat)
307                              for i = 1 step 1 until (length pat - 1):
308                                      .. get_subpoint (ellipse,
309                                                       direction i of pat,
310                                                       point i of pat)
311                              endfor
312                              .. get_subpath (ellipse,
313                                              direction infinity of pat,
314                                              -direction infinity of pat,
315                                              point infinity of pat)
316                              for i = (length pat - 1) step -1 until 1:
317                                      .. get_subpoint (ellipse,
318                                                       -direction i of pat,
319                                                       point i of pat)
320                              endfor
321                              .. cycle;
322                 fi;
323
324                 if dotted:
325                         pickup pencircle scaled 4 linethickness;
326                         drawdot (0, 0);
327                 fi;
328
329                 currentpicture := currentpicture
330                                      shifted 0.5 (neomensural_Cdiameter
331                                                   + neomensural_Cthickness, 0);
332         fet_endchar;
333 enddef;
334
335
336 %% tempus imperfectum cum prolatione imperfecta
337 neomensural_timesig ("Mensural 4/4 meter", "neomensural44",
338                      false, false, false, false);
339
340
341 %% tempus imperfectum cum prolatione imperfecta proportio dupla
342 neomensural_timesig ("Mensural 2/2 meter", "neomensural22",
343                      false, false, true, false);
344
345
346 %% tempus perfectum cum prolatione imperfecta
347 neomensural_timesig ("Mensural 3/2 meter", "neomensural32",
348                      true, false, false, false);
349
350
351 %% tempus imperfectum cum prolatione perfecta
352 neomensural_timesig ("Mensural 6/4 meter", "neomensural64",
353                      false, false, false, true);
354
355
356 %% tempus perfectum cum prolatione perfecta
357 neomensural_timesig ("Mensural 9/4 meter", "neomensural94",
358                      true, false, false, true);
359
360
361 %% tempus perfectum cum prolatione imperfecta proportio dupla
362 neomensural_timesig ("Mensural 3/4 meter", "neomensural34",
363                      true, false, true, false);
364
365
366 %% tempus imperfectum cum prolatione perfecta proportio dupla
367 neomensural_timesig ("Mensural 6/8 meter", "neomensural68",
368                      false, false, true, true);
369
370
371 %% tempus perfectum cum prolatione perfecta proportio dupla
372 neomensural_timesig ("Mensural 9/8 meter", "neomensural98",
373                      true, false, true, true);
374
375         
376 %% tempus imperfectum cum prolatione imperfecta diminutio simplex
377 neomensural_timesig ("Mensural 4/8 meter", "neomensural48",
378                      false, true, false, false);
379
380
381 %% tempus imperfectum cum prolatione perfecta diminutio simplex
382 neomensural_timesig ("Mensural 6/8 meter", "neomensural68alt",
383                      false, true, false, true);
384
385
386 %% tempus imperfectum cum prolatione imperfecta diminutio duplex
387 neomensural_timesig ("Mensural 2/4 meter", "neomensural24",
388                      false, true, true, false);
389
390
391 fet_endgroup ("timesig");