% Feta (not the Font-En-Tja) music font -- ancient note heads
% This file is part of LilyPond, the GNU music typesetter.
%
-% Copyright (C) 2001--2010 Juergen Reuter <reuter@ipd.uka.de>
+% Copyright (C) 2001--2012 Juergen Reuter <reuter@ipd.uka.de>
%
% Neo-mensural heads originally by
% Christian Mondrup and Mats Bengtsson
%
-%
% LilyPond is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
%
% TODO: should depth/height include appendages/stems?
+save overdone_heads, noteheight;
+
overdone_heads = 0;
noteheight# := staff_space# + (1 + overdone_heads) * stafflinethickness#;
define_pixels (noteheight);
%
%
%
-% MENSURAL NOTATION
+% NEO-MENSURAL NOTATION
%
%
%
-def draw_neomensural_brevis (expr brevwid) =
- save beamheight, head_width;
- save holeheight, stem_width;
- save serif_size, serif_protrude;
+def draw_neomensural_brevis (expr brevwid, holeheight, open, full) =
+ save beamheight, head_width, head_height;
+ save stem_width, serif_size, serif_protrude;
- head_width# = brevwid;
- holeheight = 3 stafflinethickness;
- stem_width = 1.4 stafflinethickness;
+ head_width# := brevwid;
+ head_height# := noteheight#;
+ stem_width := 1.3 linethickness;
- define_pixels (head_width);
+ define_pixels (head_width, head_height);
set_char_box (0, head_width#,
- noteheight# / 2, noteheight# / 2);
+ head_height# / 2, head_height# / 2);
- 2 beamheight + holeheight = noteheight;
- serif_size = (holeheight - stafflinethickness) / 2;
- serif_protrude = 1.5 serif_size;
+ 2 beamheight + holeheight = head_height;
+ serif_size := blot_diameter;
+ serif_protrude := .15 head_height;
z1l = (0, 0);
- z2l = (0, -stafflinethickness / 2);
+ z2l = (0, - (holeheight - 2 serif_size) / 2);
z3r = z2r + serif_size * (1, -1);
y4r = y3r;
x4r = head_width / 2;
penpos4 (beamheight, 90);
penpos5 (stem_width, 180);
- save pat_in, pat_out;
- path pat_in, pat_out;
+ save pat_out;
+ path pat_out;
pat_out := z4l
-- z3l{left}
-- cycle;
fill pat_out;
- pat_in := z4r
- -- z3r{left}
- .. z2r{up}
- -- z1r;
- pat_in := pat_in
- -- reverse pat_in yscaled -1;
- pat_in := pat_in
- -- reverse pat_in shifted (-x4r, 0)
- xscaled -1
- shifted (x4l, 0)
- -- cycle;
- unfill pat_in;
+ if open:
+ save pat_in;
+ path pat_in;
+
+ pat_in := z4r
+ -- z3r{left}
+ .. z2r{up}
+ -- z1r;
+ pat_in := pat_in
+ -- reverse pat_in yscaled -1;
+ if full:
+ pat_in := pat_in
+ -- reverse pat_in shifted (-x4r, 0)
+ xscaled -1
+ shifted (x4l, 0);
+ fi;
+ pat_in := pat_in
+ -- cycle;
+ unfill pat_in;
+ fi;
penlabels (1, 2, 3, 4, 5);
enddef;
-%%% This head does not seem to be used anywhere. Junk me? -- jr
-def draw_neomensural_left_stemmed_head (expr wid) =
- draw_neomensural_brevis (wid);
-
- x6 = x7 = stem_width / 2;
- y6 = y5;
- y7 = y5 - 2.25 staff_space;
-
- z17 = (x7, y7 - stem_width / 2);
-
- penpos6 (stem_width, 0);
- penpos7 (stem_width, 0);
-
- fill z7l
- -- z6l
- -- z6r
- -- z7r
- .. z17
- .. cycle;
-
- penlabels (6, 7);
- labels (17);
-enddef;
-
-
-%%% This head does not seem to be used anywhere. Junk me? -- jr
-fet_beginchar ("Left stemmed notehead", "slneomensural");
- draw_neomensural_left_stemmed_head (2 staff_space#);
-fet_endchar;
-
-
%
% Some sources (eg. Musix/OpusTeX) think that the appendage should be on
% the left, some say right. Right wins democratically.
%
-def draw_neomensural_longa (expr wid) =
- draw_neomensural_brevis (wid);
+def draw_neomensural_longa (expr wid, holeheight, direction) =
+ draw_neomensural_brevis (wid, holeheight, true, true);
- save theta;
+ save theta, dir;
+ dir := -direction;
- x7r = head_width;
- y7 = y5;
- z6 - z7 = (stem_width / 2, -staff_space);
- theta = angle (z6 - z7) + 90;
+ x7 = head_width - stem_width / 2;
+ y7 = dir * y5;
+ z6 - z7 = (stem_width / 2, -dir * staff_space);
+ theta = dir * angle (z6 - z7) + 90;
penpos7 (stem_width, 0);
penpos6 (1.2 stem_width, theta);
enddef;
-%
-% En wij presenteren U: de opvolgster van Emily
-%
-% (ze is wel breed)
-%
-fet_beginchar ("Neo-mensural maxima notehead", "sM3neomensural");
- draw_neomensural_longa (2.6 staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Neo-mensural longa notehead", "sM2neomensural");
- draw_neomensural_longa (2 staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Neo-mensural brevis notehead", "sM1neomensural");
- draw_neomensural_brevis (2 staff_space#);
-fet_endchar;
-
-
-def draw_neomensural_black_head (expr wid, height) =
- save head_width;
+def draw_neomensural_black_head (expr width, height) =
+ save head_width, head_height, stem_width;
save ne, nw, ne_dist, nw_dist;
pair ne, nw, ne_dist, nw_dist;
- head_width# = wid;
+ head_width# := width;
+ head_height# := height;
+ stem_width# := 1.3 linethickness#;
set_char_box (0, head_width#,
- height / 2, height / 2);
+ head_height# / 2, head_height# / 2);
charwx := head_width# / 2;
- charwy := height / 2;
+ charwy := head_height# / 2 - 2 stem_width#;
y3 = y1 = 0;
- x2 = x4 = (x1 + x3) / 2;
+ x2 = x4 = 1/2 [x1, x3];
pickup pencircle scaled blot_diameter;
rt x3 = w;
ne := unitvector (z2 - z1);
- nw_dist := (ne rotated 90) * 0.5 blot_diameter;
+ nw_dist := (ne rotated 90) * blot_diameter / 2;
nw := unitvector (z2 - z3);
- ne_dist := (nw rotated -90) * 0.5 blot_diameter;
-
- fill lft z1{up}
- .. (z1 + nw_dist){ne}
- -- (z2 + nw_dist){ne}
- .. top z2{right}
- .. (z2 + ne_dist){-nw}
- -- (z3 + ne_dist){-nw}
- .. rt z3{down}
- .. (z3 - nw_dist){-ne}
- -- (z4 - nw_dist){-ne}
- .. bot z4{left}
- .. (z4 - ne_dist){nw}
- -- (z1 - ne_dist){nw}
+ ne_dist := (nw rotated -90) * blot_diameter / 2;
+
+ fill lft z1
+ .. (z1 + nw_dist)
+ -- (z2 + nw_dist)
+ .. top z2
+ .. (z2 + ne_dist)
+ -- (z3 + ne_dist)
+ .. rt z3
+ .. (z3 - nw_dist)
+ -- (z4 - nw_dist)
+ .. bot z4
+ .. (z4 - ne_dist)
+ -- (z1 - ne_dist)
.. cycle;
labels (1, 2, 3, 4);
enddef;
-def draw_neomensural_open_head (expr wid, height)=
- draw_neomensural_black_head (wid, height);
+def draw_neomensural_open_head (expr width, height)=
+ draw_neomensural_black_head (width, height);
- save diamNW, diamSW;
+ save headNW, headSW, stem_width;
- diamNW = length (z2 - z1) + blot_diameter;
- diamSW = length (z4 - z1) + blot_diameter;
+ headNW = length (z2 - z1) + blot_diameter;
+ headSW = length (z4 - z1) + blot_diameter;
+ stem_width = 1.3 linethickness;
save hole_widthNW, hole_widthSW;
- hole_widthNW = 0.34 diamNW ;
- hole_widthSW + 2.6 linethickness = diamSW;
-
- (z7 + z5) / 2 = (w / 2, 0);
- (z8 + z6) / 2 = (w / 2, 0);
- z6 - z5 = hole_widthNW * unitvector (z2 - z1);
- z7 - z6 = hole_widthSW * unitvector (z4 - z1);
-
- unfill z5
- -- z6
- -- z7
- -- z8
- -- cycle;
+ hole_widthNW = .25 headNW;
+ hole_widthSW + 2 stem_width = headSW;
+
+ (rt z7 + lft z5) / 2 = (w / 2, 0);
+ (bot z8 + top z6) / 2 = (w / 2, 0);
+ z6 - z5 = (hole_widthNW - blot_diameter) * unitvector (z2 - z1);
+ z7 - z6 = (hole_widthSW - blot_diameter) * unitvector (z4 - z1);
+
+ unfill lft z5
+ .. (z5 + nw_dist)
+ -- (z6 + nw_dist)
+ .. top z6
+ .. (z6 + ne_dist)
+ -- (z7 + ne_dist)
+ .. rt z7
+ .. (z7 - nw_dist)
+ -- (z8 - nw_dist)
+ .. bot z8
+ .. (z8 - ne_dist)
+ -- (z5 - ne_dist)
+ .. cycle;
labels (5, 6, 7, 8);
enddef;
%
-% WL says the thin lines should be thinner.
+% Neo-mensural maxima/longa/brevis
%
-fet_beginchar ("Harmonic notehead (Neo-mensural open)", "s0harmonic");
- draw_neomensural_open_head (1.3 staff_space#, 1.3 noteheight#);
- charwx := head_width#;
- charwy := 0;
+% En wij presenteren U: de opvolgster van Emily
+%
+% (ze is wel breed)
+%
+
+save nm_maxima_width, nm_longa_width, nm_brevis_width;
+save nm_holeheight, nm_red_holeheight;
+
+nm_maxima_width := 2.6 staff_space#;
+nm_longa_width := 2 staff_space#;
+nm_brevis_width := nm_longa_width;
+nm_holeheight := 4 linethickness;
+nm_red_holeheight := 2.5 linethickness;
+
+fet_beginchar ("Neo-mensural maxima notehead (up)", "uM3neomensural");
+ draw_neomensural_longa (nm_maxima_width, nm_holeheight, 1);
fet_endchar;
+fet_beginchar ("Neo-mensural maxima notehead (down)", "dM3neomensural");
+ draw_neomensural_longa (nm_maxima_width, nm_holeheight, -1);
+fet_endchar;
-fet_beginchar ("Harmonic notehead (Neo-mensural black)", "s2harmonic");
- draw_neomensural_black_head (1.3 staff_space#, 1.3 noteheight#);
- charwx := head_width#;
- charwy := 0;
+fet_beginchar ("Neo-mensural longa notehead (up)", "uM2neomensural");
+ draw_neomensural_longa (nm_longa_width, nm_holeheight, 1);
fet_endchar;
+fet_beginchar ("Neo-mensural longa notehead (down)", "dM2neomensural");
+ draw_neomensural_longa (nm_longa_width, nm_holeheight, -1);
+fet_endchar;
-fet_beginchar ("Neo-mensural semibrevis head", "s0neomensural");
- draw_neomensural_open_head (staff_space#, noteheight#);
+fet_beginchar ("Neo-mensural brevis notehead", "sM1neomensural");
+ draw_neomensural_brevis (nm_brevis_width, nm_holeheight, true, true);
fet_endchar;
+fet_beginchar ("Neo-mensural maxima notehead (up, reduced hole)", "urM3neomensural");
+ draw_neomensural_longa (nm_maxima_width, nm_red_holeheight, 1);
+fet_endchar;
-fet_beginchar ("Neo-mensural minima head", "s1neomensural");
- draw_neomensural_open_head (staff_space#, noteheight#);
+fet_beginchar ("Neo-mensural maxima notehead (down, reduced hole)", "drM3neomensural");
+ draw_neomensural_longa (nm_maxima_width, nm_red_holeheight, -1);
fet_endchar;
+fet_beginchar ("Neo-mensural longa notehead (up, reduced hole)", "urM2neomensural");
+ draw_neomensural_longa (nm_longa_width, nm_red_holeheight, 1);
+fet_endchar;
-fet_beginchar ("Neo-mensural semiminima head", "s2neomensural");
- draw_neomensural_black_head (staff_space#, noteheight#);
+fet_beginchar ("Neo-mensural longa notehead (down, reduced hole)", "drM2neomensural");
+ draw_neomensural_longa (nm_longa_width, nm_red_holeheight, -1);
fet_endchar;
+fet_beginchar ("Neo-mensural brevis notehead (reduced hole)", "srM1neomensural");
+ draw_neomensural_brevis (nm_brevis_width, nm_red_holeheight, true, true);
+fet_endchar;
-def draw_mensural_brevis (expr wid) =
- % TODO. For the moment, fall back to draw_neomensural_brevis.
- draw_neomensural_brevis (wid);
-enddef;
+%
+% Neo-mensural semibrevis/minima/semiminima
+%
-%%% This head does not seem to be used anywhere. Junk me? -- jr
-def draw_mensural_left_stemmed_head (expr wid) =
- draw_mensural_brevis (wid);
+save nm_height, nm_width;
+nm_height := noteheight#;
+nm_width := staff_space#;
+fet_beginchar ("Neo-mensural semibrevis head", "s0neomensural");
+ draw_neomensural_open_head (nm_width, nm_height);
+fet_endchar;
- x6 = x7 = stem_width / 2;
- y6 = y5;
- y7 = y5 - 2.25 staff_space;
+fet_beginchar ("Neo-mensural minima head", "s1neomensural");
+ draw_neomensural_open_head (nm_width, nm_height);
+fet_endchar;
- z17 = (x7, y7 - stem_width / 2);
+fet_beginchar ("Neo-mensural semiminima head", "s2neomensural");
+ draw_neomensural_black_head (nm_width, nm_height);
+fet_endchar;
- penpos6 (stem_width, 0);
- penpos7 (stem_width, 0);
+%%%%%%%%
+%
+%
+%
+% HARMONIC NOTATION
+%
+%
+%
- fill z7l
- -- z6l
- -- z6r
- -- z7r
- .. z17
- .. cycle;
+%
+% WL says the thin lines should be thinner.
+%
- penlabels (6, 7);
- labels (17);
+fet_beginchar ("Harmonic notehead (Neo-mensural open)", "s0harmonic");
+ draw_neomensural_open_head (1.3 staff_space#, 1.3 noteheight#);
+ charwx := head_width#;
+ charwy := 0;
+fet_endchar;
+
+fet_beginchar ("Harmonic notehead (Neo-mensural black)", "s2harmonic");
+ draw_neomensural_black_head (1.3 staff_space#, 1.3 noteheight#);
+ charwx := head_width#;
+ charwy := 0;
+fet_endchar;
+
+
+%%%%%%%%
+%
+%
+%
+% MENSURAL/PETRUCCI NOTATIONS
+%
+%
+%
+
+def draw_mensural_brevis (expr wid, holeheight, open, full) =
+ % TODO. For the moment, fall back to draw_neomensural_brevis.
+ draw_neomensural_brevis (wid, holeheight, open, full);
enddef;
-def draw_mensural_longa (expr wid) =
- draw_mensural_brevis (wid);
+def draw_mensural_longa (expr wid, holeheight, open, full, direction, ligature) =
+ draw_mensural_brevis (wid, holeheight, open, full);
+
+ save dir;
+ dir := -direction;
x6 = x7 = head_width - stem_width / 2;
- y6 = y5;
- y7 = y5 - 2.25 staff_space;
+ y6 = dir * y5;
+ y7 = dir * y5 -1.75 dir * staff_space;
- z17 = (x7, y7 - stem_width / 2);
+ z17 = (x7, y7 - dir * stem_width / 2);
penpos6 (stem_width, 0);
- penpos7 (stem_width, 0);
+ if ligature:
+ penpos7 (stem_width, 0);
+ else:
+ penpos7 (1.5 stem_width, 0);
+ fi;
fill z7l
-- z6l
enddef;
-%%% This head does not seem to be used anywhere. Junk me? -- jr
-fet_beginchar ("Mensural left stemmed notehead", "slmensural");
- draw_mensural_left_stemmed_head (staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Mensural maxima notehead", "sM3mensural");
- draw_mensural_longa (2.0 staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Mensural longa notehead", "sM2mensural");
- draw_mensural_longa (staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Mensural brevis notehead", "sM1mensural");
- draw_mensural_brevis (staff_space#);
-fet_endchar;
-
-
def draw_diamond_head (expr head_h, pen_w, pen_h, angle, open) =
save head_width, head_height;
save ellipse, ellipse_r;
head_height# / 2, head_height# / 2);
charwx := head_width# / 2;
- charwy := head_height# / 2 - linethickness#;
+ charwy := head_height# / 2 - 2 linethickness#;
define_pixels (head_width, head_height);
enddef;
+%
+% Mensural/Petrucci maxima/longa/brevis
+%
+
+save m_maxima_width, m_longa_width, m_brevis_width,
+ m_holeheight, m_red_holeheight;
+m_maxima_width := 2.0 staff_space#;
+m_longa_width := staff_space#;
+m_brevis_width := m_longa_width;
+m_holeheight := nm_holeheight;
+m_red_holeheight := nm_red_holeheight;
+
+
+fet_beginchar ("Mensural maxima notehead (up)", "uM3mensural");
+ draw_mensural_longa (m_maxima_width, m_holeheight,
+ true, true, 1, false);
+fet_endchar;
+
+
+fet_beginchar ("Mensural maxima notehead (down)", "dM3mensural");
+ draw_mensural_longa (m_maxima_width, m_holeheight,
+ true, true, -1, false);
+fet_endchar;
+
+
+fet_beginchar ("Mensural maxima notehead (ligature)", "sM3ligmensural");
+ draw_mensural_brevis (m_maxima_width, m_holeheight, true, true);
+fet_endchar;
+
+
+fet_beginchar ("Mensural longa notehead (up)", "uM2mensural");
+ draw_mensural_longa (m_longa_width, m_holeheight,
+ true, true, 1, false);
+fet_endchar;
+
+
+fet_beginchar ("Mensural longa notehead (down)", "dM2mensural");
+ draw_mensural_longa (m_longa_width, m_holeheight,
+ true, true, -1, false);
+fet_endchar;
+
+fet_beginchar ("Mensural longa notehead (ligature)", "sM2ligmensural");
+ draw_mensural_longa (m_longa_width, m_holeheight,
+ true, true, -1, true);
+fet_endchar;
+
+
+fet_beginchar ("Mensural brevis notehead", "sM1mensural");
+ draw_mensural_brevis (m_brevis_width, m_holeheight, true, true);
+fet_endchar;
+
+
+fet_beginchar ("Mensural maxima notehead (up, reduced hole)",
+ "urM3mensural");
+ draw_mensural_longa (m_maxima_width, m_red_holeheight,
+ true, true, 1, false);
+fet_endchar;
+
+
+fet_beginchar ("Mensural maxima notehead (down, reduced hole)",
+ "drM3mensural");
+ draw_mensural_longa (m_maxima_width, m_red_holeheight,
+ true, true, -1, false);
+fet_endchar;
+
+
+fet_beginchar ("Mensural maxima notehead (ligature, reduced hole)",
+ "srM3ligmensural");
+ draw_mensural_brevis (m_maxima_width, m_red_holeheight, true, true);
+fet_endchar;
+
+
+fet_beginchar ("Mensural longa notehead (up, reduced hole)",
+ "urM2mensural");
+ draw_mensural_longa (m_longa_width, m_red_holeheight,
+ true, true, 1, false);
+fet_endchar;
+
+
+fet_beginchar ("Mensural longa notehead (down, reduced hole)",
+ "drM2mensural");
+ draw_mensural_longa (m_longa_width, m_red_holeheight,
+ true, true, -1, false);
+fet_endchar;
+
+
+fet_beginchar ("Mensural longa notehead (ligature, reduced hole)",
+ "srM2ligmensural");
+ draw_mensural_longa (m_longa_width, m_red_holeheight,
+ true, true, -1, true);
+fet_endchar;
+
+
+fet_beginchar ("Mensural brevis notehead (reduced hole)", "srM1mensural");
+ draw_mensural_brevis (m_brevis_width, m_red_holeheight, true, true);
+fet_endchar;
+
+
+%
+% Semi-colored mensural/Petrucci maxima/longa/brevis
+%
+
+fet_beginchar ("Semi-colored mensural maxima notehead (up)",
+ "uM3semimensural");
+ draw_mensural_longa (m_maxima_width, m_holeheight,
+ true, false, 1, false);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural maxima notehead (down)",
+ "dM3semimensural");
+ draw_mensural_longa (m_maxima_width, m_holeheight,
+ true, false, -1, false);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural maxima notehead (ligature)",
+ "sM3semiligmensural");
+ draw_mensural_brevis (m_maxima_width, m_holeheight, true, false);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural longa notehead (up)",
+ "uM2semimensural");
+ draw_mensural_longa (m_longa_width, m_holeheight,
+ true, false, 1, false);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural longa notehead (down)",
+ "dM2semimensural");
+ draw_mensural_longa (m_longa_width, m_holeheight,
+ true, false, -1, false);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural longa notehead (ligature)",
+ "sM2semiligmensural");
+ draw_mensural_longa (m_longa_width, m_holeheight,
+ true, false, -1, true);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural brevis notehead", "sM1semimensural");
+ draw_mensural_brevis (m_brevis_width, m_holeheight, true, false);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural maxima notehead (up, reduced hole)",
+ "urM3semimensural");
+ draw_mensural_longa (m_maxima_width, m_red_holeheight,
+ true, false, 1, false);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural maxima notehead (down, reduced hole)",
+ "drM3semimensural");
+ draw_mensural_longa (m_maxima_width, m_red_holeheight,
+ true, false, -1, false);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural maxima notehead (ligature, reduced hole)",
+ "srM3semiligmensural");
+ draw_mensural_brevis (m_maxima_width, m_red_holeheight, true, false);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural longa notehead (up, reduced hole)",
+ "urM2semimensural");
+ draw_mensural_longa (m_longa_width, m_red_holeheight,
+ true, false, 1, false);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural longa notehead (down, reduced hole)",
+ "drM2semimensural");
+ draw_mensural_longa (m_longa_width, m_red_holeheight,
+ true, false, -1, false);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural longa notehead (ligature, reduced hole)",
+ "srM2semiligmensural");
+ draw_mensural_longa (m_longa_width, m_red_holeheight,
+ true, false, -1, true);
+fet_endchar;
+
+
+fet_beginchar ("Semi-colored mensural brevis notehead (reduced hole)",
+ "srM1semimensural");
+ draw_mensural_brevis (m_brevis_width, m_red_holeheight, true, false);
+fet_endchar;
+
+
+%
+% Black mensural/Petrucci maxima/longa/brevis
+%
+
+fet_beginchar ("Black mensural maxima notehead (up)", "uM3blackmensural");
+ draw_mensural_longa (m_maxima_width, 0, false, false, 1, false);
+fet_endchar;
+
+
+fet_beginchar ("Black mensural maxima notehead (down)", "dM3blackmensural");
+ draw_mensural_longa (m_maxima_width, 0, false, false, -1, false);
+fet_endchar;
+
+
+fet_beginchar ("Black mensural maxima notehead (ligature)",
+ "sM3blackligmensural");
+ draw_mensural_brevis (m_maxima_width, 0, false, false);
+fet_endchar;
+
+
+fet_beginchar ("Black mensural longa notehead (up)", "uM2blackmensural");
+ draw_mensural_longa (m_longa_width, 0, false, false, 1, false);
+fet_endchar;
+
+
+fet_beginchar ("Black mensural longa notehead (down)", "dM2blackmensural");
+ draw_mensural_longa (m_longa_width, 0, false, false, -1, false);
+fet_endchar;
+
+
+fet_beginchar ("Black mensural longa notehead (ligature)",
+ "sM2blackligmensural");
+ draw_mensural_longa (m_longa_width, 0, false, false, -1, true);
+fet_endchar;
+
+
+fet_beginchar ("Black mensural brevis notehead", "sM1blackmensural");
+ draw_mensural_brevis (m_brevis_width, 0, false, false);
+fet_endchar;
+
+
+%
+% Mensural semibrevis/minima/semiminima
+%
+
fet_beginchar ("Mensural semibrevis head", "s0mensural");
draw_diamond_head (staff_space#, 0.15, 0.30, 30, true);
fet_endchar;
fet_endchar;
-fet_beginchar ("Petrucci semibrevis head", "s0petrucci");
-% draw_diamond_head (1.8 staff_space#, 0.15, 0.40, 30, true);
- draw_neomensural_open_head (staff_space#, 1.8 staff_space#);
+%
+% Black mensural semibrevis/minima/semiminima
+%
+
+fet_beginchar ("Black mensural semibrevis head", "s0blackmensural");
+ draw_diamond_head (staff_space#, 0.15, 0.30, 30, false);
fet_endchar;
-fet_beginchar ("Petrucci minima head", "s1petrucci");
-% draw_diamond_head (1.8 staff_space#, 0.15, 0.40, 30, true);
- draw_neomensural_open_head (staff_space#, 1.8 staff_space#);
+%
+% Petrucci semibrevis/minima/semiminima
+%
+% These values can be measured in several sources.
+% I used "Modulis ex sacris literis delecti, Liber primus"
+% Josquin Desprez, BNF
+
+save petrucci_width, petrucci_height;
+petrucci_height := 1.4 noteheight#;
+petrucci_width := .72 petrucci_height;
+
+fet_beginchar ("Petrucci semibrevis head", "s0petrucci");
+ draw_neomensural_open_head (petrucci_width, petrucci_height);
fet_endchar;
+fet_beginchar ("Petrucci minima head", "s1petrucci");
+ draw_neomensural_open_head (petrucci_width, petrucci_height);
+fet_endchar;
fet_beginchar ("Petrucci semiminima head", "s2petrucci");
-% draw_diamond_head (1.8 staff_space#, 0.15, 0.40, 30, false);
- draw_neomensural_black_head (staff_space#, 1.8 staff_space#);
+ draw_neomensural_black_head (petrucci_width, petrucci_height);
+fet_endchar;
+
+
+%
+% Black Petrucci semibrevis/minima/semiminima
+%
+
+fet_beginchar ("Petrucci colored semibrevis head", "s0blackpetrucci");
+ draw_neomensural_black_head (petrucci_width, petrucci_height);
+fet_endchar;
+
+fet_beginchar ("Petrucci colored minima head", "s1blackpetrucci");
+ draw_neomensural_black_head (petrucci_width, petrucci_height);
+fet_endchar;
+
+fet_beginchar ("Petrucci colored semiminima head", "s2blackpetrucci");
+ draw_neomensural_black_head (petrucci_width, petrucci_height);
fet_endchar;
fet_endchar;
+%%%%%%%%%%%%
+%%
+%% Noteheads for Medieval East-Slavic (Kievan) Notation
+%% Code by Aleksandr Andreev <aleksandr.andreev@gmail.com>
+%%
+%%%%%%%%%%%%
+
+
+fet_beginchar ("Kievan final note", "sM2kievan");
+ % This draws the Final Note.
+ % It is the last note of a piece of music
+ % equivalent to having a whole note and fermata in CMN.
+ % It always has an invariant representation.
+
+ vert_bar_thickness# := 2 * stafflinethickness#;
+ vert_height# := 1.5 * staff_space#;
+ blank_space# := 1.5 * stafflinethickness#;
+ note_width# := vert_height# - 2 * vert_bar_thickness#;
+
+ define_pixels (vert_height, blank_space, note_width);
+ define_blacker_pixels (vert_bar_thickness);
+
+ path p;
+ p := (0, blank_space)
+ -- (0, staff_space - blank_space)
+ -- (note_width + 0.5 vert_bar_thickness,
+ staff_space - blank_space)
+ -- (note_width + 0.5 vert_bar_thickness, blank_space)
+ -- cycle;
+ fill p;
+ fill p reflectedabout ((0, 0), (1, 0));
+
+ pickup pensquare xscaled vert_bar_thickness;
+
+ draw (note_width + 0.5 * vert_bar_thickness, vert_height)
+ -- (note_width + 0.5 * vert_bar_thickness, -vert_height);
+
+ set_char_box (0, note_width# + vert_bar_thickness#,
+ vert_height#, vert_height#);
+fet_endchar;
+
+
+fet_beginchar ("Kievan recitative mark", "sM1kievan");
+ inner_width# := 4 * staff_space#;
+ vert_bar_thickness# := 2 * stafflinethickness#;
+ vert_bar_height# := staff_space# - stafflinethickness#;
+ blank_space# := 0.20 * vert_bar_height#;
+
+ define_pixels (inner_width, blank_space, vert_bar_height);
+ define_blacker_pixels (vert_bar_thickness);
+
+ path p;
+ p := (2.5 * vert_bar_thickness, blank_space)
+ -- (2.5 * vert_bar_thickness, vert_bar_height - blank_space)
+ -- (3.5 * vert_bar_thickness + inner_width,
+ vert_bar_height - blank_space)
+ -- (3.5 * vert_bar_thickness + inner_width, blank_space)
+ -- cycle;
+ fill p;
+ fill p reflectedabout ((0, 0), (1, 0));
+
+ % draw the four vertical lines
+ pickup pensquare xscaled vert_bar_thickness;
+ p := (0.5 * vert_bar_thickness, vert_bar_height)
+ -- (0.5 * vert_bar_thickness, -vert_bar_height);
+ draw p;
+ draw p shifted (2 * vert_bar_thickness, 0);
+ draw p shifted (3 * vert_bar_thickness + inner_width, 0);
+ draw p shifted (5 * vert_bar_thickness + inner_width, 0);
+
+ set_char_box (0, 6 * vert_bar_thickness# + inner_width#,
+ vert_bar_height#, vert_bar_height#);
+fet_endchar;
+
+
+fet_beginchar ("Kievan whole note", "s0kievan");
+ % the amount by which top and bottom diamond overlap
+ overlap# := stafflinethickness#;
+ height# := staff_space# - stafflinethickness#;
+ width# := height# + overlap#;
+
+ define_pixels (overlap, height, width);
+
+ % parameters for superellipse are right, top, left, bottom
+ fill superellipse ((width, 0.5 * (height + overlap)),
+ (width/2, height + overlap),
+ (0, 0.5 * (height + overlap)),
+ (width/2, -overlap),
+ 0.51);
+ fill superellipse ((width, -0.5 * (height + overlap)),
+ (width/2, overlap),
+ (0, -0.5 * (height + overlap)),
+ (width/2, -height - overlap),
+ 0.51);
+
+ set_char_box (0, width#, height# + overlap#,
+ height# + overlap#);
+fet_endchar;
+
+
+fet_beginchar ("Kievan quarter note down", "d2kievan");
+ z1 = (0.09 * staff_space, 0.33 * staff_space);
+ z2 = (0.66 * staff_space, 0.37 * staff_space);
+ z3 = (0.99 * staff_space, 0.36 * staff_space);
+ z4 = (0.90 * staff_space, -1.05 * staff_space);
+ z5 = (1.02 * staff_space, -2.19 * staff_space);
+ z6 = (0.60 * staff_space, -2.49 * staff_space);
+ z7 = (0.58 * staff_space, -1.91 * staff_space);
+ z8 = (0.73 * staff_space, -0.35 * staff_space);
+ z9 = (0.02 * staff_space, -0.39 * staff_space);
+ z10 = (0, -0.24 * staff_space);
+
+ fill z1{dir 8.6}
+ .. z2
+ .. z3
+ & z3
+ .. z4
+ .. z5
+ -- z6
+ .. z7
+ .. z8
+ & z8{left}
+ .. z9
+ & z9
+ .. z10
+ ... {dir 75}cycle;
+
+ set_char_box (0, 1.02 staff_space#,
+ 2.50 staff_space#, 0.40 staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Kievan quarter note up", "u2kievan");
+ z1 = (0.090 staff_space, -0.330 staff_space);
+ z2 = (0.664 staff_space, -0.371 staff_space);
+ z3 = (0.986 staff_space, -0.363 staff_space);
+ z4 = (0.897 staff_space, 1.051 staff_space);
+ z5 = (1.019 staff_space, 2.387 staff_space);
+ z6 = (0.603 staff_space, 2.587 staff_space);
+ z7 = (0.583 staff_space, 1.911 staff_space);
+ z8 = (0.725 staff_space, 0.346 staff_space);
+ z9 = (0.017 staff_space, 0.391 staff_space);
+ z10 = (0, 0.240 staff_space);
+
+ fill z1{dir -6.9}
+ .. z2
+ .. z3
+ & z3
+ .. z4
+ .. z5
+ -- z6
+ .. z7
+ .. z8
+ & z8{left}
+ .. z9
+ & z9
+ .. z10
+ ... {dir -76.9}cycle;
+
+ set_char_box (0, 1.02 staff_space#,
+ 0.40 staff_space#, 2.6 staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Kievan half note (line position)", "s1kievan");
+ % This draws the half note with a short tail up and a long tail down.
+ % This version of the half note is used on any line of the staff.
+
+ z1 = (1.031 staff_space, 0.945 staff_space);
+ z2 = (0.945 staff_space, -0.122 staff_space);
+ z3 = (1.059 staff_space, -1.393 staff_space);
+ z4 = (0.713 staff_space, -1.564 staff_space);
+ z5 = (0.672 staff_space, -0.729 staff_space);
+ z6 = (0.684 staff_space, -0.318 staff_space);
+ z7 = (0.448 staff_space, -0.326 staff_space);
+ z8 = (0, -0.281 staff_space);
+ z9 = (0.086 staff_space, 0.350 staff_space);
+ z10 = (0.746 staff_space, 0.277 staff_space);
+ z11 = (0.909 staff_space, 0.921 staff_space);
+
+ fill z1
+ .. z2{down}
+ .. z3
+ -- z4
+ .. z5{up}
+ .. z6
+ & z6
+ .. z7{left}
+ .. z8
+ -- z9
+ .. {right}z10
+ & z10{up}
+ .. z11
+ -- cycle;
+
+ set_char_box (0, 1.06 staff_space#,
+ 1.6 staff_space#, 1.0 staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Kievan half note (space position)", "sr1kievan");
+ % This draws the half note with a short tail down and a long tail up.
+ % This version of the half note is used in any space of the staff.
+
+ z1 = (1.071 staff_space, 1.426 staff_space);
+ z2 = (0.974 staff_space, 0.191 staff_space);
+ z3 = (1.059 staff_space, -0.994 staff_space);
+ z4 = (0.713 staff_space, -1.169 staff_space);
+ z5 = (0.676 staff_space, -0.436 staff_space);
+ z6 = (0.684 staff_space, -0.310 staff_space);
+ z7 = (0.448 staff_space, -0.322 staff_space);
+ z8 = (0, -0.277 staff_space);
+ z9 = (0.0856 staff_space, 0.359 staff_space);
+ z10 = (0.746 staff_space, 0.281 staff_space);
+ z11 = (0.807 staff_space, 0.847 staff_space);
+ z12 = (0.945 staff_space, 1.401 staff_space);
+
+ fill z1
+ .. z2{down}
+ .. z3
+ -- z4
+ .. z5{up}
+ .. z6
+ & z6
+ .. z7{left}
+ .. z8
+ -- z9
+ .. z10{right}
+ & z10
+ .. z11
+ .. z12
+ -- cycle;
+
+ set_char_box (0, 1.1 staff_space#,
+ 1.0 staff_space#, 1.4 staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Kievan eighth note (down)", "d3kievan");
+ % This draws the eighth note.
+ % This form of the eight note occurs on the third line or higher
+ % and sometimes between the second line and the third line.
+
+ z1 = (0.261 staff_space, 0.416 staff_space);
+ z2 = (1.022 staff_space, 0.269 staff_space);
+ z3 = (0.664 staff_space, -0.603 staff_space);
+ z4 = (1.259 staff_space, -0.726 staff_space);
+ z5 = (1.055 staff_space, -2.012 staff_space);
+ z6 = (1.186 staff_space, -2.794 staff_space);
+ z7 = (0.778 staff_space, -2.999 staff_space);
+ z8 = (0.741 staff_space, -2.567 staff_space);
+ z9 = (0.941 staff_space, -1.467 staff_space);
+ z10 = (0.33 staff_space, -1.340 staff_space);
+ z11 = (0.631 staff_space, -0.448 staff_space);
+ z12 = (0, -0.334 staff_space);
+
+ fill z1{right}
+ .. z2
+ -- z3{right}
+ .. z4
+ & z4
+ .. z5{down}
+ .. z6
+ -- z7
+ .. z8{up}
+ .. z9
+ & z9
+ .. {left}z10
+ & z10{dir 78.7}
+ .. z11
+ & z11
+ .. {left}z12
+ & z12{dir 78.7}
+ .. {dir 62}cycle;
+
+ set_char_box (0, 1.25 staff_space#,
+ 3.0 staff_space#, 0.5 staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Kievan eighth note (up)", "u3kievan");
+ % This draws the flagged eighth note.
+ % This version of the eighth note occurs on the second line or lower.
+
+ % first, draw the upside down quarter note
+ z1 = (0.090 staff_space, -0.33 staff_space);
+ z2 = (0.664 staff_space, -0.371 staff_space);
+ z3 = (0.986 staff_space, -0.363 staff_space);
+ z4 = (0.896 staff_space, 1.051 staff_space);
+ z5 = (1.019 staff_space, 2.387 staff_space);
+ z6 = (0.603 staff_space, 2.587 staff_space);
+ z7 = (0.583 staff_space, 1.911 staff_space);
+ z8 = (0.725 staff_space, 0.346 staff_space);
+ z9 = (0.016 staff_space, 0.391 staff_space);
+ z10 = (0, 0.240 staff_space);
+
+ fill z1{dir -6.9}
+ .. z2
+ .. z3
+ & z3
+ .. z4
+ .. z5
+ -- z6
+ .. z7
+ .. z8
+ & z8{left}
+ .. z9
+ & z9
+ .. z10
+ ... {dir -76.9}cycle;
+
+ % now, draw the stem
+ z11 = (0.033 staff_space, 2.823 staff_space);
+ z12 = (0.391 staff_space, 2.648 staff_space);
+ z13 = (0.354 staff_space, 2.290 staff_space);
+ z14 = (0.676 staff_space, 1.076 staff_space);
+ z15 = (0.693 staff_space, 0.88 staff_space);
+ z16 = (0.208 staff_space, 1.699 staff_space);
+ z17 = (0.024 staff_space, 2.616 staff_space);
+
+ fill z11
+ -- z12
+ .. z13{down}
+ .. z14
+ -- z15
+ .. z16
+ .. z17{up}
+ .. cycle;
+
+ set_char_box (0, 1.0 staff_space#,
+ 0.4 staff_space#, 2.9 staff_space#);
+fet_endchar;
+
fet_endgroup ("noteheads");