]> git.donarmstrong.com Git - lilypond.git/commitdiff
Add glyphs and basic support for Kievan Notation
authorAleksandr Andreev <aleksandr.andreev@gmail.com>
Fri, 19 Aug 2011 15:17:43 +0000 (17:17 +0200)
committerJanek Warchoł <janek.lilypond@gmail.com>
Thu, 9 Feb 2012 08:34:16 +0000 (09:34 +0100)
Add generic metafont file, driver files and
file containing code for glyphs.
Modified scripts used in font generation
to include kievan glyphs.
Modified documentation to include Kievan glyphs.
Added KievanVoice and KievanStaff contexts.

Signed-off-by: Aleksandr Andreev <aleksandr.andreev@gmail.com>
14 files changed:
Documentation/included/font-table.ly
Documentation/notation/notation-appendices.itely
input/regression/note-head-style.ly
lily/bar-line.cc
lily/note-head.cc
lily/stem.cc
ly/engraver-init.ly
mf/parmesan-accidentals.mf
mf/parmesan-clefs.mf
mf/parmesan-dots.mf
mf/parmesan-noteheads.mf
mf/parmesan-scripts.mf
scm/output-lib.scm
scm/parser-clef.scm

index 398286ac4ec2af3242f61c07a7b27c2262d1ec37..0dfaac3a59a082468dbcdec54b86da342d35cf87 100644 (file)
@@ -32,6 +32,7 @@
   (define hufnagel (get-group glyph-list "^.*hufnagel.*$"))
   (define petrucci (get-group glyph-list "^.*petrucci.*$"))
   (define solesmes (get-group glyph-list "^.*solesmes.*$"))
+  (define kievan (get-group glyph-list "^.*kievan.*$"))
 
   ;; remove ancient-music groups from the glyph-list
   (for-each
@@ -42,7 +43,8 @@
             mensural
             neomensural
             petrucci
-            solesmes))
+            solesmes
+            kievan))
 
   ;; define all remaining groups
   (define numbers
index eb0bef92a915f2daf9543672e70e40154c75ab6e..830366ddd4d5be3f7f46e3a2180c739e0b8fa451 100644 (file)
@@ -636,6 +636,7 @@ see @ref{Formatting text}.
 * Neomensural glyphs::
 * Petrucci glyphs::
 * Solesmes glyphs::
+* Kievan Notation glyphs::
 @end menu
 
 
@@ -878,6 +879,14 @@ see @ref{Formatting text}.
             \doc-chars #solesmes
 @end lilypond
 
+@node Kievan Notation glyphs
+@unnumberedsubsec Kievan Notation glyphs
+
+@lilypond[quote]
+\include "font-table.ly"
+\markuplist \override-lines #'(word-space . 4)
+            \doc-chars #kievan
+@end lilypond
 
 @node Note head styles
 @appendixsec Note head styles
index 255ce007dd2ce3f2356eb37b5351976820c39c4f..5fe18054d40188562947336d01052fcaded6a9a5 100644 (file)
@@ -98,6 +98,13 @@ pattern = <<
   \override Staff.NoteHead  #'style = #'slash
   s1*0^\markup { "slash" }
   \pattern
+
+  \break
+
+  \override Staff.NoteHead  #'style = #'kievan
+  s1*0^\markup { "kievan" }
+  \pattern
+
 }
 
 
index c642c3159d03cb677dad15b80eb23752e1303ba7..1f2d9b2963401327cc49a04ffe3920c937eba6ac 100644 (file)
@@ -286,7 +286,8 @@ Bar_line::compound_barline (Grob *me, string str, Interval const &extent,
     m = dashed_bar_line (me, extent, hair);
   else if (str == "'")
     m = tick_bar_line (me, extent.at (UP), rounded);
-
+  else if (str == "kievan")
+    m.add_stencil (Font_interface::get_default_font (me)->find_by_name("scripts.barline.kievan"));
   return m;
 }
 
index 3ca686b2f3bbb785345a385aaf63d0365d77536a..fb93e40eeb82f02574c2fa670183d19054214fd6 100644 (file)
@@ -64,7 +64,8 @@ internal_print (Grob *me, string *font_char)
   if (style == "mensural"
       || style == "neomensural"
       || style == "petrucci"
-      || style == "baroque")
+      || style == "baroque"
+      || style == "kievan")
     {
       if (!Staff_symbol_referencer::on_line
           (me,
index fb830624ff23b360e1c06d5d85a7c0114033ed8e..8eaf2321ea3ecdb669df157bf959cfa4ff706c11 100644 (file)
@@ -277,7 +277,12 @@ Stem::is_invisible (Grob *me)
 bool
 Stem::is_normal_stem (Grob *me)
 {
-  return head_count (me) && scm_to_int (me->get_property ("duration-log")) >= 1;
+  if (!head_count (me))
+     return false;
+
+  extract_grob_set (me, "note-heads", heads);
+  SCM style = heads[0]->get_property ("style");
+  return style != ly_symbol2scm ("kievan") && scm_to_int (me->get_property ("duration-log")) >= 1;
 }
 
 MAKE_SCHEME_CALLBACK (Stem, pure_height, 3)
index 67c3522a1506d6d86d4f90ed8d3b050a5d217f7a..6335ab65b1fcd0fb168e0098cfa8efa57ecabe0f 100644 (file)
@@ -559,6 +559,7 @@ automatically when an output definition (a @code{\score} or
   \accepts "PetrucciStaff"
   \accepts "StaffGroup"
   \accepts "DrumStaff"
+  \accepts "KievanStaff"
   \accepts "Lyrics"
   \accepts "ChordNames"
   \accepts "GrandStaff"
@@ -568,7 +569,6 @@ automatically when an output definition (a @code{\score} or
   \accepts "NoteNames"
   \accepts "FiguredBass"
 
-
   noteToFretFunction = #determine-frets
   predefinedDiagramTable = ##f
   soloText = #"Solo"
@@ -1114,6 +1114,54 @@ accommodated for typesetting a piece in Petrucci style."
   printKeyCancellation = ##f
 }
 
+\context {
+ \Voice
+ \name "KievanVoice"
+ \alias "Voice"
+ \description "Same as @code{Voice} context, except that it is
+accommodated for typesetting a piece in Kievan style."
+
+% \override Stem #'stencil = ##f
+
+ %% Set glyph styles.
+ \override NoteHead #'style = #'kievan
+ \override Rest #'style = #'mensural
+ \override Accidental #'glyph-name-alist = #alteration-kievan-glyph-name-alist
+ \override Dots #'style = #'kievan
+ \override Slur #'stencil = ##f
+
+ %% There are beams in Kievan notation, but they are invoked manually
+ autoBeaming = ##f
+ \override Beam #'beam-thickness = #0.32
+ \override Beam #'length-fraction = #0.62
+}
+
+\context {
+ \Staff
+ \name "KievanStaff"
+ \alias "Staff"
+ \denies "Voice"
+ \defaultchild "KievanVoice"
+ \accepts "KievanVoice"
+ \description "Same as @code{Staff} context, except that it is
+accommodated for typesetting a piece in Kievan style."
+
+ %% Choose Kievan tsefaut clef
+ clefGlyph = #"clefs.kievan.do"
+ middleCClefPosition = #0
+ middleCPosition = #0
+ clefPosition = #0
+ clefOctavation = #0
+
+ %% Accidentals are valid only once (if the following note is different)
+ extraNatural = ##f
+ autoAccidentals = #`(Staff ,(make-accidental-rule 'same-octave 0)
+                            ,neo-modern-accidental-rule)
+ autoCautionaries = #'()
+ printKeyCancellation = ##f
+
+}
+
 %% Keep the old definitions in here for compatibility (they erase previous
 %% settings to the corresponding context!).
 %% For new scores, one should simply insert the \RemoveEmptyStaves settings
index 340986d7e0f0336bc6e51497e6d4af37c2a0de03..7c081a995f1f167c1123992f628a8e1bd82d5de9 100644 (file)
@@ -392,5 +392,77 @@ fet_beginchar ("Hufnagel Flat" , "hufnagelM1");
        labels (1, 2, 3, 4, 5, 6);
 fet_endchar;
 
+%%%%%%%%%%%%%%%
+%%%
+%%% Glyphs for Kievan Music Notation
+%%%
+%%%%%%%%%%%%%%%
+
+fet_beginchar ("kievan sharp", "kievan1");
+       % this draws the sharp
+       % the sharp never occurs in Synodal music.
+       % It can only be found in some early manuscripts
+       z1 = (0.579 staff_space, 1.459 staff_space);
+       z2 = (1.414 staff_space, -0.904 staff_space);
+       z3 = (0.187 staff_space, 0.904 staff_space);
+       x2 - x1 = x4 - x3;
+       y1 - y2 = y3 - y4;
+       z5 = (1.296 staff_space, 1.613 staff_space);
+       z6 = (0.090 staff_space, -0.864 staff_space);
+       z7 = (1.532 staff_space, 0.892 staff_space);
+       x5 - x6 = x7 - x8;
+       y5 - y6 = y7 - y8;
+       pickup pensquare xscaled 0.167staff_space
+                        yscaled 0.167staff_space
+                        rotated -69.2;
+       draw z1{dir -69.2} .. {dir -74.1}z2;
+       draw z3{dir -69.2} .. {dir -74.1}z4;
+       pickup pensquare xscaled 0.167staff_space
+                        yscaled 0.167staff_space
+                        rotated -114.6;
+       draw z5{dir -114.6}  ... {dir -125.0}z6;
+       draw z7{dir -114.6} ... {dir -125.0}z8;
+       set_char_box (0, 1.6 staff_space#, 1.6 staff_space#, 1.6 staff_space#);
+fet_endchar;
+
+fet_beginchar ("kievan flat", "kievanM1");
+       % this draws the flat sign
+       % In Synodal music, the flat only occurs on the high B
+       % but it may be used elsewhere in early manuscripts
+       z1 = (0.452 staff_space, 1.772 staff_space);
+       z2 = (0.481 staff_space, 1.735 staff_space);
+       z3 = (0.464 staff_space, 1.626 staff_space);
+       z4 = (0.249 staff_space, 0.322 staff_space);
+       z5 = (0.432 staff_space, -0.762 staff_space);
+       z6 = (0.611 staff_space, -0.583 staff_space);
+       z7 = (0.611 staff_space, 0.224 staff_space);
+       z8 = (0.652 staff_space, 0.513 staff_space);
+       z9 = (0.900 staff_space, 0.684 staff_space);
+       z10 = (0.872 staff_space, 0.640 staff_space);
+       z11 = (0.811 staff_space, 0.359 staff_space);
+       z12 = (0.811 staff_space, -0.587 staff_space);
+       z13 = (0.338 staff_space, -1.063 staff_space);
+       z14 = (0.016 staff_space, 0.196 staff_space);
+       z15 = (0.204 staff_space, 1.316 staff_space);
+       fill z13
+            .. z14{up}
+            .. z15{dir 70.8}
+            .. z1{dir 4.9}
+            .. z2
+            .. z3
+            .. z4{down}
+            .. z5
+            & z5 -- cycle;
+       fill z5 -- z6
+            & z6 -- z7
+            & z7 -- z11
+            & z11 -- z12
+            & z12 -- z13
+            & z13 -- cycle;
+       fill z7{up} .. z8 .. {dir 23}z9
+            & z9 .. z10{dir -135} .. {down}z11
+            & z11 -- cycle;
+       set_char_box (0, 1.0 staff_space#, 1.0 staff_space#, 1.8 staff_space#);
+fet_endchar;
 
 fet_endgroup ("accidentals");
index 91988ebc4ca1b6776bcad6208ce5800f2643d957..2af7b9fdd0f19c223176a24a38a2732bd99fe590 100644 (file)
@@ -1700,5 +1700,47 @@ fet_beginchar ("Hufnagel do/fa clef", "hufnagel.do.fa_change");
        draw_hufnagel_do_fa_clef ((0, 0), .8);
 fet_endchar;
 
+%%%%%%%%
+%%
+%% Medieval East-Slavic (Kievan) Notation clefs
+%% Code by Aleksandr Andreev <aleksandr.andreev@gmail.com>
+%%
+%%%%%%%%
+
+def draw_kievan_do_clef =
+       z1 = (1.108 staff_space, 0.554 staff_space);
+       z2 = (1.063 staff_space, -0.122 staff_space);
+       z3 = (1.467 staff_space, -1.621 staff_space);
+       z4 = (1.002 staff_space, -2.253 staff_space);
+       y5 = y3;
+       x4 - x5 = x3 - x4;
+       z6 = (0.917 staff_space, -0.383 staff_space);
+       z7 = (0.012 staff_space, -0.448 staff_space);
+       z8 = (0, -0.167 staff_space);
+       z9 = (0.057 staff_space, 0.464 staff_space);
+       z10 = (0.994 staff_space, 0.387 staff_space);
+       z11 = (1.023 staff_space, 0.554 staff_space);
+       fill z1 .. z2{down} .. z3
+            & z3 -- z4
+            & z4 -- z5
+            & z5 .. {up}z6
+            & z6{left} .. z7
+            & z7 .. z8{up} .. z9
+            & z9 .. {right}z10
+            & z10 .. z11
+            & z11 -- cycle;
+       set_char_box (0, 1.5 staff_space#, 2.25 staff_space#, 0.55 staff_space#);
+enddef;
+
+fet_beginchar ("kievan tsefaut clef", "kievan.do");
+       % this draws the Tse-Fa-Ut clef
+       % it is a variant alto clef that always occurs on the third line of the staff
+       draw_kievan_do_clef;
+fet_endchar;
+
+fet_beginchar ("mensural c clef", "kievan.do_change");
+       % This is the same thing as a do clef?
+       draw_kievan_do_clef;
+fet_endchar;
 
 fet_endgroup ("clefs");
index d6aa75682c940b1143e0854bfdb2b889b6955a5e..1c09d51efb907a48130681716fedcdf35d65c98f 100644 (file)
@@ -35,4 +35,24 @@ fet_beginchar ("duration dot", "dotvaticana");
        set_char_box (0, dot_diam#, .5 dot_diam#, .5 dot_diam#);
 fet_endchar;
 
+%%%%%%%%%%%%%
+%%%
+%%% Code for Kievan Music Notation
+%%%
+%%%%%%%%%%%%%
+
+save kievan_dot_diam;
+kievan_dot_diam# := staff_space# - stafflinethickness#;
+define_whole_pixels (kievan_dot_diam);
+
+fet_beginchar ("kievan augmentation dot", "dotkievan");
+       % pars for superellipse are right, top, left, bottom
+       fill superellipse((kievan_dot_diam, 0),
+                         (kievan_dot_diam / 2, kievan_dot_diam / 2),
+                         (0, 0),
+                         (kievan_dot_diam / 2, -kievan_dot_diam / 2),
+                          0.51);
+       set_char_box (0, kievan_dot_diam#, 0.5 kievan_dot_diam#, 0.5 kievan_dot_diam#);
+fet_endchar;
+
 fet_endgroup ("dots");
index 8ba6e4bdafb48b65e0693bccc6a3c02784a6c40b..12fd9322f7936a03d82c4a2970a76426888fc281 100644 (file)
@@ -1706,5 +1706,246 @@ fet_beginchar ("Hufnagel pes lower punctum", "shufnagel.lpes")
 %      labels (1, 2, 3, 4);
 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
+       % the final note 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, staff_space - blank_space) --
+            (note_width, 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 := (3 * vert_bar_thickness, blank_space) --
+            (3 * vert_bar_thickness, vert_bar_height - blank_space) --
+            (3 * vert_bar_thickness + inner_width, vert_bar_height - blank_space) --
+            (3 * 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);
+
+       % pars 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
+            & z5 -- z6
+            & 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
+            & z5 -- z6
+            & 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
+            & z3 -- z4
+            & z4 .. z5{up} .. z6
+            & z6 .. z7{left} .. z8
+            & z8 -- z9
+            & z9 .. {right}z10
+            & z10{up} .. z11
+            & 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
+            & z3 -- z4
+            & z4 .. z5{up} .. z6
+            & z6 .. z7{left} .. z8
+            & z8 -- z9
+            & z9 .. z10{right}
+            & z10 .. z11 .. z12
+            & 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
+            & z2 -- z3
+            & z3{right} .. z4
+            & z4 .. z5{down} .. z6
+            & z6 -- z7
+            & 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
+            & z5 -- z6
+            & 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
+            & z12 .. z13{down} .. z14
+            & z14 -- z15
+            & 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");
index 18646a807e3f9718d8db5497de6b2bedc32c6d62..dcc3fd451818f36dfe4241d0e4fb131b03832680 100644 (file)
@@ -238,5 +238,57 @@ fet_beginchar ("signum congruentiae down", "dsignumcongruentiae");
        xy_mirror_char;
 fet_endchar;
 
+%%%%%%%%%%%%%
+%%%%
+%%%% Code for Kievan Notation
+%%%%
+%%%%%%%%%%%%%
+
+fet_beginchar ("kievan end of piece (slash)", "barline.kievan");
+       % this draws the end of piece figure
+       % this figure is placed at the end of the musical piece, after the staff
+       save hair_thickness, thick_thickness, width, depth, height, padding;
+       hair# = 1.9 linethickness#;
+       thick# = 6.0 linethickness#;
+       width = .8 staff_space;
+       height# + depth# = 4 staff_space#;
+       depth# = height# + hair# / 2;
+       padding = .2 staff_space;
+
+       set_char_box (0, 0, depth#, height#);
+       define_pixels (hair, thick);
+
+       x1r - x2l = width;
+       y1 - y3r = d + h + linethickness / 2;
+       z3 = z2;
+       z4 = .5 [z1, z2] = (width / 2 + padding, hair / 8);
+       z5 = (x2 - .17 staff_space, 9/10 [y2, y1]);
+       z7 - z6 = (.5 staff_space, -.2 staff_space);
+       .4 [z6, z7] = 7/6 [z2, z1];
+
+       pickup pencircle scaled blot_diameter;
+       penpos1 (hair, 0);
+       penpos2 (hair, 0);
+       penpos3 (hair, -90);
+       penpos4 (thick, 10);
+       penpos5 (thick, 35);
+       penpos6 (hair, -90);
+       penpos7 (.5 thick, -120);
+
+       penlabels (1, 2, 3, 4, 5, 6, 7);
+
+       penstroke z1e
+                -- z2e;
+
+       fill simple_serif (z3l, z3r, 90){1.5 right}
+            .. z4r
+            .. z5r
+            .. z6r
+            .. simple_serif (z7r, z7l, 80)
+            .. {left}z6l
+            .. z5l
+            .. z4l
+            .. cycle;
+fet_endchar;
 
 fet_endgroup ("scripts");
index 7a43a7bb54978e4f314b948ebe389e59664c14eb..17bbea995b1f7c7bf03005b4ffffea2d6c9fd221 100644 (file)
         (if (interval-empty? (interval-intersection stem_ph my_ph)) #f (coord-translate stem_ph dist)))
       #f))
 
+;; FIXME: NEED TO FIND A BETTER WAY TO HANDLE KIEVAN NOTATION
 (define-public (note-head::calc-duration-log grob)
-  (min 2
-       (ly:duration-log
-       (ly:event-property (event-cause grob) 'duration))))
+  (let ((style (ly:grob-property grob 'style)))
+    (if (and (symbol? style) (string-match "kievan*" (symbol->string style)))
+      (min 3
+        (ly:duration-log
+       (ly:event-property (event-cause grob) 'duration)))
+      (min 2
+       (ly:duration-log
+       (ly:event-property (event-cause grob) 'duration))))))
 
 (define-public (dots::calc-dot-count grob)
   (ly:duration-dot-count
@@ -226,6 +232,8 @@ and duration-log @var{log}."
         (string-append (number->string log) "petrucci")))
     ((neomensural)
      (string-append (number->string log) (symbol->string style)))
+    ((kievan)
+     (string-append (number->string log) "kievan"))
     (else
      (if (string-match "vaticana*|hufnagel*|medicaea*" (symbol->string style))
         (symbol->string style)
@@ -233,9 +241,10 @@ and duration-log @var{log}."
                        (symbol->string style))))))
 
 (define-public (note-head::calc-glyph-name grob)
-  (let ((style (ly:grob-property grob 'style))
-       (log (min 2 (ly:grob-property grob 'duration-log))))
-
+  (let* ((style (ly:grob-property grob 'style))
+        (log (if (string-match "kievan*" (symbol->string style))
+                 (min 3 (ly:grob-property grob 'duration-log))
+                 (min 2 (ly:grob-property grob 'duration-log)))))
     (select-head-glyph style log)))
 
 (define-public (note-head::brew-ez-stencil grob)
@@ -388,7 +397,10 @@ and duration-log @var{log}."
     ("S|:" . ("S" . "|:"))
     (".S|:" . ("|" . "S|:"))
     (":|S|:" . (":|" . "S|:"))
-    (":|S.|:" . (":|S" . "|:"))))
+    (":|S.|:" . (":|S" . "|:"))
+
+    ;; ancient bar lines
+    ("kievan" . ("kievan" . ""))))
 
 (define-public (bar-line::calc-glyph-name grob)
   (let* ((glyph (ly:grob-property grob 'glyph))
@@ -678,6 +690,9 @@ and duration-log @var{log}."
     (0 . "accidentals.vaticana0")
     (1/2 . "accidentals.mensural1")))
 
+(define-public alteration-kievan-glyph-name-alist
+ '((-1/2 . "accidentals.kievanM1")
+   (1/2 . "accidentals.kievan1")))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; * Pitch Trill Heads
index c92de614c7da0a23fd370eb7ed4a00170c49bcb2..6d46cc626cc8df1cc64743af3428bed24fc665d7 100644 (file)
@@ -76,7 +76,8 @@
     ("petrucci-f4" . ("clefs.petrucci.f" 2 0))
     ("petrucci-f5" . ("clefs.petrucci.f" 4 0))
     ("petrucci-f" . ("clefs.petrucci.f" 2 0))
-    ("petrucci-g" . ("clefs.petrucci.g" -2 0))))
+    ("petrucci-g" . ("clefs.petrucci.g" -2 0))
+    ("kievan-do" . ("clefs.kievan.do" 0 0))))
 
 ;; "an alist mapping GLYPHNAME to the position of the middle C for
 ;; that symbol"
     ("clefs.petrucci.c4" . 0)
     ("clefs.petrucci.c5" . 0)
     ("clefs.petrucci.f" . 4)
-    ("clefs.petrucci.g" . -4)))
+    ("clefs.petrucci.g" . -4)
+    ("clefs.kievan.do" . 0)))
 
 (define-public (make-clef-set clef-name)
   "Generate the clef setting commands for a clef with name @var{clef-name}."