% -%-Fundamental-%- -*-Metafont-*-
% parmesan-timesig.mf -- implement ancient time signatures
% 
% source file of LilyPond's pretty-but-neat music font
% 
% (c) 1998--2009 Mats Bengtsson <matsb@s3.kth.se>,
%		 Christian Mondrup <scancm@biobase.dk>
% (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
% 

fet_begingroup ("timesig");


path threequartercircle;

threequartercircle := halfcircle & quartercircle rotated 180;

save mensural_Cdiameter, mensural_Cthickness, mensural_Chairpin;

mensural_Cdiameter# := 3/2 staff_space#;
mensural_Cthickness# := 2 linethickness#;
mensural_Chairpin# := 0.5 linethickness#;

define_pixels (mensural_Cdiameter, mensural_Cthickness, mensural_Chairpin);


%%%%%%%%
%
%
%
% MENSURAL NOTATION
%
%
%

def draw_nail (expr bottom_left, top_right) =
	save round;

	round = floor min (blot_diameter,
			   xpart (top_right-bottom_left),
			   ypart (top_right-bottom_left));

	pickup pencircle scaled round;

	z2 + (round / 2, round / 2) = top_right +
					(mensural_Cthickness / 2, 0);
	z4 - (round / 2,round / 2) = bottom_left;
	y3 = y2;
	y4 = y1;
	x2 = x1 + mensural_Cthickness / 2;
	x2 - x1 = x4 - x3;
	x5 = x1;
	x6 = x4;
	y5 = y6 = y2 - 2 mensural_Cthickness;

	fill bot z1{right}
	     .. rt z1{up}
	     -- rt z5{up}
	     .. rt z2
	     .. top z2{left}
	     -- top z3{left}
	     .. lft z3
	     .. lft z6{down}
	     -- lft z4{down}
	     .. bot z4{right}
	     -- cycle;

%	labels (1, 2, 3, 4, 5, 6);
enddef;


def mensural_timesig (expr verbose_name, internal_name,
			   full_circle, reverse_circle, slashed, dotted) =
	fet_beginchar (verbose_name, internal_name);
		if slashed:
			set_char_box (
			  0,
			  mensural_Cdiameter# + mensural_Cthickness#,
			  .75 (mensural_Cdiameter# + mensural_Cthickness#),
			  .75 (mensural_Cdiameter# + mensural_Cthickness#));

			if (full_circle or dotted):
				draw_nail ((-mensural_Cthickness / 2, -d),
					   (mensural_Cthickness / 2, h));
			elseif reverse_circle:
				draw_nail ((0, -d), (mensural_Cthickness, h));
			else:
				draw_nail ((-mensural_Cthickness, -d), (0, h));
			fi;
		else:
			set_char_box (
			  0,
			  mensural_Cdiameter# + mensural_Cthickness#,
			  .5 (mensural_Cdiameter# + mensural_Cthickness#),
			  .5 (mensural_Cdiameter# + mensural_Cthickness#));
		fi;

		save ellipse, pat;
		path ellipse, pat;

		ellipse := fullcircle xscaled mensural_Cthickness
				      yscaled mensural_Chairpin;

		save rot;

		if reverse_circle:
			rot := 225;
		else:
			rot := 45;
		fi;

		if full_circle:
			pat := fullcircle scaled mensural_Cdiameter;

			fill get_subpoint (ellipse,
					   direction 0 of pat,
					   point 0 of pat)
			     for i = 1 step 1 until length pat:
				     .. get_subpoint (ellipse,
						      direction i of pat,
						      point i of pat)
			     endfor
			     .. cycle;
			unfill get_subpoint (ellipse,
					     -direction 0 of pat,
					     point 0 of pat)
			       for i = 1 step 1 until length pat:
				       .. get_subpoint (ellipse,
							-direction i of pat,
							point i of pat)
			       endfor
			       .. cycle;
		else:
			pat := threequartercircle rotated rot
						  scaled mensural_Cdiameter;

			fill get_subpath (ellipse,
					  -direction 0 of pat,
					  direction 0 of pat,
					  point 0 of pat)
			     for i = 1 step 1 until (length pat - 1):
				     .. get_subpoint (ellipse,
						      direction i of pat,
						      point i of pat)
			     endfor
			     .. get_subpath (ellipse,
					     direction infinity of pat,
					     -direction infinity of pat,
					     point infinity of pat)
			     for i = (length pat - 1) step -1 until 1:
				     .. get_subpoint (ellipse,
						      -direction i of pat,
						      point i of pat)
			     endfor
			     .. cycle;
		fi;

		if dotted:
			pickup pencircle scaled 4 linethickness;
			drawdot (0, 0);
		fi;

		currentpicture := currentpicture
				    shifted 0.5 (mensural_Cdiameter
						 + mensural_Cthickness, 0);
	fet_endchar;
enddef;


%% tempus imperfectum cum prolatione imperfecta
mensural_timesig ("Mensural 4/4 meter", "mensural44",
		  false, false, false, false);


%% tempus imperfectum cum prolatione imperfecta proportio dupla
mensural_timesig ("Mensural 2/2 meter", "mensural22",
		  false, false, true, false);


%% tempus perfectum cum prolatione imperfecta
mensural_timesig ("Mensural 3/2 meter", "mensural32",
		  true, false, false, false);


%% tempus imperfectum cum prolatione perfecta
mensural_timesig ("Mensural 6/4 meter", "mensural64",
		  false, false, false, true);


%% tempus perfectum cum prolatione perfecta
mensural_timesig ("Mensural 9/4 meter", "mensural94",
		  true, false, false, true);


%% tempus perfectum cum prolatione imperfecta proportio dupla
mensural_timesig ("Mensural 3/4 meter", "mensural34",
		  true, false, true, false);


%% tempus imperfectum cum prolatione perfecta proportio dupla
mensural_timesig ("Mensural 6/8 meter", "mensural68",
		  false, false, true, true);


%% tempus perfectum cum prolatione perfecta proportio dupla
mensural_timesig ("Mensural 9/8 meter", "mensural98",
		  true, false, true, true);

	
%% tempus imperfectum cum prolatione imperfecta diminutio simplex
mensural_timesig ("Mensural 4/8 meter", "mensural48",
		  false, true, false, false);


%% tempus imperfectum cum prolatione perfecta diminutio simplex
mensural_timesig ("Mensural 6/8 meter", "mensural68alt",
		  false, true, false, true);


%% tempus imperfectum cum prolatione imperfecta diminutio duplex
mensural_timesig ("Mensural 2/4 meter", "mensural24",
		  false, true, true, false);


%%%%%%%%
%
%
%
% NEO-MENSURAL NOTATION
%
%
%

save neomensural_Cdiameter, neomensural_Cthickness;

neomensural_Cdiameter# := 3/2 staff_space#;
neomensural_Cthickness# := 2 linethickness#;

define_pixels (neomensural_Cdiameter, neomensural_Cthickness);


def neomensural_timesig (expr verbose_name, internal_name,
			      full_circle, reverse_circle, slashed, dotted) =
	fet_beginchar (verbose_name, internal_name);
		set_char_box (
		  0,
		  neomensural_Cdiameter# + neomensural_Cthickness#,
		  .5 (neomensural_Cdiameter# + neomensural_Cthickness#),
		  .5 (neomensural_Cdiameter# + neomensural_Cthickness#));

		if slashed:
			pickup penrazor scaled neomensural_Cthickness;

			save t;
			t := neomensural_Cthickness / 2;

			if (full_circle or dotted):
				draw (0, -d + t)
				     -- (0, h - t);
			elseif reverse_circle:
				draw (t, -d + t)
				     -- (t, h - t);
			else:
				draw (-t, -d + t)
				     -- (-t, h - t);
			fi;
		fi;

		save ellipse, pat;
		path ellipse, pat;

		ellipse := fullcircle scaled neomensural_Cthickness;

		save rot;

		if reverse_circle:
			rot := 225;
		else:
			rot := 45;
		fi;

		if full_circle:
			pat := fullcircle scaled neomensural_Cdiameter;

			fill get_subpoint (ellipse,
					   direction 0 of pat,
					   point 0 of pat)
			     for i = 1 step 1 until length pat:
				     .. get_subpoint (ellipse,
						      direction i of pat,
						      point i of pat)
			     endfor
			     .. cycle;
			unfill get_subpoint (ellipse,
					     -direction 0 of pat,
					     point 0 of pat)
			       for i = 1 step 1 until length pat:
				       .. get_subpoint (ellipse,
							-direction i of pat,
							point i of pat)
			       endfor
			       .. cycle;
		else:
			pat := threequartercircle rotated rot
						  scaled neomensural_Cdiameter;

			fill get_subpath (ellipse,
					  -direction 0 of pat,
					  direction 0 of pat,
					  point 0 of pat)
			     for i = 1 step 1 until (length pat - 1):
				     .. get_subpoint (ellipse,
						      direction i of pat,
						      point i of pat)
			     endfor
			     .. get_subpath (ellipse,
					     direction infinity of pat,
					     -direction infinity of pat,
					     point infinity of pat)
			     for i = (length pat - 1) step -1 until 1:
				     .. get_subpoint (ellipse,
						      -direction i of pat,
						      point i of pat)
			     endfor
			     .. cycle;
		fi;

		if dotted:
			pickup pencircle scaled 4 linethickness;
			drawdot (0, 0);
		fi;

		currentpicture := currentpicture
				     shifted 0.5 (neomensural_Cdiameter
						  + neomensural_Cthickness, 0);
	fet_endchar;
enddef;


%% tempus imperfectum cum prolatione imperfecta
neomensural_timesig ("Mensural 4/4 meter", "neomensural44",
		     false, false, false, false);


%% tempus imperfectum cum prolatione imperfecta proportio dupla
neomensural_timesig ("Mensural 2/2 meter", "neomensural22",
		     false, false, true, false);


%% tempus perfectum cum prolatione imperfecta
neomensural_timesig ("Mensural 3/2 meter", "neomensural32",
		     true, false, false, false);


%% tempus imperfectum cum prolatione perfecta
neomensural_timesig ("Mensural 6/4 meter", "neomensural64",
		     false, false, false, true);


%% tempus perfectum cum prolatione perfecta
neomensural_timesig ("Mensural 9/4 meter", "neomensural94",
		     true, false, false, true);


%% tempus perfectum cum prolatione imperfecta proportio dupla
neomensural_timesig ("Mensural 3/4 meter", "neomensural34",
		     true, false, true, false);


%% tempus imperfectum cum prolatione perfecta proportio dupla
neomensural_timesig ("Mensural 6/8 meter", "neomensural68",
		     false, false, true, true);


%% tempus perfectum cum prolatione perfecta proportio dupla
neomensural_timesig ("Mensural 9/8 meter", "neomensural98",
		     true, false, true, true);

	
%% tempus imperfectum cum prolatione imperfecta diminutio simplex
neomensural_timesig ("Mensural 4/8 meter", "neomensural48",
		     false, true, false, false);


%% tempus imperfectum cum prolatione perfecta diminutio simplex
neomensural_timesig ("Mensural 6/8 meter", "neomensural68alt",
		     false, true, false, true);


%% tempus imperfectum cum prolatione imperfecta diminutio duplex
neomensural_timesig ("Mensural 2/4 meter", "neomensural24",
		     false, true, true, false);


fet_endgroup ("timesig");
