From 18dda6b2f5fbea91a174b60eb22bbb73591b9b64 Mon Sep 17 00:00:00 2001 From: Aleksandr Andreev Date: Fri, 19 Aug 2011 17:17:43 +0200 Subject: [PATCH] Add glyphs and basic support for Kievan Notation 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 --- Documentation/included/font-table.ly | 4 +- .../notation/notation-appendices.itely | 9 + input/regression/note-head-style.ly | 7 + lily/bar-line.cc | 3 +- lily/note-head.cc | 3 +- lily/stem.cc | 7 +- ly/engraver-init.ly | 50 +++- mf/parmesan-accidentals.mf | 72 ++++++ mf/parmesan-clefs.mf | 42 +++ mf/parmesan-dots.mf | 20 ++ mf/parmesan-noteheads.mf | 241 ++++++++++++++++++ mf/parmesan-scripts.mf | 52 ++++ scm/output-lib.scm | 29 ++- scm/parser-clef.scm | 6 +- 14 files changed, 531 insertions(+), 14 deletions(-) diff --git a/Documentation/included/font-table.ly b/Documentation/included/font-table.ly index 398286ac4e..0dfaac3a59 100644 --- a/Documentation/included/font-table.ly +++ b/Documentation/included/font-table.ly @@ -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 diff --git a/Documentation/notation/notation-appendices.itely b/Documentation/notation/notation-appendices.itely index eb0bef92a9..830366ddd4 100644 --- a/Documentation/notation/notation-appendices.itely +++ b/Documentation/notation/notation-appendices.itely @@ -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 diff --git a/input/regression/note-head-style.ly b/input/regression/note-head-style.ly index 255ce007dd..5fe18054d4 100644 --- a/input/regression/note-head-style.ly +++ b/input/regression/note-head-style.ly @@ -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 + } diff --git a/lily/bar-line.cc b/lily/bar-line.cc index c642c3159d..1f2d9b2963 100644 --- a/lily/bar-line.cc +++ b/lily/bar-line.cc @@ -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; } diff --git a/lily/note-head.cc b/lily/note-head.cc index 3ca686b2f3..fb93e40eeb 100644 --- a/lily/note-head.cc +++ b/lily/note-head.cc @@ -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, diff --git a/lily/stem.cc b/lily/stem.cc index fb830624ff..8eaf2321ea 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -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) diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 67c3522a15..6335ab65b1 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -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 diff --git a/mf/parmesan-accidentals.mf b/mf/parmesan-accidentals.mf index 340986d7e0..7c081a995f 100644 --- a/mf/parmesan-accidentals.mf +++ b/mf/parmesan-accidentals.mf @@ -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"); diff --git a/mf/parmesan-clefs.mf b/mf/parmesan-clefs.mf index 91988ebc4c..2af7b9fdd0 100644 --- a/mf/parmesan-clefs.mf +++ b/mf/parmesan-clefs.mf @@ -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 +%% +%%%%%%%% + +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"); diff --git a/mf/parmesan-dots.mf b/mf/parmesan-dots.mf index d6aa75682c..1c09d51efb 100644 --- a/mf/parmesan-dots.mf +++ b/mf/parmesan-dots.mf @@ -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"); diff --git a/mf/parmesan-noteheads.mf b/mf/parmesan-noteheads.mf index 8ba6e4bdaf..12fd9322f7 100644 --- a/mf/parmesan-noteheads.mf +++ b/mf/parmesan-noteheads.mf @@ -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 +%% +%%%%%%%%%%%% + +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"); diff --git a/mf/parmesan-scripts.mf b/mf/parmesan-scripts.mf index 18646a807e..dcc3fd4518 100644 --- a/mf/parmesan-scripts.mf +++ b/mf/parmesan-scripts.mf @@ -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"); diff --git a/scm/output-lib.scm b/scm/output-lib.scm index 7a43a7bb54..17bbea995b 100644 --- a/scm/output-lib.scm +++ b/scm/output-lib.scm @@ -159,10 +159,16 @@ (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 diff --git a/scm/parser-clef.scm b/scm/parser-clef.scm index c92de614c7..6d46cc626c 100644 --- a/scm/parser-clef.scm +++ b/scm/parser-clef.scm @@ -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" @@ -103,7 +104,8 @@ ("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}." -- 2.39.2