% -*- Fundamental -*-  (emacs-20 mf mode mucks
% feta-schrift.mf --  implement scripts
% 
% source file of the Feta (defintively not an abbreviation for Font-En-Tja)
% music font
% 
% (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
%	Jan Nieuwenhuizen <janneke@gnu.org>
% 


fet_begingroup("scripts")


def draw_fermata =
  save alpha, radius, crook_thinness, crook_fatness, dot_diam;
  
	% [Wanske] and some  Baerenreiter editions
	% suggest ca 80 degrees iso half-circle
  alpha := 10;

  radius# = 1.25 interline#;
  crook_thinness# = 1.5stafflinethickness#;
  crook_fatness# = 4 stafflinethickness#;

  radius# + crook_fatness#/2 = h#;
  radius# + crook_thinness#/2 = w#;
  set_char_box(w#, w#, crook_thinness#/2, h#);
  
  define_pixels(radius, crook_thinness, crook_fatness);
  dot_diam = 4/3 crook_fatness;


  penpos1(crook_thinness, 0);
  penpos2(crook_fatness, -90);
  z1 = (-radius,0);
  z2 = (0, radius);

  fill z1l{dir (-alpha-90)}..{dir (90-alpha)}z1r..
  {right}z2r -- z2l{left} .. cycle;

  addto currentpicture also 
  currentpicture xscaled -1;

  pickup pencircle scaled dot_diam;
  x4 =0;
  bot y4 = - crook_thinness/2;
  draw z4;
enddef;

fet_beginchar("fermata up", "ufermata", "ufermata")
	draw_fermata;	
	penlabels(1,2,4);
fet_endchar;

fet_beginchar("fermata down", "dfermata", "dfermata")
	draw_fermata;
	y_mirror_char;
fet_endchar;

%
% Thumbs are used in cello music.
% TODO : thumbs should look like the finger-font and should be placed in
% the same way in the score.
%

fet_beginchar("Thumb", "thumb", "thumb")
        save thin, height, width, thick;
        height# = 5/4 width#;
        height# = interline#;
        thin = 1.2 stafflinethickness;
        thick =  2 thin;
        set_char_box(width#/2, width#/2, height#/2, height#/2);
        
	penpos1(thick, 0);
        penpos2(thin, 90);
        z1r = (w, 0);
        z2r = (0, h);
        penlabels(1,2);
        penstroke z1e{up} .. {left}z2e;
        addto currentpicture also currentpicture xscaled -1;
        addto currentpicture also currentpicture yscaled -1;

	z3 = (0, -h);
	z4 = (0, -1.5h);
	penlabels(3,4);
	draw_brush(z3,1.4*thin, z4,0.9*thick);
fet_endchar;

%
% FIXME: rounded endings
%
% `\accent' is TeX reserved.
fet_beginchar("> accent", "sforzato", "sforzatoaccent")
	set_char_box(.9 interline#, .9 interline#, .5 interline#, .5 interline#);
	save thickness, diminish;

	thickness = 3/2 stafflinethickness;
	pickup pencircle scaled thickness;

	% prevent blobs at crossing lines
	diminish = .75;

	top y1 = h;
	lft x1 = -b;
	rt x2 = w;
	y2 = .25 thickness* diminish;

	rt z4 = (w,0);
	x3 =0;
	z3 = whatever [z1, z4];

	penpos2(thickness*(2 - diminish)/2 , 90);
	penpos1(thickness, 90);
	penpos3(thickness, 90);

	draw z1 .. z3;
	draw (z1 .. z3) yscaled -1;
	draw z4;
	penstroke z3e .. z2e;
	penstroke (z3e .. z2e) yscaled -1;

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

fet_beginchar("staccato dot", "staccato", "staccato")
	save radius;
	radius# = 1.5 stafflinethickness#;
	define_pixels(radius);
	pickup pencircle scaled 2 radius;
	draw (0,0);
	set_char_box(radius#, radius#, radius#, radius#);
fet_endchar;

def draw_staccatissimo =
	save radius, height;
	height# = .8 interline#;
	radius# = 2 stafflinethickness#;
	define_pixels(radius, height);

	draw_brush((0,0), stafflinethickness, (0, height),2 radius);
	set_char_box(radius#,radius#, blot_diameter#/2, height# + radius#);
enddef;

fet_beginchar("staccatissimo/martellato up", "ustaccatissimo", 
		"ustaccatissimo")
	draw_staccatissimo;
fet_endchar;

%
% FIXEM: scale labels too.
%
fet_beginchar("staccatissimo/martellato down", "dstaccatissimo", "dstaccatissimo")
	draw_staccatissimo;
	y_mirror_char;
fet_endchar;

fet_beginchar("portato/single tenuto", "tenuto", "tenuto")
	save thick;
	thick# = 1.4 stafflinethickness#;
	define_pixels(thick);

	set_char_box(.6 interline#, .6 interline#, thick#/2,thick#/2);
	pickup pencircle scaled thick;
	lft x1 = -b;
	rt x2 = w;
	y1 = y2 = 0;
	draw z1 .. z2;
fet_endchar;


def draw_marcato = 
	save fat_factor, thinness;
	set_char_box(interline#/2, interline#/2, 0, 1.1 interline#);

	fat_factor = .3;
	thinness =  stafflinethickness;

	pickup pencircle scaled thinness;
	rt x2 = w;
	lft x5 = -b;
	bot y5 = 0;
	top y3 = h;
	y1 = y2 = y5;

	x3 =0;
	z1 - z4 = whatever * (charwd, -charht);
	z4 = fat_factor [z3, z5];

	filldraw z1 -- z2 -- z3 -- z4 -- cycle;
	draw z3 .. z5;
enddef;

fet_beginchar("marcato up", "umarcato", "umarcato")
	draw_marcato;
	labels(1,2,3,4,5);
fet_endchar;


%
% The down marcato char (not very much used). 
% Contrary to what some MF/TeX `gurus' believe
% it is *point*-symmetric with the "up" version
fet_beginchar("marcato down", "dmarcato", "dmarcato")
	draw_marcato;
	xy_mirror_char;
fet_endchar;
 

%
% used in french horn music todo
%
% TODO: too light at 20pt
fet_beginchar("open (unstopped)", "open", "ouvert")
	save thin, height, width, thick;
	height# = 5/4 width#;
	height# = interline#;
	thin = 1.2 stafflinethickness;
	thick =  1.4 thin;
	set_char_box(width#/2, width#/2, height#/2, height#/2);
	
	penpos1(thick, 0);
	penpos2(thin, 90);
	z1r = (w, 0);
	z2r = (0, h);
	penlabels(1,2);
	penstroke z1e{up} .. {left}z2e;
	addto currentpicture also currentpicture xscaled -1;
	addto currentpicture also currentpicture yscaled -1;
fet_endchar;


fet_beginchar("plus (stopped)", "stopped", "plusstop")
	save thick, size;
	thick = 2 stafflinethickness;
	size# = 1.1 interline#;

	set_char_box(size#/2, size#/2, size#/2, size#/2);
	pickup pencircle scaled thick;

	rt x1 = w;
	y1 = 0;
	z2 = -z1;

	draw z1 .. z2;
	draw (z1 .. z2) rotated 90;
fet_endchar;

%
% FIXME: blotting 
%
fet_beginchar("Upbow", "upbow", "upbow")
	save ht, wd, thick;

	thick = 1.4 stafflinethickness;
	wd# = 1.3 interline#;
	ht# = 1.6 wd#; 

	
	set_char_box(wd#/2, wd#/2, 0, ht#);
	pickup pencircle scaled thick;

	x1 = 0;
	bot y1 = 0;
	rt x2 =  w;
	top y2 = h;

	labels(1,2);
	draw z2 -- z1 -- (z2 xscaled -1);
fet_endchar;


fet_beginchar("Downbow", "downbow", "downbow")
	save stemthick, beamheight;
	save wd;
	define_pixels(wd)

	wd# = 1.5 interline#;
	stemthick = 1.2 stafflinethickness;

	set_char_box(wd#/2, wd#/2, 0, 4/3 interline#);

	beamheight = 4/10 h;


	pickup pencircle scaled blot_diameter;
	top y2 - bot y1  = beamheight;
	top y2 = h;
	rt x1 = w;
	x1 = x2;
	y2 = y3;
	y1 = y4;
	x3 = 0;
	x4 = x3;
	save p;
	path p;
	filldraw z1 -- z2 -- z3 -- z4 --cycle;

	pickup pencircle scaled stemthick;

	bot y5 =0;
	rt x5 = rt x6 = w;
	y6 = h - beamheight;
	draw z6 -- z5;
	labels(1, 2,3,4,5,6);
	addto currentpicture also currentpicture xscaled -1;
fet_endchar;

%
% Inspired by a computer-set version of Auf dem Strom by Baerenreiter. 
%

def draw_turn =
	save thin, thick, ball_diam, darkness;
	save wd, ht, thick_nibangle, ball_nib_thick;
	save turndir;
	pair turndir;

	wd# = 35/16 interline#;
	ht# = 18/17 interline#;
	darkness = 1.20 stafflinethickness;

	set_char_box(wd#/2, wd#/2, ht#/2, ht#/2);	

	thick_nibangle = 60;
	thick = 3 darkness;
	thin = darkness;
	ball_nib_thick = 2.7 darkness;
	ball_diam = ball_nib_thick + (h - ball_nib_thick) / 10;

	
	x3l = w;
	y3 = 0;
	y4l = h;
	x4 = x2;
	x2l = w/2;
	y2l = -d;
	z1 = (0,0);

	penpos1(1.1 thick, thick_nibangle);
	penpos2(thick, thick_nibangle);
	penpos3(thin, 180);
	penpos4(ball_nib_thick, -90);

	path swoosh, ploop;
	swoosh :=  z1l{curl 0} .. z2l .. z3l{up} .. {left}z4l 
	  -- z4r .. z3r{down} .. z2r{left} ;
	fill swoosh .. (swoosh scaled -1) .. cycle;

	x5r = x4;
	y5r = y4l - ball_diam /2;
	z6r = z5r;

	penpos5(1.6 ball_diam/2, 10);
	penpos6(ball_diam/2, 150);

	ploop := z4l{left} .. z5l .. z6l -- cycle;
	fill ploop;
	fill ploop scaled -1;


enddef;

fet_beginchar("Reverse turn","reverseturn","reverseturn")
	draw_turn;
	currentpicture := currentpicture yscaled -1;
	penlabels(5,6,7);
	penlabels(2,3,4);
fet_endchar;


fet_beginchar("Turn","turn","turn")
	draw_turn;
		
	penlabels(5,6,7);
	penlabels(1,2,3,4);
fet_endchar;



%
% Inspired by a (by now) PD edition of Durand & C'ie edition of 
% Saint-Saens' Celloconcerto no. 1 
%
% FIXME take out hardcoded vars.
% FIXME the two loops on the `t' should be smoother (and the left one bigger).
% FIXME generic macros for serifs: top of the t and bottom of r
%
% 

fet_beginchar("Trill (`tr')","trill","trill")
	
	save start_nib_angle,  ascender_extra, ex, hair_thick, fatness,
	  slant_angle, slant, t_fatness, r_fatness, kerning, t_overshoot, 
	  uitschieter, bulb_size;
	;
	pair slant_vec;

	ascender_extra# = 1/2 ex#;
	ascender# = ascender_extra# + ex#;
	ex# = 1.5 interline#;
	kerning# = .75 ex#;
	start_nib_angle = 20;
	bulb_size = 0.47;
	define_pixels(ex, ascender_extra, ascender, kerning);

	t_overshoot = 0.03 ex;
	fatness = 12/40 ex;
	t_fatness = 8/10 fatness;
	r_fatness = .75 fatness;
	uitschieter = 21/40 ex;
	hair_thick =  blot_diameter;

	slant = .2;

	local_copy(transform)(currenttransform);
	currenttransform := currenttransform slanted slant shifted (- interline, 0)  ;

	y1 = ascender;
	x1l = 0;
	x1r = t_fatness;
	penpos1(start_nib_wid, start_nib_angle);
	
	z2 = (x1, 7/18 ex);
	penpos2(start_nib_wid, start_nib_angle);

	z3l = (11/10 t_fatness, - t_overshoot);

	z4l = (13/6 t_fatness, 5/16 ex);
	penpos4(hair_thick, 180);

	1.9 [z3l, z3r] = z4r;
	z3 = .5 [z3l, z3r];
	
	save t_p, krul_p;
	path t_p, krul_p, r_p;


	t_p := z1l -- z2l{down} .. tension (1 + .5 slant)
		.. z3l{right} 
		
		.. z4l{up} -- z4r{down} 
		.. z3r{left} .. z2r{up} .. z1r -- cycle;
	fill t_p ;

	krul_ang = 32;

	pickup pencircle scaled hair_thick;

	z5 = (t_fatness/2, 2/3 ex);
	
	lft x6 = - uitschieter;
	y6 =  y5 - 1/20 ex;

	z7 = z5 + whatever*dir krul_ang;
	up_angle = krul_ang;
	% angle (z7-z5)
	x7 = 5/10 kerning + x5;
	
	penpos7(hair_thick, up_angle + 90);

	
	x8l = .7 [x9r, x7r];
	y8l = y7l;
	penpos8(2 hair_thick, (up_angle +90)/2);

	y9 = 3/4 ex;
	x9 = x1 + kerning;
	penpos9(r_fatness, 0);

	x10 = x9;
	y10 = 0;
	penpos10(r_fatness, 0);

	krul_p := z4{up} .. tension 1.1  .. z5 
		.. tension 1 and .75 .. {down}z6
		.. tension .85 and 1.1 .. z5 --- z7;
	draw krul_p;
	r_p := z7l{z7-z5} .. z8l{right} .. z9l{down} --- z10l -- z10r
		--- z9r{up} 
		..  z8r{left} ..  z7r{z5-z7} -- cycle;
	fill r_p;
	set_char_box(interline# , interline#, 0,ascender#);


	penpos11(1/4 r_fatness, -20);
	z11r = z9r;
	
	z13 = (x9 + 2 r_fatness, y11 );
	penpos13(r_fatness, 180);
	fill z11r{dir 70} .. z13r{down} -- z13l{up} .. z11l{dir 250} -- cycle;
	penlabels(range 1 thru 15);


	draw_bulb(-1, z13r, z13l, bulb_size * r_fatness, 1.5);
fet_endchar;


def draw_heel =
	save radius, thickness, wall;

	radius# := .5 interline#;

	define_pixels(radius);
	set_char_box(radius#, radius#, radius#, 2/3 interline#);

	thickness := 1.5 stafflinethickness;	
	pickup pencircle scaled thickness;
	rt x1 = b;
	top y1 = h;
	
	x2 =x1;
	y2 = 0;

	x3 = 0;
	bot y3 = -d;

	draw z1{down} .. z2{down} .. z3{left};
	addto currentpicture also currentpicture xscaled -1;
	
enddef;


fet_beginchar("left heel", "upedalheel", "upedalheel")
	draw_heel;
	labels(1,2,3);
fet_endchar;

fet_beginchar("right heel", "dpedalheel", "dpedalheel")
	draw_heel;
	y_mirror_char;
fet_endchar;

def draw_toe =
	save ht,wd;

	thickness := 1.5 stafflinethickness;
	ht# := 1.5 interline#;
	wd# := 1/3 ht#;
	define_pixels(ht,wd);


	set_char_box(wd#, wd#, 0, ht#);
	
	pickup pencircle scaled thickness;
	lft x1 = -b;
	bot y1 = 0;
	x2 =0;
	top y2 = h;
	z3 = z1 xscaled -1;


	draw z1 -- z2 -- z3;

enddef;
	
fet_beginchar("left toe", "upedaltoe", "upedaltoe")
	draw_toe;
	labels(1,2,3);
fet_endchar;
fet_beginchar("right toe", "dpedaltoe", "dpedaltoe")
	draw_toe;
	y_mirror_char;
fet_endchar;

fet_beginchar("Flageolet", "flageolet", "flageolet")
	save height,width,thickness;
	height#=4/15 staffsize#;
	width#=height#;
	thickness#=blot_diameter#;
	define_pixels(height,width,thickness);
	set_char_box(width#/2,width#/2,height#/2,height#/2);
	
	pickup pencircle scaled thickness;
	x1= .5 [x2, x4];
	x1 = 0;
	top y1=height/2;
	rt x4  - lft x2 =width; 
	y2 = 0;
	y4=y2;
	x3=x1;
	bot y3=-height/2;

	penlabels(1,2,3,4);
	draw z1..z2..z3..z4..cycle;
fet_endchar;

fet_beginchar("Repeatsign", "repeatsign", "repeatsign")
	set_char_box(interline#, interline#, interline#, interline#);

	save dot_diam;
	2 dot_diam# = interline# - stafflinethickness#;
	define_pixels(dot_diam);

	penpos1(dot_diam,0);
	z1l=(-b,-d);
	penpos2(dot_diam,0);
	z2r=(w,h);
	filldraw z1l--z2l{right}--z2r{down}--z1r{right}--cycle;
        penlabels (1,2);

	pickup pencircle scaled dot_diam;
        draw (-interline/2, interline/2);
        draw (interline/2, -interline/2);
fet_endchar;

fet_beginchar("Segno", "segno", "segno")
	save thin, thick, ball_diam, darkness, pointheight;
	save wd, ht, thick_nibangle, ball_nib_thick;
	save turndir;
	pair turndir;

	ht# = 3 interline#;
	wd# = 2 interline#;
	darkness = 1.20 stafflinethickness;

	set_char_box(wd#/2, wd#/2, ht#/2, ht#/2);	

	thick_nibangle = 30;
	thick = 3 darkness;
	thin = darkness;
	ball_nib_thick = 2.7 darkness;
	ball_diam = ball_nib_thick + (w - ball_nib_thick) / 10;
	pointheight = 2 stafflinethickness;
	
	y3l = h;
	2 x3 = x2 + x4;
	x4 = 0;
	y4 = y2;
	y2l = .6 h;
	x2l = -b;
	z1 = (0,0);

	penpos1(thick, 2 thick_nibangle);
	penpos2(thick, thick_nibangle);
	penpos3(thin, -90);
	penpos4(ball_nib_thick, 180-thick_nibangle);

	path swoosh, ploop;
	swoosh :=  z1l{curl 0} .. z2l .. z3l{right} .. {down}z4l 
	  -- z4r .. z3r{left} .. z2r{down} ;
	fill swoosh .. (swoosh scaled -1) .. cycle;
	penlabels(1,2,3,4);

	y5r = y4;
	x5r = x4l - ball_diam /2;
	z6r = z5r;

	penpos5(1.6 ball_diam/2, 100);
	penpos6(ball_diam/2, 240);

	ploop := z4l{down} .. z5l .. z6l -- cycle;
	fill ploop;
	fill ploop scaled -1;
	penlabels(4,5,6);

	penpos7(2 thin,0);
	z7l=(-b,-d);
	penpos8(2 thin,0);
	z8r=(w,h);
	filldraw z7l--z8l{right}--z8r{down}--z7r{right}--cycle;
	pickup pencircle scaled 2 thin;
	draw (-x2r,pointheight);
	draw (x2r,-pointheight);
fet_endchar;

fet_beginchar("Coda", "coda", "coda")
	save thin, thick, codawidth, codaheight;
	thin# = 1.2 stafflinethickness#;
	thick# = 3.5 stafflinethickness#;
	codawidth# = 2/3 interline#;
	codaheight# = 1 interline#;
	define_pixels(thin, thick, codawidth, codaheight);

	set_char_box(codawidth#+thick#, codawidth#+thick#,
		codaheight#+thick#, codaheight#+thick#);

	penpos1(thick,0);
	penpos2(thin,-90);
	penpos3(thick,180);
	x1l=-codawidth;
	y2l=codaheight;
	y1=0;
	x2=0;
	z3 = - z1;
	penlabels(1,2,3);

	path halfcoda;
	halfcoda := z1l{up} .. z2l{right} .. z3l{down} -- 
		z3r{up} .. z2r{left} .. z1r{down} .. cycle;
	fill halfcoda;
	fill (halfcoda scaled -1);

	pickup pencircle scaled thin;
	draw (0,-h) -- (0,h);
	draw (-w,0) -- (w,0);

fet_endchar;

input feta-slag;
input feta-accordion;

fet_endgroup("scripts");

