+
+%
+% Inspired by Baerenreiter
+%
+% FIXME bulb should curve (see bass clef)
+% FIXME start (inside) should be little thinner
+% FIXME parametrise.
+%
+
+% Beste lezers, kijk,
+%
+% Een bolletje hebben we bij toeval allemaal wel eens getekend, maar begint u
+% toch eenvoudig. Eerst een eenvoudig kruis of herstellingsteken
+% en via de dubbelslag naar een voorzichtig vlaggetje, en heb geduld!
+% Ikzelf heb bijvoorbeeld over mijn eerste gave G-sleutel
+% 35 kilobyte metafont, 12 patchlevels, 0 vriendinnen en 45 dagen gedaan
+%
+def draw_gclef (expr exact_center, reduction)=
+ save reduced_il, downstroke_dir, downstroke_angle, hair, center;
+ save breapth_factor, inner_thick_end, thinness, thickness, thinnib;
+ save inner_start_angle, thinness, thinpen;
+ reduced_il# = interline# * reduction;
+ define_pixels(reduced_il);
+ pair downstroke_dir, center;
+
+ center := (hround_pixels(xpart exact_center),
+ vround_pixels(ypart exact_center));
+
+ hair = .3 stafflinethickness;
+ thinness = 1.3 stafflinethickness;
+ downstroke_dir = (14, -75);
+ breapth_factor = 11/7;
+ inner_thick_end = 45;
+ inner_start_angle = downstroke_angle - 43;
+ thickness = .4 reduced_il - hair;
+
+ thinnib = thinness - hair;
+ thinpen = thinness;
+ set_horizontal_spacing;
+
+ set_char_box(
+ left_space# +
+ -xpart exact_center + 1.0 * breapth_factor* reduced_il#,
+ right_space# +
+ xpart exact_center + .66 breapth_factor* reduced_il#,
+ -ypart exact_center + 3 * reduced_il#,
+ ypart exact_center + 5 * reduced_il#);
+
+ pickup pencircle scaled hair;
+ downstroke_angle = angle downstroke_dir;
+
+ z1 = center + whatever * dir (inner_start_angle);
+ x1 = xpart center -.28 reduced_il;
+
+ top z2r = center + (0,reduced_il + stafflinethickness/2);
+
+ x4 = xpart center - .1 reduced_il;
+ bot y4r = -(reduced_il + .5 stafflinethickness);
+
+ z3 = (z4 - center) rotated inner_thick_end + center;
+
+ z5r = (- breapth_factor, .37)* reduced_il + center;
+ penpos5(thickness, 135);
+
+ z6 = center + whatever * downstroke_dir;
+ y6 = ypart center + 2 reduced_il;
+
+ z7l - z6 = whatever *(z5- z6) ;
+ y7l = 3.5 reduced_il;
+ z8r = .4 [z9r, z7r] + 1.5 stafflinethickness * dir 52;
+
+ x9 = .7 [x10, x7r];
+ top y9l = 5 reduced_il;
+
+ y10 = 3. reduced_il;
+ y11 = -11/7 reduced_il;
+
+ y12 = ypart center - 18.5/7 reduced_il;
+ x12 = x11 - 5 /7 reduced_il;
+
+ z13 = z12 + .6 reduced_il*(-1,1);
+
+ (z10r - z10l) dotprod (unitvector downstroke_dir rotated 90) =
+ thinnib;
+
+ center - z10= whatever * downstroke_dir;
+ center - z11 = whatever * downstroke_dir;
+ center - z14 = .8 (center - z11);
+ penpos1(thinnib, inner_start_angle);
+ penpos2(thickness, 90);
+ penpos3(thinnib, -90 + inner_thick_end);
+ penpos4(thinnib, -90);
+
+
+ penpos7(thickness, 135);
+ penpos8(1.5 thinnib, - 70 + angle downstroke_dir);
+ penpos9(1.4 thickness, -80); % ugh
+ penpos10(whatever, downstroke_angle + 10);
+ penpos11(thinnib, downstroke_angle + 90);
+ penpos14(thinnib, downstroke_angle + 90);
+ penpos12(thinnib, -90);
+ penpos13(3 thinnib, 180);
+
+ filldraw z2l{right} .. z3l.. z4l{left} .. z5l{up} .. z7l{up}
+ %.. z8l
+ .. tension 1.2
+ .. z9l & z9l ..
+ {downstroke_dir}z10l --- z11l -- z11r --- z10r{- downstroke_dir}
+ .. tension .8
+ .. z9r & z9r{dir (downstroke_angle+ 40)} % ugh
+ %.. z8r
+ .. z7r{down} .. z5r{down} .. z4r{right}
+ .. z3r .. z2r{left} ..
+ tension .95 ..
+ z1r -- z1l
+ .. tension 0.85 ..cycle;
+
+ filldraw simple_serif(z1r, z1l, 90) -- cycle;
+
+ filldraw z12r{left} .. z13r{up} -- z13l{down} .. z12l{right} .. cycle;
+
+ draw_bulb(-1, z13l, lft z13r, 6/14 reduced_il, 1.0);
+
+ pickup pencircle scaled (thinpen);
+ draw z10 --- z14 .. z11 .. tension 0.85 .. z12{left};
+
+ penlabels(range 1 thru 15);
+enddef;
+
+
+fet_beginchar("G clef", "violin", "violinclef")
+ if test = 1:
+ draw_staff(-1,3);
+ fi;
+ draw_gclef((1.7 interline#,0), 1.0);
+fet_endchar;
+fet_beginchar("G clef", "violin_change", "cviolinclef")
+ draw_gclef((1.3 interline#,0), .8);
+fet_endchar;
+
+fet_endgroup("clefs");