% -%-Fundamental-%- -*-Metafont-*-
% parmesan-accidentals.mf -- implement ancient accidentals
% 
% source file of LilyPond's pretty-but-neat music font
% 
% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
% 

fet_begingroup ("accidentals");


%%%%%%%%
%
%
%
% EDITIO MEDICAEA
%
%
%
fet_beginchar ("Ed. Med. Flat" , "medicaeaM1");
	set_char_box (0.1 staff_space#, 0.6 staff_space#,
		      0.6 staff_space#, 1.0 staff_space#);

	save ellipse, pat, outline, T;
	path ellipse, pat, outline;
	transform T;

	T := identity xscaled 0.50 linethickness
		      yscaled 0.22 staff_space;
	pickup pencircle transformed T;
	ellipse := fullcircle transformed T;

	x1 = x2 = 0;
	top y1 = h;
	bot y2 = -d;

	fill get_subpath (ellipse, up, down, z1)
	     -- get_subpath (ellipse, down, up, z2)
	     -- cycle;

	T := identity xscaled 0.50 linethickness
		      yscaled 0.22 staff_space
		      rotated -63;
	pickup pencircle transformed T;
	ellipse := fullcircle transformed T;

	z3 = (0.10 staff_space, -0.50 staff_space);
	z4 = (0.40 staff_space, +0.40 staff_space);
	z5 = (0.10 staff_space, +0.40 staff_space);

	pat := z3{(1, 2)}
	       .. z4
	       .. z5{(-1, -1)};

	% the original envelope curve created with `draw' contains
	% cusps which we avoid
	outline := get_subpath (ellipse, -direction 0 of pat,
				direction 0 of pat, z3)
		   .. get_subpoint (ellipse, direction 1 of pat, z4)
		   .. get_subpath (ellipse, direction 2 of pat,
				   -direction 1.8 of pat, z5)
		   .. get_subpoint (ellipse, -direction 1 of pat, z4)
			{-direction 1 of pat}
		   .. cycle;

	save shift;
	pair shift;

	% make the outline touch the bounding box
	shift = find_tangent_shift (((w, -d) -- (w, h)), outline,
				    (b, 0), (-b, 0));
	outline := outline shifted shift;

	fill outline;

	labels (1, 2, 3, 4, 5);
fet_endchar;


%%%%%%%%
%
%
%
% EDITIO VATICANA
%
%
%
fet_beginchar ("Ed. Vat. Flat" , "vaticanaM1");
	z1 = (0.00 staff_space, +0.80 staff_space);
	z2 = (0.00 staff_space, -0.08 staff_space);
	z3 = (0.25 staff_space, -0.23 staff_space);
	z4 = (0.50 staff_space, -0.24 staff_space);
	z5 = (0.50 staff_space, +0.03 staff_space);
	z6 = (0.25 staff_space, +0.20 staff_space);
	z7 = (0.15 staff_space, +0.26 staff_space);

	save pat, ellipse, T;
	path pat, ellipse;
	transform T;

	T := identity xscaled 0.50 linethickness
		      yscaled 0.22 staff_space;
	pickup pencircle transformed T;
	ellipse := fullcircle transformed T;

	pat := z1
	       -- z2{down}
	       ... z3
	       ... {up}z4
	       -- z5{up}
	       .. z6
	       .. z7;

	% the original envelope curve created with `draw' contains
	% cusps which we avoid
	fill get_subpath (ellipse, up, down, z1)
	     -- get_subpath (ellipse, down, direction 1.1 of pat, z2)
	     ... bot z3
	     ... get_subpath (ellipse, direction 2.9 of pat, up, z4)
	     -- get_subpath (ellipse, up, direction 4.1 of pat, z5)
	     .. top z6
	     .. get_subpath (ellipse,
			     direction 6 of pat, -direction 6 of pat, z7)
	     .. bot z6
	     .. {down}bot lft z5
	     -- top lft z4{down}
	     ... top z3
	     ... top rt z2{up}
	     -- cycle;

	set_char_box (0.00 staff_space# + 0.25 linethickness#,
		      0.50 staff_space# + 0.25 linethickness#,
		      0.23 staff_space# + 0.11 staff_space#,
		      0.80 staff_space# + 0.11 staff_space#);

	labels (1, 2, 3, 4, 5, 6, 7);
fet_endchar;


fet_beginchar ("Ed. Vat. Natural" , "vaticana0");
	save ellipse, T;
	path ellipse;
	transform T;

	T := identity xscaled 0.80 linethickness
		      yscaled 0.22 staff_space;
	pickup pencircle transformed T;
	ellipse := fullcircle transformed T;

	z1 = (0.00 staff_space, +0.65 staff_space);
	z2 = (0.00 staff_space, -0.35 staff_space);

	fill get_subpath (ellipse, up, down, z1)
	     -- get_subpath (ellipse, down, up, z2)
	     -- cycle;

	pickup penrazor scaled 0.22 staff_space
			rotated 90;

	z3 = (0.00 staff_space, -0.30 staff_space);
	z4 = (0.40 staff_space, -0.08 staff_space);

	draw z3
	     -- z4;

	addto currentpicture also currentpicture
	  xscaled -1
	  yscaled -1
	  shifted (0.40 staff_space, 0.0 staff_space);

	set_char_box (0.00 staff_space# + 0.40 linethickness#,
		      0.40 staff_space# + 0.40 linethickness#,
		      0.65 staff_space# + 0.11 staff_space#,
		      0.65 staff_space# + 0.11 staff_space#);

	labels (1, 2, 3, 4);
fet_endchar;


%%%%%%%%
%
%
%
% MENSURAL NOTATION
%
%
%
fet_beginchar ("Mensural Sharp" , "mensural1");
	save stemthick;

	define_pixels (stemthick);

	stemthick# = linethickness#;

	save circle, pat, T;
	path circle, pat;
	transform T;

	T := identity scaled 0.8 stemthick;
	pickup pencircle transformed T;
	circle := fullcircle transformed T;

	z1 = 0.4 staff_space * (0.8, 1);
	z1 = -z2;

	pat := get_subpath (circle, z1 - z2, z2 - z1, z1)
	       -- get_subpath (circle, z2 - z1, z1 - z2, z2)
	       -- cycle;

	fill pat;
	fill pat xscaled -1;
	fill pat shifted (0.20 staff_space, 0);
	fill pat xscaled -1 shifted (0.20 staff_space, 0);

	set_char_box (0.8 * 0.4 staff_space# + 0.4 stemthick#,
		      (0.8 * 0.4 + 0.2) * staff_space# + 0.4 stemthick#,
		      0.4 staff_space# + 0.4 stemthick#, 
		      0.4 staff_space# + 0.4 stemthick#);

	labels (1, 2);
fet_endchar;


fet_beginchar ("Mensural Flat" , "mensuralM1");
	save stemthick;

	define_pixels (stemthick);

	stemthick# = linethickness#;

	save ellipse, pat, outline, T;
	path ellipse, pat, outline;
	transform T;

	T := identity xscaled 1.4 stemthick
		      yscaled 0.6 stemthick
		      rotated 45;
	pickup pencircle transformed T;
	ellipse := fullcircle transformed T;

	z1 = (0.00 staff_space, +1.80 staff_space);
	z2 = (0.00 staff_space, -0.25 staff_space);
	z3 = (0.35 staff_space, -0.25 staff_space);
	z4 = (0.35 staff_space, +0.25 staff_space);
	z5 = (0.00 staff_space, +0.25 staff_space);

	pat := z2
	       .. z3
	       .. z4
	       .. z5;

	save dirs, s;
	pair dirs[];

	s := 1/4;

	% we approximate `draw pat'
	for i = 2 step s until (length pat + 2):
		dirs[i] := direction (i - 2) of pat;
	endfor;

	outline := get_subpath (ellipse, up, down, z1)
		   -- get_subpath (ellipse, down, dirs2, z2)
		   for i = (2 + s) step s until (length pat + 2 - s):
			   .. get_subpoint (ellipse, dirs[i],
					      point (i - 2) of pat)
		   endfor
		   .. top z5
		   -- bot z5
		   for i = (length pat + 2 - s) step -s until 2:
			   .. get_subpoint (ellipse, -dirs[i],
					    point (i - 2) of pat)
		   endfor
		   -- get_subpoint (ellipse, up, z2)
		   -- cycle;

	fill outline;

	set_char_box (0.00 staff_space# + 0.75 stemthick#,
		      0.40 staff_space# + 0.75 stemthick#,
		      0.25 staff_space# + 0.75 stemthick#,
		      1.80 staff_space# + 0.75 stemthick#);

	labels (1, 2, 3, 4, 5);
fet_endchar;


fet_beginchar ("Hufnagel Flat" , "hufnagelM1");
	save stemthick;

	define_pixels (stemthick);

	stemthick# = linethickness#;

	save ellipse, pat, T;
	path ellipse, pat;
	transform T;

	T := identity xscaled 2.4 stemthick
		      yscaled 0.4 stemthick
		      rotated 45;
	pickup pencircle transformed T;
	ellipse := fullcircle transformed T;

	z1 = (0.00 staff_space, +1.80 staff_space);
	z2 = (0.00 staff_space, -0.15 staff_space);
	z3 = (0.25 staff_space, -0.30 staff_space);
	z4 = (0.50 staff_space, +0.00 staff_space);
	z5 = (0.30 staff_space, +0.30 staff_space);
	z6 = (0.00 staff_space, +0.15 staff_space);

	pat := z3
	       .. z4
	       .. z5;

	save t;
	numeric t[];

	% we have to find the envelope intersections (if any)
	t1 = find_envelope_cusp (reverse ellipse, pat, 1/256) + 3;
	if t1 < 3:
		t1 := 3;
	fi;
	t2 = find_envelope_cusp (ellipse, reverse pat, 1/256);
	if t2 < 0:
		t2 := 3;
	else:
		t2 := length pat - t2 + 3;
	fi;

	save dirs, s;
	pair dirs[];

	s := 1/8;

	% we approximate `draw pat'
	for i = 3 step s until 5:
		dirs[i] := direction (i - 3) of pat;
	endfor;

	fill get_subpath (ellipse, up, down, z1)
	     -- get_subpath (ellipse, down, z3 - z2, z2)
	     -- get_subpoint (ellipse, z3 - z2, z3)
	     for i = 3 step s until 5:
		     .. get_subpoint (ellipse, dirs[i],
				      point (i - 3) of pat)
	     endfor
	     .. get_subpoint (ellipse, z6 - z5, z5)
	     -- get_subpoint (ellipse, z6 - z5, z6)
	     -- get_subpoint (ellipse, z5 - z6, z6)
	     -- get_subpoint (ellipse, z5 - z6, z5)
	     -- get_subpoint (ellipse, -dirs[5], z5)
	     for i = (5 - s) step -s until t2:
		     .. get_subpoint (ellipse, -dirs[i],
				      point (i - 3) of pat)
	     endfor
	     .. get_subpoint (ellipse, -direction (t2 - 3) of pat,
			      point (t2 - 3) of pat)
	     -- get_subpoint (ellipse, -direction (t1 - 3) of pat,
			      point (t1 - 3) of pat)
	     for i = (floor ((t1 - 3) / s) * s + 3) step -s until (3 + s):
		     .. get_subpoint (ellipse, -dirs[i],
				      point (i - 3) of pat)
	     endfor
	     .. get_subpoint (ellipse, -dirs[3], z3)
	     -- get_subpoint (ellipse, z2 - z3, z3)
	     -- get_subpoint (ellipse, z2 - z3, z2)
	     -- get_subpoint (ellipse, up, z2)
	     -- cycle;

%	draw z1
%	     -- z2
%	     -- pat
%	     -- z6;

	set_char_box (0.00 staff_space# + 1.0 stemthick#,
		      0.50 staff_space# + 1.0 stemthick#,
		      0.30 staff_space# + 0.5 stemthick#, 
		      1.80 staff_space# + 0.5 stemthick#);

	labels (1, 2, 3, 4, 5, 6);
fet_endchar;


fet_endgroup ("accidentals");
