summaryrefslogtreecommitdiff
path: root/muse2
diff options
context:
space:
mode:
Diffstat (limited to 'muse2')
-rw-r--r--muse2/muse/midiedit/scoreedit.cpp58
-rw-r--r--muse2/share/CMakeLists.txt1
-rw-r--r--muse2/share/scoreglyphs/0.pngbin0 -> 379 bytes
-rw-r--r--muse2/share/scoreglyphs/1.pngbin0 -> 353 bytes
-rw-r--r--muse2/share/scoreglyphs/2.pngbin0 -> 435 bytes
-rw-r--r--muse2/share/scoreglyphs/3.pngbin0 -> 446 bytes
-rw-r--r--muse2/share/scoreglyphs/4.pngbin0 -> 416 bytes
-rw-r--r--muse2/share/scoreglyphs/5.pngbin0 -> 431 bytes
-rw-r--r--muse2/share/scoreglyphs/6.pngbin0 -> 412 bytes
-rw-r--r--muse2/share/scoreglyphs/7.pngbin0 -> 412 bytes
-rw-r--r--muse2/share/scoreglyphs/8.pngbin0 -> 453 bytes
-rw-r--r--muse2/share/scoreglyphs/9.pngbin0 -> 453 bytes
-rw-r--r--muse2/share/scoreglyphs/CMakeLists.txt29
-rw-r--r--muse2/share/scoreglyphs/LICENSE364
-rw-r--r--muse2/share/scoreglyphs/acc_b.pngbin0 -> 347 bytes
-rw-r--r--muse2/share/scoreglyphs/acc_none.pngbin0 -> 359 bytes
-rw-r--r--muse2/share/scoreglyphs/acc_sharp.pngbin0 -> 403 bytes
-rw-r--r--muse2/share/scoreglyphs/clef_bass_big.pngbin0 -> 621 bytes
-rw-r--r--muse2/share/scoreglyphs/clef_violin_big.pngbin0 -> 1140 bytes
-rw-r--r--muse2/share/scoreglyphs/dot.pngbin0 -> 218 bytes
-rw-r--r--muse2/share/scoreglyphs/feta-original/CMakeLists.txt27
-rw-r--r--muse2/share/scoreglyphs/feta-original/COPYING-lilypond359
-rw-r--r--muse2/share/scoreglyphs/feta-original/GNUmakefile198
-rw-r--r--muse2/share/scoreglyphs/feta-original/README125
-rw-r--r--muse2/share/scoreglyphs/feta-original/aybabtu.pe.in84
-rw-r--r--muse2/share/scoreglyphs/feta-original/bigcheese.pe.in44
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-accordion.mf445
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-alphabet.mf19
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-alphabet11.mf6
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-alphabet13.mf6
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-alphabet14.mf6
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-alphabet16.mf6
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-alphabet18.mf6
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-alphabet20.mf7
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-alphabet23.mf7
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-alphabet26.mf6
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-arrow.mf169
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-autometric.mf255
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-banier.mf550
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-beugel.mf147
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-bolletjes.mf1497
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-braces-a.mf11
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-braces-b.mf11
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-braces-c.mf11
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-braces-d.mf11
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-braces-e.mf11
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-braces-f.mf11
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-braces-g.mf11
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-braces-h.mf11
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-braces-i.mf11
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-din-code.mf791
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-eindelijk.mf593
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-generic.mf57
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-haak.mf92
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-klef.mf698
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-macros.mf497
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-nummer-code.mf899
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-params.mf213
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-pendaal.mf348
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-puntje.mf26
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-schrift.mf1560
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-slag.mf315
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-test-generic.mf20
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-test11.mf15
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-test13.mf16
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-test16.mf16
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-test20.mf16
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-test23.mf16
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-test26.mf15
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-timesig.mf108
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta-toevallig.mf1308
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta11.mf13
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta13.mf13
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta14.mf14
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta16.mf13
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta18.mf14
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta20.mf14
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta23.mf15
-rw-r--r--muse2/share/scoreglyphs/feta-original/feta26.mf15
-rw-r--r--muse2/share/scoreglyphs/feta-original/mf2pt1.mp495
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan-accidentals.mf385
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan-clefs.mf1693
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan-custodes.mf500
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan-dots.mf27
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan-flags.mf326
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan-generic.mf42
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan-heads.mf1492
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan-macros.mf215
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan-rests.mf418
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan-scripts.mf231
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan-timesig.mf395
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan11.mf13
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan13.mf14
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan14.mf14
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan16.mf14
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan18.mf14
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan20.mf14
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan23.mf14
-rw-r--r--muse2/share/scoreglyphs/feta-original/parmesan26.mf14
-rw-r--r--muse2/share/scoreglyphs/flags16d.pngbin0 -> 450 bytes
-rw-r--r--muse2/share/scoreglyphs/flags16u.pngbin0 -> 429 bytes
-rw-r--r--muse2/share/scoreglyphs/flags32d.pngbin0 -> 522 bytes
-rw-r--r--muse2/share/scoreglyphs/flags32u.pngbin0 -> 489 bytes
-rw-r--r--muse2/share/scoreglyphs/flags64d.pngbin0 -> 584 bytes
-rw-r--r--muse2/share/scoreglyphs/flags64u.pngbin0 -> 583 bytes
-rw-r--r--muse2/share/scoreglyphs/flags8d.pngbin0 -> 384 bytes
-rw-r--r--muse2/share/scoreglyphs/flags8u.pngbin0 -> 356 bytes
-rw-r--r--muse2/share/scoreglyphs/half.pngbin0 -> 343 bytes
-rw-r--r--muse2/share/scoreglyphs/quarter.pngbin0 -> 317 bytes
-rw-r--r--muse2/share/scoreglyphs/rest1.pngbin0 -> 198 bytes
-rw-r--r--muse2/share/scoreglyphs/rest16.pngbin0 -> 409 bytes
-rw-r--r--muse2/share/scoreglyphs/rest2.pngbin0 -> 198 bytes
-rw-r--r--muse2/share/scoreglyphs/rest4.pngbin0 -> 431 bytes
-rw-r--r--muse2/share/scoreglyphs/rest8.pngbin0 -> 347 bytes
-rw-r--r--muse2/share/scoreglyphs/whole.pngbin0 -> 400 bytes
115 files changed, 18548 insertions, 32 deletions
diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp
index 3c4543b3..7fa3f89c 100644
--- a/muse2/muse/midiedit/scoreedit.cpp
+++ b/muse2/muse/midiedit/scoreedit.cpp
@@ -1,8 +1,3 @@
-//you need to download http://home.arcor.de/michael.jung11/glyphs.tar.bz2
-//and extract it somewhere. then change FONT_PATH to the correct directory
-//the trailing slash is necessary
-#define FONT_PATH "/home/flo/muse-glyphs/"
-
//=========================================================
// MusE
// Linux Music Editor
@@ -510,10 +505,9 @@ void color_image(QImage& img, const QColor& color)
}
}
-void load_colored_pixmaps(string file, QPixmap* array)
+void load_colored_pixmaps(QString file, QPixmap* array)
{
- QString fn(file.c_str());
- QImage img(fn);
+ QImage img(file);
color_image(img, Qt::black);
array[BLACK_PIXMAP]=QPixmap::fromImage(img);
@@ -561,33 +555,33 @@ void ScoreCanvas::load_pixmaps()
- load_colored_pixmaps(FONT_PATH "whole.png", pix_whole);
- load_colored_pixmaps(FONT_PATH "half.png", pix_half);
- load_colored_pixmaps(FONT_PATH "quarter.png", pix_quarter);
- load_colored_pixmaps(FONT_PATH "dot.png", pix_dot);
- load_colored_pixmaps(FONT_PATH "acc_none.png", pix_noacc);
- load_colored_pixmaps(FONT_PATH "acc_sharp.png", pix_sharp);
- load_colored_pixmaps(FONT_PATH "acc_b.png", pix_b);
-
- pix_r1->load(FONT_PATH "rest1.png");
- pix_r2->load(FONT_PATH "rest2.png");
- pix_r4->load(FONT_PATH "rest4.png");
- pix_r8->load(FONT_PATH "rest8.png");
- pix_r16->load(FONT_PATH "rest16.png");
- pix_flag_up[0].load(FONT_PATH "flags8u.png");
- pix_flag_up[1].load(FONT_PATH "flags16u.png");
- pix_flag_up[2].load(FONT_PATH "flags32u.png");
- pix_flag_up[3].load(FONT_PATH "flags64u.png");
- pix_flag_down[0].load(FONT_PATH "flags8d.png");
- pix_flag_down[1].load(FONT_PATH "flags16d.png");
- pix_flag_down[2].load(FONT_PATH "flags32d.png");
- pix_flag_down[3].load(FONT_PATH "flags64d.png");
+ load_colored_pixmaps(museGlobalShare + "/scoreglyphs/whole.png", pix_whole);
+ load_colored_pixmaps(museGlobalShare + "/scoreglyphs/half.png", pix_half);
+ load_colored_pixmaps(museGlobalShare + "/scoreglyphs/quarter.png", pix_quarter);
+ load_colored_pixmaps(museGlobalShare + "/scoreglyphs/dot.png", pix_dot);
+ load_colored_pixmaps(museGlobalShare + "/scoreglyphs/acc_none.png", pix_noacc);
+ load_colored_pixmaps(museGlobalShare + "/scoreglyphs/acc_sharp.png", pix_sharp);
+ load_colored_pixmaps(museGlobalShare + "/scoreglyphs/acc_b.png", pix_b);
+
+ pix_r1->load(museGlobalShare + "/scoreglyphs/rest1.png");
+ pix_r2->load(museGlobalShare + "/scoreglyphs/rest2.png");
+ pix_r4->load(museGlobalShare + "/scoreglyphs/rest4.png");
+ pix_r8->load(museGlobalShare + "/scoreglyphs/rest8.png");
+ pix_r16->load(museGlobalShare + "/scoreglyphs/rest16.png");
+ pix_flag_up[0].load(museGlobalShare + "/scoreglyphs/flags8u.png");
+ pix_flag_up[1].load(museGlobalShare + "/scoreglyphs/flags16u.png");
+ pix_flag_up[2].load(museGlobalShare + "/scoreglyphs/flags32u.png");
+ pix_flag_up[3].load(museGlobalShare + "/scoreglyphs/flags64u.png");
+ pix_flag_down[0].load(museGlobalShare + "/scoreglyphs/flags8d.png");
+ pix_flag_down[1].load(museGlobalShare + "/scoreglyphs/flags16d.png");
+ pix_flag_down[2].load(museGlobalShare + "/scoreglyphs/flags32d.png");
+ pix_flag_down[3].load(museGlobalShare + "/scoreglyphs/flags64d.png");
- pix_clef_violin->load(FONT_PATH "clef_violin_big.png");
- pix_clef_bass->load(FONT_PATH "clef_bass_big.png");
+ pix_clef_violin->load(museGlobalShare + "/scoreglyphs/clef_violin_big.png");
+ pix_clef_bass->load(museGlobalShare + "/scoreglyphs/clef_bass_big.png");
for (int i=0;i<10;i++)
- pix_num[i].load(QString((string(FONT_PATH "")+IntToStr(i)+string(".png")).c_str()));
+ pix_num[i].load(museGlobalShare + "/scoreglyphs/"+QString(IntToStr(i).c_str())+".png");
pixmaps_loaded=true;
}
diff --git a/muse2/share/CMakeLists.txt b/muse2/share/CMakeLists.txt
index aeb7e4a1..44b02269 100644
--- a/muse2/share/CMakeLists.txt
+++ b/muse2/share/CMakeLists.txt
@@ -29,6 +29,7 @@ subdirs(
scripts
templates
wallpapers
+ scoreglyphs
locale
)
diff --git a/muse2/share/scoreglyphs/0.png b/muse2/share/scoreglyphs/0.png
new file mode 100644
index 00000000..55e80896
--- /dev/null
+++ b/muse2/share/scoreglyphs/0.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/1.png b/muse2/share/scoreglyphs/1.png
new file mode 100644
index 00000000..37cc2f4a
--- /dev/null
+++ b/muse2/share/scoreglyphs/1.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/2.png b/muse2/share/scoreglyphs/2.png
new file mode 100644
index 00000000..6fbf0b77
--- /dev/null
+++ b/muse2/share/scoreglyphs/2.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/3.png b/muse2/share/scoreglyphs/3.png
new file mode 100644
index 00000000..5b896cfe
--- /dev/null
+++ b/muse2/share/scoreglyphs/3.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/4.png b/muse2/share/scoreglyphs/4.png
new file mode 100644
index 00000000..895fc9dd
--- /dev/null
+++ b/muse2/share/scoreglyphs/4.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/5.png b/muse2/share/scoreglyphs/5.png
new file mode 100644
index 00000000..1214777c
--- /dev/null
+++ b/muse2/share/scoreglyphs/5.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/6.png b/muse2/share/scoreglyphs/6.png
new file mode 100644
index 00000000..1113e5b8
--- /dev/null
+++ b/muse2/share/scoreglyphs/6.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/7.png b/muse2/share/scoreglyphs/7.png
new file mode 100644
index 00000000..05e01f4f
--- /dev/null
+++ b/muse2/share/scoreglyphs/7.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/8.png b/muse2/share/scoreglyphs/8.png
new file mode 100644
index 00000000..a9967b92
--- /dev/null
+++ b/muse2/share/scoreglyphs/8.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/9.png b/muse2/share/scoreglyphs/9.png
new file mode 100644
index 00000000..d4a23a88
--- /dev/null
+++ b/muse2/share/scoreglyphs/9.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/CMakeLists.txt b/muse2/share/scoreglyphs/CMakeLists.txt
new file mode 100644
index 00000000..16617660
--- /dev/null
+++ b/muse2/share/scoreglyphs/CMakeLists.txt
@@ -0,0 +1,29 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+file (GLOB scoreglyph_files *.png LICENSE)
+
+subdirs( feta-original
+ )
+
+install( FILES ${scoreglyph_files}
+ DESTINATION ${MusE_SHARE_DIR}/scoreglyphs
+ )
+
diff --git a/muse2/share/scoreglyphs/LICENSE b/muse2/share/scoreglyphs/LICENSE
new file mode 100644
index 00000000..7ff14294
--- /dev/null
+++ b/muse2/share/scoreglyphs/LICENSE
@@ -0,0 +1,364 @@
+These images can be redistributed and/or modified under the terms
+of the GNU General Public License Version 2 as published by the
+Free Software Foundation.
+
+These images is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+CREDITS:
+these images were taken from lilypond's feta font on 28. March 2011.
+they're licensed under the GPL2, as is the feta font (and the whole
+lilypond project they belong to), see ./feta-original/COPYING-lilypond
+
+the relevant original files from the feta font can be found in ./feta-original/
+
+a copy of the GPL2, which applies to these images, is attached below:
+
+
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program 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 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/muse2/share/scoreglyphs/acc_b.png b/muse2/share/scoreglyphs/acc_b.png
new file mode 100644
index 00000000..1aa3f9e6
--- /dev/null
+++ b/muse2/share/scoreglyphs/acc_b.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/acc_none.png b/muse2/share/scoreglyphs/acc_none.png
new file mode 100644
index 00000000..a297eaf2
--- /dev/null
+++ b/muse2/share/scoreglyphs/acc_none.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/acc_sharp.png b/muse2/share/scoreglyphs/acc_sharp.png
new file mode 100644
index 00000000..0c8e9eb4
--- /dev/null
+++ b/muse2/share/scoreglyphs/acc_sharp.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/clef_bass_big.png b/muse2/share/scoreglyphs/clef_bass_big.png
new file mode 100644
index 00000000..e971a803
--- /dev/null
+++ b/muse2/share/scoreglyphs/clef_bass_big.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/clef_violin_big.png b/muse2/share/scoreglyphs/clef_violin_big.png
new file mode 100644
index 00000000..cb170746
--- /dev/null
+++ b/muse2/share/scoreglyphs/clef_violin_big.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/dot.png b/muse2/share/scoreglyphs/dot.png
new file mode 100644
index 00000000..e6f3a8f9
--- /dev/null
+++ b/muse2/share/scoreglyphs/dot.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/feta-original/CMakeLists.txt b/muse2/share/scoreglyphs/feta-original/CMakeLists.txt
new file mode 100644
index 00000000..e7c7b08a
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/CMakeLists.txt
@@ -0,0 +1,27 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+file (GLOB fetaorig_files *)
+
+
+install( FILES ${fetaorig_files}
+ DESTINATION ${MusE_SHARE_DIR}/scoreglyphs/feta-original
+ )
+
diff --git a/muse2/share/scoreglyphs/feta-original/COPYING-lilypond b/muse2/share/scoreglyphs/feta-original/COPYING-lilypond
new file mode 100644
index 00000000..32f7714f
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/COPYING-lilypond
@@ -0,0 +1,359 @@
+If you want to redistribute LilyPond, you must comply with the GNU
+General Public License (reproduced below). This license applies to
+LilyPond with the following exceptions:
+
+- It does not apply to example input files (which are in
+the subdirectory input/) that explicitly specify another license.
+
+- If you create a document which uses fonts included in LilyPond, and
+embed this font or unaltered portions of this font into the document,
+then this font does not by itself cause the resulting document to be
+covered by the GNU General Public License. This exception does not
+however invalidate any other reasons why the document might be covered
+by the GNU General Public License. If you modify this font, you may
+extend this exception to your version of the font, but you are not
+obligated to do so. If you do not wish to do so, delete this exception
+statement from your version.
+
+
+
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program 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 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/muse2/share/scoreglyphs/feta-original/GNUmakefile b/muse2/share/scoreglyphs/feta-original/GNUmakefile
new file mode 100644
index 00000000..389f7b9b
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/GNUmakefile
@@ -0,0 +1,198 @@
+# mf/GNUmakefile
+
+depth = ..
+
+STEPMAKE_TEMPLATES = metafont \
+ install \
+ install-out
+LOCALSTEPMAKE_TEMPLATES = lilypond
+
+include $(depth)/make/stepmake.make
+
+
+EXTRA_DIST_FILES += README mf2pt1.mp
+
+# We don't use $(MF_FILES), because there's more .mf cruft here
+FETA_MF_FILES = $(call src-wildcard,feta[0-9]*.mf) \
+ $(call src-wildcard,feta-braces-[a-z].mf) \
+ $(call src-wildcard,feta-alphabet*[0-9].mf) \
+ $(call src-wildcard,parmesan[0-9]*.mf)
+
+STAFF_SIZES = 11 13 14 16 18 20 23 26
+BRACES = a b c d e f g h i
+
+OTF_FILES = $(STAFF_SIZES:%=$(outdir)/emmentaler-%.otf) \
+ $(outdir)/aybabtu.otf
+PE_SCRIPTS = $(STAFF_SIZES:%=$(outdir)/emmentaler-%.pe)
+OTF_TABLES = $(STAFF_SIZES:%=$(outdir)/feta%.otf-table) \
+ $(BRACES:%=$(outdir)/feta-braces-%.otf-table)
+FETA_FONTS = $(FETA_MF_FILES:.mf=)
+SVG_FILES = $(OTF_FILES:%.otf=%.svg)
+
+FC_FIND = $(shell $(FCMATCH) --verbose 'Century Schoolbook L:style=$(1)' \
+ | grep 'file:' \
+ | sed 's/.*"\([^"]*\)".*/\1/g')
+
+NCSB_OTFS = $(addprefix $(outdir)/,CenturySchL-Ital.otf \
+ CenturySchL-BoldItal.otf \
+ CenturySchL-Roma.otf \
+ CenturySchL-Bold.otf)
+NCSB_INSTALL_DIR = $(local_lilypond_datadir)/fonts/otf
+
+LOG_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.log)
+LISP_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.lisp)
+ENC_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.enc)
+TFM_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.tfm)
+
+$(outdir)/aybabtu.otf-table: $(BRACES:%=$(outdir)/feta-braces-%.otf-table)
+ cat $^ > $@
+
+$(outdir)/aybabtu.otf-gtable: $(BRACES:%=$(outdir)/feta-braces-%.otf-gtable)
+ echo '(design_size . 20)' > $@
+
+
+# only for fonts which
+#
+# 1. are mentioned in font.scm
+#
+# 2. are not included with teTeX
+#
+
+$(outdir)/emmentaler-%.otf \
+$(outdir)/emmentaler-%.svg: $(outdir)/emmentaler-%.pe \
+ $(outdir)/feta%.pfb \
+ $(outdir)/feta-alphabet%.pfb \
+ $(outdir)/parmesan%.pfb \
+ $(outdir)/feta%.otf-table \
+ $(outdir)/feta%.otf-gtable
+ cd $(outdir) && $(FONTFORGE) -script $(notdir $(basename ,$@).pe)
+
+$(outdir)/aybabtu.otf \
+$(outdir)/aybabtu.svg: $(outdir)/aybabtu.pe \
+ $(foreach s,$(BRACES),$(outdir)/feta-braces-$(s).pfb) \
+ $(outdir)/aybabtu.otf-table $(outdir)/aybabtu.otf-gtable
+ cd $(outdir) && $(FONTFORGE) -script aybabtu.pe
+
+$(outdir)/%.pfb: $(outdir)/%.log
+
+$(outdir)/%.otf-table: $(outdir)/%.lisp
+ cat $< $(if $(findstring brace,$<),,$(subst feta,parmesan,$<)) \
+ $(if $(findstring brace,$<),,$(subst feta,feta-alphabet,$<)) > $@
+
+
+## ugh -- we want this to prevent failing -j2 compiles.
+$(outdir)/feta26.otf-table: $(outdir)/feta26.lisp \
+ $(outdir)/parmesan26.lisp \
+ $(outdir)/feta-alphabet26.lisp
+$(outdir)/feta23.otf-table: $(outdir)/feta23.lisp \
+ $(outdir)/parmesan23.lisp \
+ $(outdir)/feta-alphabet23.lisp
+$(outdir)/feta20.otf-table: $(outdir)/feta20.lisp \
+ $(outdir)/parmesan20.lisp \
+ $(outdir)/feta-alphabet20.lisp
+$(outdir)/feta18.otf-table: $(outdir)/feta18.lisp \
+ $(outdir)/parmesan18.lisp \
+ $(outdir)/feta-alphabet18.lisp
+$(outdir)/feta16.otf-table: $(outdir)/feta16.lisp \
+ $(outdir)/parmesan16.lisp \
+ $(outdir)/feta-alphabet16.lisp
+$(outdir)/feta14.otf-table: $(outdir)/feta14.lisp \
+ $(outdir)/parmesan14.lisp \
+ $(outdir)/feta-alphabet14.lisp
+$(outdir)/feta13.otf-table: $(outdir)/feta13.lisp \
+ $(outdir)/parmesan13.lisp \
+ $(outdir)/feta-alphabet13.lisp
+$(outdir)/feta11.otf-table: $(outdir)/feta11.lisp \
+ $(outdir)/parmesan11.lisp \
+ $(outdir)/feta-alphabet11.lisp
+
+$(outdir)/aybabtu.otf: $(outdir)/aybabtu.subfonts \
+ $(outdir)/aybabtu.fontname \
+ $(outdir)/aybabtu.otf-table \
+ $(outdir)/aybabtu.otf-gtable \
+ $(outdir)/aybabtu.pe
+
+$(outdir)/aybabtu.otf \
+$(outdir)/aybabtu.svg: $(BRACES:%=$(outdir)/feta-braces-%.pfb)
+
+$(outdir)/aybabtu.fontname:
+ echo -n 'aybabtu' > $@
+$(outdir)/aybabtu.subfonts:
+ echo $(subst .mf,,$(call src-wildcard,feta-braces-[a-z].mf)) > $@
+
+$(PE_SCRIPTS): $(buildscript-dir)/gen-emmentaler-scripts
+ $< --dir=$(outdir)
+
+ALL_FONTS = $(FETA_FONTS)
+PFB_FILES = $(ALL_FONTS:%=$(outdir)/%.pfb)
+
+# Make tfm files first, log files last,
+# so that normally log files aren't made twice
+ALL_GEN_FILES = $(LOG_FILES) \
+ $(ENC_FILES) \
+ $(LISP_FILES) \
+ $(OTF_TABLES) \
+ $(NCSB_OTFS) \
+ $(PFB_FILES) \
+ $(OTF_FILES) \
+ $(SVG_FILES)
+
+# PRE_INSTALL=$(MAKE) "$(ALL_GEN_FILES)"
+
+INSTALLATION_DIR = $(local_lilypond_datadir)/fonts/source
+INSTALLATION_FILES = $(MF_FILES)
+
+INSTALLATION_OUT_SUFFIXES = 1 2 3
+
+INSTALLATION_OUT_DIR1 = $(local_lilypond_datadir)/fonts/otf
+INSTALLATION_OUT_FILES1 = $(OTF_FILES) \
+ $(NCSB_OTFS)
+
+INSTALLATION_OUT_DIR2 = $(local_lilypond_datadir)/fonts/svg
+INSTALLATION_OUT_FILES2 = $(SVG_FILES)
+
+INSTALLATION_OUT_DIR3 = $(local_lilypond_datadir)/fonts/type1
+INSTALLATION_OUT_FILES3 = $(PFB_FILES)
+
+export MFINPUTS := .:$(MFINPUTS)
+
+
+default: $(ALL_GEN_FILES) \
+ $(outdir)/emmentaler-20.otf \
+ tree-regen \
+ $(outdir)/fonts.conf
+
+.PHONY: tree-regen
+
+# FIXME: temporary hack: must regenerate after building fonts
+tree-regen: $(ALL_GEN_FILES)
+ ${MAKE} -C $(top-build-dir) link-mf-tree
+
+##
+## todo: this also depends on .tfm, FIXME.
+$(outdir)/%.lisp \
+$(outdir)/%.otf-gtable \
+$(outdir)/%.enc \
+$(outdir)/%.pe: $(outdir)/%.log
+ $(buildscript-dir)/mf-to-table \
+ --global-lisp=$(outdir)/$(<F:.log=.otf-gtable) \
+ --lisp=$(outdir)/$(<F:.log=.lisp) \
+ --outdir=$(outdir) \
+ --enc $(outdir)/$(<F:.log=.enc) \
+ $<
+
+local-clean:
+ rm -f mfplain.mem mfplain.log
+ rm -f *.tfm *.log
+
+
+$(outdir)/fonts.conf:
+ echo '<fontconfig><dir>'$(shell cd $(outdir); pwd)'</dir></fontconfig>' > $@
+
+$(NCSB_OTFS): $(NCSB_SOURCE_FILES) \
+ $(auxscript-dir)/pfx2ttf.fontforge
+ $(foreach i, $(basename $(NCSB_SOURCE_FILES)), \
+ $(FONTFORGE) -script $(auxscript-dir)/pfx2ttf.fontforge \
+ $(i).pfb $(i).afm $(outdir)/ && ) true
+
+# eof
diff --git a/muse2/share/scoreglyphs/feta-original/README b/muse2/share/scoreglyphs/feta-original/README
new file mode 100644
index 00000000..9d52194b
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/README
@@ -0,0 +1,125 @@
+
+This is a font of music symbols. All MF sources are original. Most of the
+documentation is in comments in the MF code.
+
+Non-square pixels are not supported; with other words, the horizontal and
+vertical resolution of the output device must be the same.
+
+Currently, outline fonts are created by using `autotrace', but we are
+already in the process of converting the MF code directly to PostScript code
+with a tool called `mf2pt1', which in turn calls `FontForge' to postprocess
+the output (mainly to remove outline overlaps and to add hints).
+
+The recommended calling sequence of mf2pt1 is
+
+ mf2pt1 --rounding=0.0001 <other options> <font>
+
+You need mf2pt1 version 2.1 or newer.
+
+
+Here some guidelines to assure a clean conversion.
+
+. Never use `---'. Replace it with `--' together with explicit path
+ directions (if necessary).
+
+. Don't use self-intersecting outlines in general since they can confuse
+ mf2pt1's algorithm to get the orientation of a closed path. Note that
+ MetaPost's implementation of the `turningnumber' primitive (which would
+ immediately give the orientation of a path) is severely broken before
+ version 1.0 of MetaPost, thus some hand-made code in mf2pt1.mp is used
+ to work around this bug.
+
+. If outlines intersect, avoid grazing intersections. In case two outlines
+ intersect in an explicitly defined point, include this point in both
+ intersecting paths to avoid problems due to rounding errors.
+
+. Don't use `draw' with a polygonal pen but for straight lines (consisting
+ of exactly two points). In most cases it is quite easy to emulate `draw'
+ with an explicit definition of the outline or with `penstroke'.
+
+. Don't apply transformations after calling `fill' -- for example, don't
+ mirror `currentpicture'. Instead, transform the path and call `fill'
+ afterwards. This ensures that mf2pt1 gets the correct outline directions
+ which is a necessary prerequisite for FontForge's algorithm to remove
+ overlaps.
+
+
+Some glyph name rules:
+
+. Most glyph names have the form <group>.<name>, where <group> is defined
+ with the `fet_begingroup' command, and <name> is given with
+ `fet_beginchar' (within a `fet_begingroup' block). Example:
+ `clefs.vaticana.fa'.
+
+. Sometimes it would be sensible to use negative numbers in glyph names.
+ However, the `-' character shouldn't be used in a glyph name. Replace it
+ with `M'. For example, write `rests.M3mensural' instead of
+ `rests.-3mensural'.
+
+. Glyphs which exist in both an `up' and `down' version should start the
+ <name> part with either `u' or `d', respectively. Example: `flags.d3',
+ `flags.u3'. Glyphs which are neutral w.r.t. the direction, and where
+ members of the glyph group exist which have `up' and `down' versions,
+ should start with an `s'. Example: `noteheads.s0re'.
+
+
+Some design rules:
+
+. Always use smooth curve transitions. Since this is difficult to see in
+ MetaFont proof sheets (which don't show the tangents) I recommend to call
+ mf2pt1 like this
+
+ FONTFORGE=foo mf2pt1 ...
+
+ (`foo' should be a non-existent program; this avoids the default
+ postprocessing). Then call FontForge to inspect the outlines.
+
+. Use rounded corners.
+
+
+Hints for stem attachment:
+
+. Stem attachment of glyphs is controlled by two special variables called
+ `charwx' and `charwy'. Stems can be regarded as (very oblonged)
+ rectangles with slightly rounded corners. For stems pointing upwards the
+ lower right corner of this rectangle is attached to the glyph at position
+ (charwx, charwy). For stems pointing downwards it works analogously but
+ with the upper left corner, where the position of the attachment point is
+ additionally reflected horizontally about the center of the glyph -- this
+ ensures that in most cases charwx and charwy can be set to the same values
+ for up and down stems even though these are attached at the right/left end
+ of the note, respectively. To make this more precise, the upper left
+ corner of a down stem is attached at position (charwd/2 - charwx, charwy),
+ where `charwd' is an internal metafont variable representing the glyph
+ width as specified by the `set_char_box' command.
+
+. In case different stem attachments for upward and downward pointing stems
+ are needed, two separate glyphs must be defined in the Metafont file; of
+ course, this also applies if two entirely different shapes are needed.
+ These have the same name but are prefixed by `u' and `d', respectively
+ (for `up' and `down', obviously). In each of these glyphs the variables
+ charwx and charwy must be set accordingly. If, on the other hand, the
+ attachment point is the `same' for both directions (with the
+ abovementioned horizontal reflection taken into account), then the prefix
+ `s' (for `symmetric') should be used. See the existing files for
+ examples. The numbers in the glyph names refer to the duration of the
+ note; e.g., `s0cross' in feta-bolletjes.mf defines the notehead for a
+ whole cross-shaped note (similarly, `s1cross' and `s2cross' are for half
+ and quarter notes, respectively).
+
+
+Finally, some rules to assure that rasterization at low resolutions gives
+good results. Today, this is a minor issue, but in some cases it might show
+design flaws.
+
+. Use `define_whole_pixels' and friends where appropriate.
+
+. Use `hround' and `vround' consistently. A lot of auxiliary macros are
+ defined in feta-macros.mf.
+
+. If a path element is duplicated or shifted, use an integer value for the
+ offset.
+
+. Add `eps' for mirrored paths to assure correct MetaFont rasterization.
+ See the comment and the variables at the end of `feta-params.mf' for
+ details how vertical symmetry should be achieved.
diff --git a/muse2/share/scoreglyphs/feta-original/aybabtu.pe.in b/muse2/share/scoreglyphs/feta-original/aybabtu.pe.in
new file mode 100644
index 00000000..0130cff2
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/aybabtu.pe.in
@@ -0,0 +1,84 @@
+#!@FONTFORGE@
+# all your brace are belong to us
+
+Open("feta-braces-b.pfb");
+SelectAll();
+Scale(200, 0, 0);
+Generate("feta-braces-b.scale.pfb");
+
+Open("feta-braces-c.pfb");
+SelectAll();
+Scale(300, 0, 0);
+Generate("feta-braces-c.scale.pfb");
+
+Open("feta-braces-d.pfb");
+SelectAll();
+Scale(400, 0, 0);
+Generate("feta-braces-d.scale.pfb");
+
+Open("feta-braces-e.pfb");
+SelectAll();
+Scale(500, 0, 0);
+Generate("feta-braces-e.scale.pfb");
+
+Open("feta-braces-f.pfb");
+SelectAll();
+Scale(600, 0, 0);
+Generate("feta-braces-f.scale.pfb");
+
+Open("feta-braces-g.pfb");
+SelectAll();
+Scale(700, 0, 0);
+Generate("feta-braces-g.scale.pfb");
+
+Open("feta-braces-h.pfb");
+SelectAll();
+Scale(800, 0, 0);
+Generate("feta-braces-h.scale.pfb");
+
+Open("feta-braces-i.pfb");
+SelectAll();
+Scale(900, 0, 0);
+Generate("feta-braces-i.scale.pfb");
+
+
+New()
+
+MergeFonts("feta-braces-a.pfb");
+MergeFonts("feta-braces-b.scale.pfb");
+MergeFonts("feta-braces-c.scale.pfb");
+MergeFonts("feta-braces-d.scale.pfb");
+MergeFonts("feta-braces-e.scale.pfb");
+MergeFonts("feta-braces-f.scale.pfb");
+MergeFonts("feta-braces-g.scale.pfb");
+MergeFonts("feta-braces-h.scale.pfb");
+MergeFonts("feta-braces-i.scale.pfb");
+
+SetFontNames("Aybabtu-Regular", "Aybabtu", "Aybabtu Regular", "Regular", "GNU GPL", "@TOPLEVEL_VERSION@");
+
+i = 0;
+while (i < CharCnt())
+ Select(i);
+# crashes fontforge, use PUA for now -- jcn
+# SetUnicodeValue(i + 0xF0000, 0);
+/*
+PRIVATE AREA
+ In the BMP, the range 0xe000 to 0xf8ff will never be assigned to any
+ characters by the standard and is reserved for private usage. For the
+ Linux community, this private area has been subdivided further into the
+ range 0xe000 to 0xefff which can be used individually by any end-user
+ and the Linux zone in the range 0xf000 to 0xf8ff where extensions are
+ coordinated among all Linux users. The registry of the characters
+ assigned to the Linux zone is currently maintained by H. Peter Anvin
+ <Peter.Anvin@linux.org>.
+*/
+ SetUnicodeValue(i + 0xE000, 0);
+ ++i;
+endloop
+
+LoadTableFromFile("LILF", "aybabtu.subfonts")
+LoadTableFromFile("LILC", "aybabtu.otf-table")
+LoadTableFromFile("LILY", "aybabtu.otf-gtable")
+
+Generate("aybabtu.otf");
+Generate("aybabtu.svg");
diff --git a/muse2/share/scoreglyphs/feta-original/bigcheese.pe.in b/muse2/share/scoreglyphs/feta-original/bigcheese.pe.in
new file mode 100644
index 00000000..46b74f0a
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/bigcheese.pe.in
@@ -0,0 +1,44 @@
+#!@FONTFORGE@
+
+
+
+New();
+
+# Separate Feta versioning?
+# Naming: * expose LilyPond20/LilyPond rather than bigcheese
+# * using 20 as Weight works for gnome-font-select widget: gfs
+SetFontNames("bigcheese20", "LilyPond", "LilyPond BigCheese 20", "20", "GNU GPL", "@TOPLEVEL_VERSION@");
+
+MergeFonts("feta20.pfa");
+MergeFonts("parmesan20.pfa");
+
+# load nummer/din after setting PUA.
+i = 0;
+while (i < CharCnt())
+ Select(i);
+# crashes fontforge, use PUA for now -- jcn
+# SetUnicodeValue(i + 0xF0000, 0);
+/*
+PRIVATE AREA
+ In the BMP, the range 0xe000 to 0xf8ff will never be assigned to any
+ characters by the standard and is reserved for private usage. For the
+ Linux community, this private area has been subdivided further into the
+ range 0xe000 to 0xefff which can be used individually by any end-user
+ and the Linux zone in the range 0xf000 to 0xf8ff where extensions are
+ coordinated among all Linux users. The registry of the characters
+ assigned to the Linux zone is currently maintained by H. Peter Anvin
+ <Peter.Anvin@linux.org>.
+*/
+ SetUnicodeValue(i + 0xE000, 0);
+ ++i;
+endloop
+
+
+MergeFonts("feta-nummer10.pfa");
+MergeFonts("feta-din14.pfa");
+MergeKern("feta-din14.tfm");
+
+LoadTableFromFile("LILC", "feta20.otf-table")
+
+Generate("bigcheese20.otf");
+Generate("bigcheese20.cff");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-accordion.mf b/muse2/share/scoreglyphs/feta-original/feta-accordion.mf
new file mode 100644
index 00000000..f1058000
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-accordion.mf
@@ -0,0 +1,445 @@
+%
+% feta-accordion.mf -- draw accordion symbols
+%
+% source file of the GNU LilyPond music typesetter
+%
+% (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+fet_begingroup ("accordion");
+
+%
+% These dimensions are the same for all register symbols.
+% The different symbols should calculate their other dimensions from them.
+%
+
+accreg_dot_size# := .5 staff_space#;
+accreg_linethickness# := 1.3 stafflinethickness#;
+accreg_lh# := 1.0 staff_space#;
+
+define_pixels (accreg_dot_size, accreg_linethickness, accreg_lh);
+
+
+fet_beginchar ("accDiscant", "accDiscant")
+ save r, pat, lh, lt;
+ path pat;
+
+ r# = 3/2 accreg_lh#;
+ define_pixels (r);
+
+ set_char_box (r# + accreg_linethickness# / 2,
+ r# + accreg_linethickness# / 2,
+ 0, 2 r# + 0.7 accreg_linethickness#);
+
+ lh = vround (2/3 r);
+ lt = vround (0.7 accreg_linethickness);
+
+ h := 3 lh + lt;
+ b := w := (3 lh + hround accreg_linethickness) / 2;
+
+ penpos1 (hround accreg_linethickness, 0);
+ penpos2 (lt, 90);
+ penpos3 (hround accreg_linethickness, 180);
+ penpos4 (lt, 270);
+
+ z1r = (w, h / 2);
+ z2r = (0, h);
+ z3r = (-b, h / 2);
+ z4r = (0, 0);
+
+ penlabels (1, 2, 3, 4);
+
+ % mf doesn't handle pixel dropouts in outline objects, so we use
+ % `draw' if not called by mpost
+ if known miterlimit:
+ fill z1r
+ .. z2r
+ .. z3r
+ .. z4r
+ .. cycle;
+ unfill z1l
+ .. z2l
+ .. z3l
+ .. z4l
+ .. cycle;
+ else:
+ pickup pencircle xscaled accreg_linethickness yscaled lt;
+ draw z1
+ .. z2
+ .. z3
+ .. z4
+ .. cycle;
+ fi;
+
+ pat := z4{right}
+ .. z1{up}
+ .. {left}z2;
+
+ pickup penrazor scaled lt rotated 90;
+
+ top z5 = pat intersectionpoint ((0, lh + lt) -- (w, lh + lt));
+ z6 = z5 xscaled -1;
+ bot z7 = pat intersectionpoint ((0, 2 lh) -- (w, 2 lh));
+ z8 = z7 xscaled -1;
+
+ labels (5, 6, 7, 8);
+
+ draw z5
+ -- z6;
+ draw z7
+ -- z8;
+fet_endchar;
+
+
+fet_beginchar ("accDot", "accDot")
+ set_char_box (accreg_dot_size# / 2, accreg_dot_size# / 2,
+ accreg_dot_size# / 2, accreg_dot_size# / 2);
+
+ pickup pencircle scaled accreg_dot_size;
+
+ rt x0 = hround (accreg_dot_size / 2);
+ top y0 = vround (accreg_dot_size / 2);
+
+ drawdot z0;
+fet_endchar;
+
+
+fet_beginchar ("accFreebase", "accFreebase")
+ save r, lh, lt;
+
+ r# = accreg_lh#;
+ define_pixels (r);
+
+ set_char_box (r# + accreg_linethickness# / 2,
+ r# + accreg_linethickness# / 2,
+ 0, 2 r# + 0.7 accreg_linethickness#);
+
+ lh = vround r;
+ lt = vround (0.7 accreg_linethickness);
+
+ h := 2 lh + lt;
+ b := w := (2 lh + hround accreg_linethickness) / 2;
+
+ penpos1 (hround accreg_linethickness, 0);
+ penpos2 (lt, 90);
+ penpos3 (accreg_linethickness, 180);
+ penpos4 (lt, 270);
+
+ z1r = (w, h / 2);
+ z2r = (0, h);
+ z3r = (-b, h / 2);
+ z4r = (0, 0);
+
+ penlabels (1, 2, 3, 4);
+
+ % mf doesn't handle pixel dropouts in outline objects, so we use
+ % `draw' if not called by mpost
+ if known miterlimit:
+ fill z1r
+ .. z2r
+ .. z3r
+ .. z4r
+ .. cycle;
+ unfill z1l
+ .. z2l
+ .. z3l
+ .. z4l
+ .. cycle;
+ else:
+ pickup pencircle xscaled accreg_linethickness yscaled lt;
+ draw z1
+ .. z2
+ .. z3
+ .. z4
+ .. cycle;
+ fi;
+
+ pickup penrazor scaled lt rotated 90;
+
+ draw z1
+ -- z3;
+fet_endchar;
+
+
+fet_beginchar ("accStdbase", "accStdbase")
+ save r, p, lh, lt;
+ path pat;
+
+ r# = 2 accreg_lh#;
+ define_pixels (r);
+
+ set_char_box (r# + accreg_linethickness# / 2,
+ r# + accreg_linethickness# / 2,
+ 0, 2 r# + 0.7 accreg_linethickness#);
+
+ lh = vround (1/2 r);
+ lt = vround (0.7 accreg_linethickness);
+
+ h := 4 lh + lt;
+ b := w := (4 lh + hround accreg_linethickness) / 2;
+
+ penpos1 (hround accreg_linethickness, 0);
+ penpos2 (lt, 90);
+ penpos3 (hround accreg_linethickness, 180);
+ penpos4 (lt, 270);
+
+ z1r = (w, h / 2);
+ z2r = (0, h);
+ z3r = (-b, h / 2);
+ z4r = (0, 0);
+
+ penlabels (1, 2, 3, 4);
+
+ % mf doesn't handle pixel dropouts in outline objects, so we use
+ % `draw' if not called by mpost
+ if known miterlimit:
+ fill z1r
+ .. z2r
+ .. z3r
+ .. z4r
+ .. cycle;
+ unfill z1l
+ .. z2l
+ .. z3l
+ .. z4l
+ .. cycle;
+ else:
+ pickup pencircle xscaled accreg_linethickness yscaled lt;
+ draw z1
+ .. z2
+ .. z3
+ .. z4
+ .. cycle;
+ fi;
+
+ pat := z4{right}
+ .. z1{up}
+ .. {left}z2;
+
+ pickup penrazor scaled lt rotated 90;
+
+ top z5 = pat intersectionpoint ((0, lh + lt) -- (w, lh + lt));
+ z6 = z5 xscaled -1;
+ bot z7 = pat intersectionpoint ((0, 3 lh) -- (w, 3 lh));
+ z8 = z7 xscaled -1;
+
+ labels (5, 6, 7, 8);
+
+ draw z1
+ -- z3;
+ draw z5
+ -- z6;
+ draw z7
+ -- z8;
+fet_endchar;
+
+
+fet_beginchar ("accBayanbase", "accBayanbase")
+ save lh, lt;
+
+ lh = vround accreg_lh;
+ lt = vround accreg_linethickness;
+
+ set_char_box (accreg_lh# + accreg_linethickness# / 2,
+ accreg_lh# + accreg_linethickness# / 2,
+ 0, 3 accreg_lh# + accreg_linethickness#);
+
+ h := 3 lh + lt;
+
+ draw_rounded_block ((-w, 0), (-w + lt, h), lt);
+ draw_rounded_block ((w - lt, 0), (w, h), lt);
+
+ pickup penrazor scaled lt rotated 90;
+
+ bot z1 = (-w + lt / 2, 0);
+ bot z2 = (-w + lt / 2, lh);
+ bot z3 = (-w + lt / 2, 2 lh);
+ bot z4 = (-w + lt / 2, 3 lh);
+
+ bot z5 = (w - lt / 2, 0);
+ bot z6 = (w - lt / 2, lh);
+ bot z7 = (w - lt / 2, 2 lh);
+ bot z8 = (w - lt / 2, 3 lh);
+
+ draw z1
+ -- z5;
+ draw z2
+ -- z6;
+ draw z3
+ -- z7;
+ draw z4
+ -- z8;
+fet_endchar;
+
+
+def def_B (expr w, h) =
+ pickup pencircle scaled 0.15 linethickness;
+
+ penpos10 (thin, -90);
+ penpos11 (thin, -90);
+ penpos12 (thick, 0);
+ penpos13 (thin, 90);
+ penpos14 (thin, 90);
+
+ penpos15 (thick, 180);
+ penpos16 (thin, -90);
+ penpos17 (thin, -90);
+ penpos18 (thick, 0);
+ penpos19 (thick, 0);
+
+ z10 = (0, 0);
+ z11 = (cOne * w, 0);
+ z12 = (w, .5 mb * h);
+ z13 = (cTwo * w, mb * h);
+ z14 = (2 thick, mb * h);
+ z15 = (.94 w, h - .5 mt * h);
+ z16 = z13 + (0, mt * h);
+ z17 = (0, h);
+ z18 = (1.5 thick, 0);
+ z19 = (1.5 thick, h);
+enddef;
+
+
+def def_S (expr w, h) =
+ pickup pencircle scaled 0.03 linethickness;
+
+ penpos1 (thin, 180);
+ penpos2 (thin, -90);
+ penpos3 (thick, 0);
+ penpos4 (.5 thick, 90);
+ penpos5 (thick, 0);
+ penpos6 (thin, -90);
+ penpos7 (thin, 180);
+ penpos8 (thin, 180);
+ penpos9 (thin, 0);
+
+ z1 = (0, hs);
+ z2 = (w / 2, 0);
+ z3 = (w - .5 thick, .5 mb * h);
+ z4 = (w / 2, mb * h);
+ z5 = (.5 thick, h - .5 mt * h);
+ z6 = (w / 2, h);
+ z7 = (w, h - hs);
+ z8 = (0, y2r);
+ z9 = (w, y6l);
+
+ path bue, bueoverst;
+
+ bue := z2{left}
+ .. z1{up};
+
+ t := xpart (bue intersectiontimes (z8l -- z7l));
+
+ bueoverst := z6{right}
+ .. z7{down};
+enddef;
+
+
+def def_some_vars =
+ save hs, mb, mt, thin, thick, height, width, cOne, cTwo;
+ save bx, hx;
+
+ width = .8 (4 staff_space);
+ height = 2.4 staff_space;
+ % URG. smaller sizes should be wider and fatter
+ % thin = 0.05 staff_space;
+ % thick = 0.2 staff_space;
+
+ 4 hx + bx = 1.15;
+ 10 hx + bx = 1;
+ fatten := designsize * hx + bx * 1.2;
+ thick := 0.2 staff_space * fatten;
+
+ % urg: mustn't ever go thinner than blot!
+ thin# := blot_diameter#;
+ define_pixels (thin);
+
+ hs = 0.4 staff_space;
+ mb = .53;
+ mt = .47;
+ cOne = 0.65;
+ cTwo = 0.60;
+enddef;
+
+
+fet_beginchar ("accOldEE", "accOldEE")
+ save r, pp, ir, lh, lt, stroke_width;
+
+ r# = staff_space#;
+ define_pixels (r);
+
+ lr = .4 staff_space - linethickness;
+ ir = .6 staff_space;
+ stroke_width = .05 staff_space + .5 linethickness;
+
+ set_char_box (r# + accreg_linethickness# / 2,
+ r# + accreg_linethickness# / 2,
+ 0, 2 r# + 0.7 accreg_linethickness#);
+
+ z1 = (0, 0);
+ z2 = (0, ir);
+ z3 = (0, -ir);
+
+ penpos1 (blot_diameter, 0);
+ penpos2 (stroke_width + blot_diameter, 0);
+ penpos3 (stroke_width + blot_diameter, 0);
+
+ pickup pencircle scaled (lr + blot_diameter);
+
+ for pp := 0 step 45 until 135:
+ drawdot z2 rotated pp;
+ drawdot z3 rotated pp;
+
+ penstroke (z2e
+ -- z1e
+ -- z3e) rotated pp;
+ endfor;
+
+ pickup pencircle scaled lr;
+
+ drawdot (0, 0);
+
+ currentpicture := currentpicture shifted (0, h / 2);
+
+ lh = vround (2 r);
+ lt = vround (0.7 accreg_linethickness);
+
+ h := lh + lt;
+ b := w := (lh + hround accreg_linethickness) / 2;
+
+ penpos10 (hround accreg_linethickness, 0);
+ penpos11 (lt, 90);
+ penpos12 (hround accreg_linethickness, 180);
+ penpos13 (lt, 270);
+
+ z10r = (w, h / 2);
+ z11r = (0, h);
+ z12r = (-b, h / 2);
+ z13r = (0, 0);
+
+ % penlabels (1, 2, 10, 11, 12, 13);
+
+ % mf doesn't handle pixel dropouts in outline objects, so we use
+ % `draw' if not called by mpost
+ if known miterlimit:
+ fill z10r
+ .. z11r
+ .. z12r
+ .. z13r
+ .. cycle;
+ unfill z10l
+ .. z11l
+ .. z12l
+ .. z13l
+ .. cycle;
+ else:
+ pickup pencircle xscaled accreg_linethickness yscaled lt;
+ draw z10
+ .. z11
+ .. z12
+ .. z13
+ .. cycle;
+ fi;
+fet_endchar;
+
+
+fet_endgroup ("accordion");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-alphabet.mf b/muse2/share/scoreglyphs/feta-original/feta-alphabet.mf
new file mode 100644
index 00000000..c3d1f09f
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-alphabet.mf
@@ -0,0 +1,19 @@
+test := 0;
+
+staffsize# := design_size * pt#;
+
+input feta-autometric;
+input feta-macros;
+input feta-params;
+
+fet_beginfont ("feta-alphabet", design_size, "fetaNumber");
+
+mode_setup;
+
+number_design_size := design_size / 2;
+dynamic_design_size := 14 design_size / 20;
+
+input feta-nummer-code;
+input feta-din-code;
+
+fet_endfont ("feta-nummer");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-alphabet11.mf b/muse2/share/scoreglyphs/feta-original/feta-alphabet11.mf
new file mode 100644
index 00000000..04ba4e38
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-alphabet11.mf
@@ -0,0 +1,6 @@
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 11.22;
+input feta-alphabet;
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-alphabet13.mf b/muse2/share/scoreglyphs/feta-original/feta-alphabet13.mf
new file mode 100644
index 00000000..d314f40d
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-alphabet13.mf
@@ -0,0 +1,6 @@
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 12.60;
+input feta-alphabet;
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-alphabet14.mf b/muse2/share/scoreglyphs/feta-original/feta-alphabet14.mf
new file mode 100644
index 00000000..9a1bd2ee
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-alphabet14.mf
@@ -0,0 +1,6 @@
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 14.14;
+input feta-alphabet;
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-alphabet16.mf b/muse2/share/scoreglyphs/feta-original/feta-alphabet16.mf
new file mode 100644
index 00000000..86eb9c8c
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-alphabet16.mf
@@ -0,0 +1,6 @@
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 15.87;
+input feta-alphabet;
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-alphabet18.mf b/muse2/share/scoreglyphs/feta-original/feta-alphabet18.mf
new file mode 100644
index 00000000..db216c15
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-alphabet18.mf
@@ -0,0 +1,6 @@
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 17.82;
+input feta-alphabet;
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-alphabet20.mf b/muse2/share/scoreglyphs/feta-original/feta-alphabet20.mf
new file mode 100644
index 00000000..0affe390
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-alphabet20.mf
@@ -0,0 +1,7 @@
+% feta-alphabet20.mf
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 20;
+input feta-alphabet;
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-alphabet23.mf b/muse2/share/scoreglyphs/feta-original/feta-alphabet23.mf
new file mode 100644
index 00000000..c8a725e5
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-alphabet23.mf
@@ -0,0 +1,7 @@
+% feta-alphabet23.mf
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 22.45;
+input feta-alphabet;
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-alphabet26.mf b/muse2/share/scoreglyphs/feta-original/feta-alphabet26.mf
new file mode 100644
index 00000000..71af0403
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-alphabet26.mf
@@ -0,0 +1,6 @@
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 25.20;
+input feta-alphabet;
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-arrow.mf b/muse2/share/scoreglyphs/feta-original/feta-arrow.mf
new file mode 100644
index 00000000..f0c39c78
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-arrow.mf
@@ -0,0 +1,169 @@
+%
+% feta-arrow.mf -- draw arrow heads
+%
+% source file of the GNU LilyPond music typesetter
+%
+% (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+fet_begingroup ("arrowheads");
+
+%
+% To consider: we could put arrow heads at their real Unicode locations.
+%
+
+%
+% Set up paths for upper half of arrow head pointing right.
+% CLOSE_PATH is for a closed arrow, OPEN_PATH is for the open arrow.
+% OPEN_TENSION sets the tension for the part which forms the path in
+% OPEN_PATH.
+%
+
+def set_arrow_paths (expr width, height, open_tension, arrowlinethickness) =
+ save pat, finalpath;
+ save tip_angle_o, tip_angle_c, tip_dir_c, tip_dir_o;
+ save indent;
+ path pat, open_path, close_path;
+ pair tip_dir_o, tip_dir_c;
+
+ pickup pencircle scaled arrowlinethickness;
+
+ indent = linethickness / 2;
+
+ lft x1 = -width;
+ x2 = 0;
+ top y1 = height;
+ y2 = 0;
+
+ z4 = z3;
+ y5 = 0;
+ x5 = x4 + indent;
+
+ pat := z1
+ ..tension open_tension.. z2{right};
+ penpos2 (arrowlinethickness, 90);
+ tip_dir_o := direction 0.0 of pat;
+ tip_angle_o := angle (tip_dir_o);
+ penpos1 (arrowlinethickness, 90 + tip_angle_o);
+ z3 = z1;
+ penpos3 (arrowlinethickness, tip_angle_o);
+
+ open_path := z1r{tip_dir_o}
+ .. z2r{right}
+ .. z2l{left}
+ .. z1l{-tip_dir_o}
+ .. z3l
+ .. cycle;
+
+ pat := z4
+ .. z5{down};
+ tip_dir_c := direction 0.0 of pat;
+ tip_angle_c := angle (tip_dir_c);
+ penpos4 (arrowlinethickness, 90+ tip_angle_c);
+ penpos5 (arrowlinethickness, 0);
+ z6 = z5;
+ penpos6 (arrowlinethickness, 90);
+
+ close_path := z4l{tip_dir_c}
+ .. z5l{down}
+ .. z6l{right}
+ .. z2l{right}
+ .. z2r{left}
+ ..tension open_tension.. z1r{-tip_dir_o}
+ .. z3l
+ .. cycle;
+enddef;
+
+
+fet_beginchar ("open", "open.01");
+ set_char_box (staff_space#, 1.6 linethickness# / 2,
+ 0.5 staff_space#, 0.5 staff_space#);
+ set_arrow_paths (staff_space, 0.5 staff_space,
+ 1.0, 1.6 linethickness);
+ fill open_path;
+ open_path := open_path yscaled -1;
+ fill open_path;
+
+ penlabels (1, 2, 3);
+ penlabels (4, 5, 6);
+fet_endchar;
+
+
+fet_beginchar ("open", "open.0M1");
+ set_char_box (1.6 linethickness# / 2, staff_space#,
+ 0.5 staff_space#, 0.5 staff_space#);
+ set_arrow_paths (staff_space, 0.5 staff_space,
+ 1.0, 1.6 linethickness);
+ fill open_path;
+ open_path := open_path yscaled -1;
+ fill open_path;
+ currentpicture := currentpicture xscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("open", "open.11");
+ set_char_box (.5 staff_space#, .5 staff_space#,
+ 1.0 staff_space#, 1.6 linethickness# / 2);
+ set_arrow_paths (staff_space, 0.5 staff_space,
+ 1.0, 1.6 linethickness);
+ fill open_path;
+ open_path := open_path yscaled -1;
+ fill open_path;
+ currentpicture := currentpicture rotated 90;
+fet_endchar;
+
+
+fet_beginchar ("open", "open.1M1");
+ set_char_box (.5 staff_space#, .5 staff_space#,
+ 1.6 linethickness# / 2, 1.0 staff_space#);
+ set_arrow_paths (staff_space, 0.5 staff_space,
+ 1.0, 1.6 linethickness);
+ fill open_path;
+ open_path := open_path yscaled -1;
+ fill open_path;
+ currentpicture := currentpicture rotated 90;
+ currentpicture := currentpicture yscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("close", "close.01");
+ set_char_box (staff_space#, 0, 0.5 staff_space#, 0.5 staff_space#);
+ set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
+ fill close_path;
+ close_path := close_path yscaled -1;
+ fill close_path;
+fet_endchar;
+
+
+fet_beginchar ("close", "close.0M1");
+ set_char_box (0, staff_space#, 0.5 staff_space#, 0.5 staff_space#);
+ set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
+ fill close_path;
+ close_path := close_path yscaled -1;
+ fill close_path;
+ currentpicture := currentpicture xscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("close", "close.11");
+ set_char_box (.5 staff_space#, .5 staff_space#,
+ 1.0 staff_space#, 0.0 staff_space#);
+ set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
+ fill close_path;
+ close_path := close_path yscaled -1;
+ fill close_path;
+ currentpicture := currentpicture rotated 90;
+fet_endchar;
+
+
+fet_beginchar ("close", "close.1M1");
+ set_char_box (.5 staff_space#, .5 staff_space#,
+ 0.0 staff_space#, 1.0 staff_space#);
+ set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
+ fill close_path;
+ close_path := close_path yscaled -1;
+ fill close_path;
+ currentpicture := currentpicture rotated -90;
+fet_endchar;
+
+
+fet_endgroup ("arrowheads");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-autometric.mf b/muse2/share/scoreglyphs/feta-original/feta-autometric.mf
new file mode 100644
index 00000000..24a0e1b9
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-autometric.mf
@@ -0,0 +1,255 @@
+%
+% autometric.mf -- administrative MF routines
+%
+% source file of the Feta (not an acronym for Font-En-Tja)
+% pretty-but-neat music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% Jan Nieuwenhuizen <janneke@gnu.org>
+%
+% These macros help create ascii logging output
+% to automate generation of the lily tables.
+% The output should be parsed by the mf-to-table script.
+
+
+message "******************************************************";
+message "Using feta Autometric macros.";
+message "order of messages: ";
+message " NAME/CODE/BP/WD/DP/HT/WX/WY";
+message "******************************************************";
+message "";
+
+
+% font or database?
+def fet_beginfont (expr name, size, encod) =
+ font_identifier := name & decimal size;
+ font_size size;
+ font_coding_scheme "asis";
+ message "@{font@:GNU@:LilyPond@:" & name
+ & "@:" & decimal size
+ & "@:" & encod
+ & "@}";
+ message "";
+enddef;
+
+
+def fet_endfont =
+ message "@{tnof@}";
+enddef;
+
+
+% group or table?
+def fet_begingroup (expr name) =
+begingroup;
+ save feta_group;
+ string feta_group;
+
+ feta_group := name;
+
+ message "@{group@:" & feta_group
+ & "@}";
+ message "";
+enddef;
+
+
+def fet_endgroup (expr name) =
+ message "@{puorg@:" & name
+ & "@}";
+ message "";
+endgroup;
+enddef;
+
+
+def autometric_parameter (expr name, value) =
+ message "@{parameter@:" & name
+ & "@:" & decimal value
+ & "@}";
+enddef;
+
+
+def autometric_output_char =
+ message "@{char@:" & charnamestr
+ & "@:" & decimal charcode
+ & "@:" & decimal charbp
+ & "@:" & decimal charwd
+ & "@:" & decimal chardp
+ & "@:" & decimal charht
+ & "@:" & decimal charwx
+ & "@:" & decimal charwy
+ & "@:" & idstr
+ & "@}";
+enddef;
+
+
+def hround_pixels (expr sharped) =
+ hround (sharped * hppp)
+enddef;
+
+
+def vround_pixels (expr sharped) =
+ vround (sharped * vppp)
+enddef;
+
+
+def tand (expr alpha) =
+ (sind alpha / cosd alpha)
+enddef;
+
+
+def to_bp (expr num) =
+ decimal (num * bp_per_pixel)
+enddef;
+
+
+% breapth, width, depth, height
+% breapth x-depth
+def set_char_box (expr b_sharp, w_sharp, d_sharp, h_sharp) =
+ save scharbp, scharht, scharwd, schardp;
+
+ % some paranoia if someone calls set_char_box (charwd, charbp, ...)
+ scharbp := b_sharp;
+ scharht := h_sharp;
+ schardp := d_sharp;
+ scharwd := w_sharp;
+
+ charbp := scharbp;
+ charht := scharht;
+ chardp := schardp;
+ charwd := scharwd;
+
+ w := hround (w_sharp * hppp);
+ b := hround (b_sharp * hppp);
+ h := vround (h_sharp * vppp);
+ d := vround (d_sharp * vppp);
+
+ charwx := charwd;
+ charwy := 0;
+
+ % additions for mf2pt1 (`bbox' is called `glyph_dimensions' starting
+ % with version 2.4.2)
+ if known bp_per_pixel:
+ special "% MF2PT1: bbox "
+ & to_bp (-b) & " "
+ & to_bp (-d) & " "
+ & to_bp (w) & " "
+ & to_bp (h);
+ special "% MF2PT1: glyph_dimensions "
+ & to_bp (-b) & " "
+ & to_bp (-d) & " "
+ & to_bp (w) & " "
+ & to_bp (h);
+ special "% MF2PT1: font_size " & decimal designsize;
+ special "% MF2PT1: font_slant " & decimal font_slant_;
+
+ for fvar = "font_identifier",
+ "font_coding_scheme",
+ "font_version",
+ "font_comment",
+ "font_family",
+ "font_weight",
+ "font_unique_id",
+ "font_name":
+ if known scantokens (fvar & "_"):
+ special "% MF2PT1: "
+ & fvar & " "
+ & scantokens (fvar & "_");
+ fi;
+ endfor;
+
+ for fvar = "font_underline_position",
+ "font_underline_thickness":
+ if known scantokens (fvar & "_"):
+ special "% MF2PT1: "
+ & fvar & " "
+ & scantokens ("decimal " & fvar & "_");
+ fi;
+ endfor;
+
+ special "% MF2PT1: font_fixed_pitch "
+ & (if font_fixed_pitch_: "1" else: "0" fi);
+
+ % this must come after the `font_size' special
+ special "% MF2PT1: charwd " & decimal charwd;
+ fi;
+enddef;
+
+
+def no_dimen_beginchar (expr c) =
+begingroup;
+ charcode := if known c: byte c else: 0; fi;
+ charic := 0;
+ clearxy;
+ clearit;
+ clearpen;
+ scantokens extra_beginchar;
+enddef;
+
+
+%
+% we leave the ctrl characters alone.
+%
+code := 32;
+
+
+% starts just as plain mf's beginchar:
+% charcode,
+% and then adds:
+% charname see below
+% id index in lily's table
+
+% The dimensions are uninitialised; you should use set_char_box manually.
+def fet_beginchar (expr name, id_lit) =
+ save idstr, charnamestr;
+ save charbp;
+ save w, b, h, d;
+ save charwx, charwy;
+
+ string idstr, charnamestr;
+ charnamestr := name;
+ idstr := id_lit;
+
+ % addition for mf2pt1
+ if known bp_per_pixel:
+ if known feta_group:
+ special "% MF2PT1: glyph_name "
+ & feta_group & "." & idstr;
+ else:
+ special "% MF2PT1: glyph_name " & idstr;
+ fi;
+ fi;
+
+ no_dimen_beginchar (incr code) name;
+enddef;
+
+
+def makebox_with_breapth (text r) =
+ for y = -d, 0, h:
+ r ((-b, y), (w, y));
+ endfor;
+
+ for x = -b, 0, w:
+ r ( (x, -d), (x, h));
+ endfor;
+enddef;
+
+
+%
+% override plain endchar. We want a different box.
+%
+def breapth_endchar =
+ scantokens extra_endchar;
+
+ if proofing > 0:
+ makebox_with_breapth (proofrule);
+ fi;
+
+ chardx := (w + b); % what the heck is chardx
+ shipit;
+endgroup;
+enddef;
+
+
+def fet_endchar =
+ autometric_output_char;
+ breapth_endchar;
+enddef;
diff --git a/muse2/share/scoreglyphs/feta-original/feta-banier.mf b/muse2/share/scoreglyphs/feta-original/feta-banier.mf
new file mode 100644
index 00000000..46b3b061
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-banier.mf
@@ -0,0 +1,550 @@
+%
+% feta-banier.mf -- draw flags
+%
+% source file of the GNU LilyPond music typesetter
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+fet_begingroup ("flags");
+
+save outer_path;
+path outer_path;
+
+%
+% Flags pointing down overlap with the notehead (in x-direction), so
+% the down-flag can be bigger.
+%
+
+upflag_width# = .65 black_notehead_width# + stemthickness# / 2;
+downflag_width# = .833 black_notehead_width# + stemthickness# / 2;
+
+right_upflag_space# = .0 upflag_width#;
+right_downflag_space# = .0 downflag_width#;
+
+%
+% Flags pointing down cannot overlap with the notehead in y-direction,
+% so they have less slant.
+%
+% Because of optical illusion, the utmost flag (bottom for
+% down-pointing, top for up-pointing) should be smaller than the other
+% flags. Adobe Sonata doesn't do this correctly. (Instead they have
+% an extension flag, which looks less elegant.)
+%
+
+save hip_thickness, foot_thickness;
+
+hip_thickness# = 1.0 linethickness# + 0.069 staff_space#;
+foot_thickness# = 1.2055 linethickness# + 0.06 staff_space#;
+
+define_pixels (hip_thickness, foot_thickness);
+
+%
+% Inspired by Adobe Sonata and [Wanske].
+% For example, see POSTSCRIPT Language -- program design,
+% page 119, and [Wanske], p 41, 42.
+%
+
+def draw_flag (expr center, flare, dims, hip_depth, foot_wid,
+ hip_thickness, foot_thickness, show_labels) =
+ save c;
+
+ clearxy;
+
+ c = 0.7;
+
+ penpos1 (flare, 90);
+ penpos2 (whatever, 0);
+
+ x2r - x2l = hround (hip_thickness);
+
+ penpos3 (foot_thickness, -20.0);
+
+ z1r = center;
+ z2r = center + (xpart (dims), -ypart (dims) * hip_depth);
+ z3r = center + (xpart (dims) * foot_wid, -ypart (dims));
+
+ x2r := hround x2r;
+ y2r := vround y2r;
+
+ outer_path := z3r{curl c}
+ .. z2r{up}
+ .. {up}z1r;
+
+ if show_labels = 1:
+ penlabels (1, 2, 3);
+ fi;
+
+ fill z1l{curl 0}
+ ..tension 1.1.. z2l{down}
+ .. {curl c}simple_serif (z3l, z3r, 80)
+ & outer_path
+ & z1r
+ -- cycle;
+enddef;
+
+%
+% TODO: calculate intersectpoint (see TeX book, p. 137)
+% TODO: calculate incision_depth
+%
+
+def add_flag (expr yoff, flare, hip_wid_multiplier, hip_dep_multiplier,
+ intersectpoint, hip_thickness, foot_thickness) =
+begingroup
+ save prev_center, prev_xextreme, prev_yextreme;
+ save rel_foot, ip, center, incision_depth;
+ save prev_hipwid, prev_footdep, prev_hipdep, wid, dep, hip_dep;
+ save hip_dep_ratio, foot_wid_ratio;
+ pair prev_center, center, foot, prev_xextreme, prev_yextreme;
+ pair ip, rel_foot;
+
+ incision_depth = 1.013;
+ prev_center = point 2 of outer_path;
+ prev_xextreme = point 1 of outer_path;
+ prev_yextreme = point 0 of outer_path;
+ prev_hipwid = xpart (prev_xextreme - prev_center);
+ prev_footdep = -ypart (prev_yextreme - prev_center);
+ prev_hipdep = -ypart (prev_xextreme - prev_center);
+ ip = point intersectpoint of outer_path;
+
+ wid = prev_hipwid * hip_wid_multiplier;
+ hip_dep = prev_hipdep * hip_dep_multiplier;
+
+ center = prev_center + (0, yoff);
+ rel_foot = incision_depth [(wid, hip_dep), ip - center];
+ dep = -ypart (rel_foot);
+ foot_wid_ratio = xpart (rel_foot) / wid;
+ hip_dep_ratio = hip_dep / dep;
+
+ draw_flag (center, flare, (wid, dep),
+ hip_dep_ratio, foot_wid_ratio,
+ hip_thickness, foot_thickness, 0);
+endgroup
+enddef;
+
+
+fet_beginchar ("8th Flag (up)", "u3");
+ save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+
+ flare = staff_space;
+ hip_depth_ratio = .72;
+ foot_width_ratio = .8;
+ hip_width# = upflag_width# - hip_thickness# / 2;
+ foot_depth# = 3 staff_space# - blot_diameter# / 2;
+ define_pixels (hip_width, foot_depth);
+
+ set_char_box (0,
+ hip_width# + stemthickness# / 2 + right_upflag_space#,
+ foot_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+ draw_flag ((0,0), flare, (hip_width, foot_depth),
+ hip_depth_ratio, foot_width_ratio,
+ hip_thickness, foot_thickness, 1);
+
+ draw_square_block ((-0.5 stemthickness_rounded, -staff_space_rounded),
+ (0, 0));
+fet_endchar;
+
+
+fet_beginchar ("16th Flag (up)", "u4");
+ save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+ save flagspace, total_depth, flag_count;
+
+ total_depth# = 3.5 staff_space# - blot_diameter# / 2;
+ flag_count = 2;
+ flare = .85 staff_space;
+ flagspace# = .85 staff_space#;
+ hip_depth_ratio = .72;
+ hip_width# = upflag_width# - hip_thickness# / 2;
+ flagspace# + foot_depth# = total_depth#;
+ foot_width_ratio = .8;
+ define_pixels (hip_width, foot_depth);
+ define_whole_vertical_pixels (flagspace);
+
+ set_char_box (0,
+ hip_width# + stemthickness# / 2 + right_upflag_space#,
+ total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+ draw_flag ((0, -flagspace), flare, (hip_width, foot_depth),
+ hip_depth_ratio, foot_width_ratio,
+ hip_thickness, foot_thickness, 1);
+
+ add_flag (flagspace, flare, .97, 1.00, 1.25,
+ hip_thickness, foot_thickness);
+
+ draw_square_block ((-0.5 stemthickness_rounded, 0),
+ (0, -2 staff_space_rounded));
+fet_endchar;
+
+
+fet_beginchar ("32nd Flag (up)", "u5");
+ save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+ save flagspace, total_depth, flag_count;
+
+ flag_count = 3;
+ total_depth# = 4.25 staff_space#;
+ flare = .85 staff_space;
+ flagspace# = .87 staff_space#;
+ hip_depth_ratio = .72;
+ hip_width# = upflag_width# - hip_thickness# / 2;
+ foot_width_ratio = .8;
+
+ (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+ define_pixels (hip_width, foot_depth);
+ define_whole_vertical_pixels (flagspace);
+
+ set_char_box (0, hip_width# + right_upflag_space#,
+ total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+ draw_flag ((0, -2 flagspace), flare, (hip_width, foot_depth),
+ hip_depth_ratio, foot_width_ratio,
+ hip_thickness, foot_thickness, 1);
+
+ add_flag (flagspace, flare, .97, 1.00, 1.25,
+ hip_thickness, foot_thickness);
+ add_flag (flagspace, flare, .95, 1.05, 1.25,
+ hip_thickness, foot_thickness);
+
+ draw_square_block ((-0.5 stemthickness_rounded, 0),
+ (0, -3 staff_space_rounded));
+fet_endchar;
+
+
+fet_beginchar ("64th Flag (up)", "u6");
+ save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+ save flagspace, total_depth, flag_count;
+
+ flag_count = 4;
+ flare = .85 staff_space;
+ flagspace# = .9 staff_space#;
+ hip_depth_ratio = .72;
+ hip_width# = upflag_width# - hip_thickness# / 2;
+ total_depth# = 5.25 staff_space#;
+ foot_width_ratio = .8;
+
+ (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+ define_pixels (hip_width, foot_depth);
+ define_whole_vertical_pixels (flagspace);
+
+ set_char_box (0, hip_width# + right_upflag_space#,
+ total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+ draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+ (hip_width, foot_depth),
+ hip_depth_ratio, foot_width_ratio,
+ hip_thickness, foot_thickness, 1);
+
+ add_flag (flagspace, flare, .97, 1.00, 1.3,
+ hip_thickness, foot_thickness);
+ add_flag (flagspace, flare, 1.00, 1.00, 1.25,
+ hip_thickness, foot_thickness);
+ add_flag (flagspace, flare, .95, 1.05, 1.25,
+ hip_thickness, foot_thickness);
+
+ draw_square_block ((-0.5 stemthickness_rounded, 0),
+ (0, -4 staff_space_rounded));
+fet_endchar;
+
+
+fet_beginchar ("128th Flag (up)", "u7");
+ save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+ save flagspace, total_depth, flag_count;
+
+ flag_count = 5;
+ flare = .85 staff_space;
+ flagspace# = .93 staff_space#;
+ hip_depth_ratio = .72;
+ hip_width# = upflag_width# - hip_thickness# / 2;
+ total_depth# = 6.25 staff_space#;
+ foot_width_ratio = .8;
+
+ (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+ define_pixels (hip_width, foot_depth);
+ define_whole_vertical_pixels (flagspace);
+
+ set_char_box (0, hip_width# + right_upflag_space#,
+ total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+ draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+ (hip_width, foot_depth),
+ hip_depth_ratio, foot_width_ratio,
+ hip_thickness, foot_thickness, 1);
+
+ add_flag (flagspace, flare, .97, 1.00, 1.3,
+ hip_thickness, foot_thickness);
+ add_flag (flagspace, flare, 1.00, 1.00, 1.25,
+ hip_thickness, foot_thickness);
+ add_flag (flagspace, flare, 1.00, 1.00, 1.25,
+ hip_thickness, foot_thickness);
+ add_flag (flagspace, flare, 0.95, 1.05, 1.25,
+ hip_thickness, foot_thickness);
+
+ draw_square_block ((-0.5 stemthickness_rounded, 0),
+ (0, -5 staff_space_rounded));
+fet_endchar;
+
+
+fet_beginchar ("8th (down)", "d3");
+ save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+ save flagspace, total_depth, flag_count;
+
+ flag_count = 1;
+ flare = staff_space;
+ flagspace# = .9 staff_space#;
+ hip_depth_ratio = .72;
+ hip_width# = downflag_width# - hip_thickness# / 2;
+ total_depth# = 2.85 staff_space#;
+ foot_width_ratio = .8;
+
+ (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+ define_pixels (hip_width, flagspace, foot_depth);
+
+ set_char_box (0, hip_width# + right_downflag_space#,
+ total_depth# + foot_thickness# / 2, stemthickness# / 2)
+
+ draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+ (hip_width, foot_depth),
+ hip_depth_ratio, foot_width_ratio,
+ hip_thickness, foot_thickness, 0);
+
+ draw_square_block ((-0.5 stemthickness_rounded, 0),
+ (0, -staff_space_rounded));
+
+ y_mirror_char;
+fet_endchar;
+
+
+%%%%%%%%
+%
+% Single Stroke for Short Appogiatura
+%
+
+fet_beginchar ("grace dash (up)", "ugrace");
+ save flare, hip_depth_ratio, hip_width, foot_depth;
+
+ hip_depth_ratio = .72;
+ flare# = staff_space#;
+ hip_width# = upflag_width# - hip_thickness# / 2;
+ foot_depth# = 3 staff_space#;
+
+ define_pixels (hip_width, foot_depth);
+
+ set_char_box (hip_width# * hip_depth_ratio,
+ hip_width# + right_upflag_space#,
+ foot_depth# * hip_depth_ratio, -flare#)
+
+ pickup pencircle scaled 1.5 stemthickness;
+
+ z1 = (-b, -d);
+ z2 = (w, h);
+
+ penpos1 (1.5 stemthickness, angle (z2 - z1) - 90);
+ penpos2 (1.5 stemthickness, angle (z2 - z1) - 90);
+
+ fill z1l
+ -- z2l
+ .. top z2
+ .. rt z2
+ .. z2r
+ -- z1r
+ .. bot z1
+ .. lft z1
+ .. cycle;
+
+ penlabels (1, 2);
+fet_endchar;
+
+
+fet_beginchar ("grace dash (down)", "dgrace");
+ save flare, hip_depth_ratio, hip_width, foot_depth;
+ save total_depth;
+
+ hip_depth_ratio = .72 ;
+ flare# = .99 staff_space#;
+ hip_width# = downflag_width# - hip_thickness# / 2;
+ total_depth# = 2.85 staff_space#;
+ foot_depth# = total_depth#;
+ foot_width_ratio = .8;
+
+ define_pixels (hip_width, foot_depth);
+
+ set_char_box (hip_width# * hip_depth_ratio,
+ hip_width# + right_downflag_space#,
+ foot_depth# * hip_depth_ratio, -flare#)
+
+ pickup pencircle scaled 1.5 stemthickness;
+
+ z1 = (-b, -d);
+ z2 = (w, h);
+
+ penpos1 (1.5 stemthickness, angle (z2 - z1) - 90);
+ penpos2 (1.5 stemthickness, angle (z2 - z1) - 90);
+
+ fill z1l
+ -- z2l
+ .. top z2
+ .. rt z2
+ .. z2r
+ -- z1r
+ .. bot z1
+ .. lft z1
+ .. cycle;
+
+ y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("16th (down)", "d4");
+ save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+ save flagspace, total_depth, flag_count;
+
+ flag_count = 2;
+ flare = .8 staff_space;
+ flagspace# = .9 staff_space#;
+ hip_depth_ratio = .85;
+ hip_width# = downflag_width# - hip_thickness# / 2;
+ total_depth# = 3.0 staff_space# - blot_diameter# / 2;
+ foot_width_ratio = .95;
+
+ (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+ set_char_box (0, hip_width# + right_downflag_space#,
+ total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+ define_pixels (hip_width, foot_depth);
+ define_whole_vertical_pixels (flagspace);
+
+ draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+ (hip_width, foot_depth),
+ hip_depth_ratio, foot_width_ratio,
+ hip_thickness, foot_thickness, 0);
+
+ add_flag (flagspace, flare, .95, 1.00, 1.25,
+ hip_thickness, foot_thickness);
+
+ draw_square_block ((-0.5 stemthickness_rounded, 0),
+ (0, -2 staff_space_rounded));
+
+ y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("32nd (down)", "d5");
+ save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+ save flagspace, total_depth, flag_count;
+
+ flag_count = 3;
+ flare = .84 staff_space;
+ flagspace# = .9 staff_space#;
+ hip_depth_ratio = .85;
+ hip_width# = downflag_width# - hip_thickness# / 2;
+ total_depth# = 3.85 staff_space#;
+ foot_width_ratio = .95;
+
+ (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+ define_pixels (hip_width, foot_depth);
+ define_whole_vertical_pixels (flagspace);
+
+ set_char_box (0, hip_width# + right_downflag_space#,
+ total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+ draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+ (hip_width, foot_depth),
+ hip_depth_ratio, foot_width_ratio,
+ hip_thickness, foot_thickness, 0);
+
+ add_flag (flagspace, flare, .97, 1.00, 1.25,
+ hip_thickness, foot_thickness);
+ add_flag (flagspace, flare, .95, 1.05, 1.25,
+ hip_thickness, foot_thickness);
+
+ draw_square_block ((-0.5 stemthickness_rounded, 0),
+ (0, -3 staff_space_rounded));
+
+ y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("64th (down)", "d6");
+ save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+ save flagspace, total_depth, flag_count;
+
+ flag_count = 4;
+ flare = .8 staff_space;
+ flagspace# = .9 staff_space#;
+ hip_depth_ratio = .85;
+ hip_width# = downflag_width# - hip_thickness# / 2;
+ total_depth# = 4.35 staff_space#;
+ foot_width_ratio = .98;
+
+ (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+ define_pixels (hip_width, foot_depth);
+ define_whole_vertical_pixels (flagspace);
+
+ set_char_box (0, hip_width# + right_downflag_space#,
+ total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+ draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+ (hip_width, foot_depth),
+ hip_depth_ratio, foot_width_ratio,
+ hip_thickness, foot_thickness, 0);
+
+ add_flag (flagspace, flare, .97, 1.20, 1.175,
+ hip_thickness, foot_thickness);
+ add_flag (flagspace, flare, .97, 1.10, 1.175,
+ hip_thickness, foot_thickness);
+ add_flag (.98 flagspace, flare, .91, 1.05, 1.2,
+ hip_thickness, foot_thickness);
+
+ draw_square_block ((-0.5 stemthickness_rounded, 0),
+ (0, -4 staff_space_rounded));
+
+ y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("128th (down)", "d7");
+ save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+ save flagspace, total_depth, flag_count;
+
+ flag_count = 5;
+ flare = .8 staff_space;
+ flagspace# = .9 staff_space#;
+ hip_depth_ratio = .85;
+ hip_width# = downflag_width# - hip_thickness# / 2;
+ total_depth# = 5.25 staff_space#;
+ foot_width_ratio = .98;
+
+ (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+ define_pixels (hip_width, foot_depth);
+ define_whole_vertical_pixels (flagspace);
+
+ set_char_box (0, hip_width# + right_downflag_space#,
+ total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+ draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+ (hip_width, foot_depth),
+ hip_depth_ratio, foot_width_ratio,
+ hip_thickness, foot_thickness, 0);
+
+ add_flag (flagspace, flare, .97, 1.20, 1.175,
+ hip_thickness, foot_thickness);
+ add_flag (flagspace, flare, .97, 1.10, 1.175,
+ hip_thickness, foot_thickness);
+ add_flag (.98 flagspace, flare, .91, 1.05, 1.2,
+ hip_thickness, foot_thickness);
+ add_flag (.98 flagspace, flare, .91, 1.05, 1.2,
+ hip_thickness, foot_thickness);
+
+ draw_square_block ((-0.5 stemthickness_rounded, 0),
+ (0, -5 staff_space_rounded));
+
+ y_mirror_char;
+fet_endchar;
+
+fet_endgroup ("flags");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-beugel.mf b/muse2/share/scoreglyphs/feta-original/feta-beugel.mf
new file mode 100644
index 00000000..c61f756d
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-beugel.mf
@@ -0,0 +1,147 @@
+%
+% feta-beugel.mf -- Staff braces
+%
+% source file of the Feta (not an acronym for Font-En-Tja)
+% pretty-but-neat music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% Jan Nieuwenhuizen <janneke@gnu.org>
+
+
+% We have to reduce the pixel-per-point value to
+% support large brace glyphs in case we are using MetaPost
+% (which by default sets `hppp' to 49.80244, regardless of
+% the used `mag' value)
+
+if known miterlimit:
+ bpppix_ := 0.2; % ten times larger than original
+
+ numeric mm, pt, dd, bp, cm, pc, cc, in;
+
+ mm * bpppix_ = 2.83464;
+ pt * bpppix_ = 0.99626;
+ dd * bpppix_ = 1.06601;
+ bp * bpppix_ = 1;
+ cm * bpppix_ = 28.34645;
+ pc * bpppix_ = 11.95517;
+ cc * bpppix_ = 12.79213;
+ in * bpppix_ = 72;
+
+ hppp := pt;
+ vppp := pt;
+fi;
+
+
+input feta-autometric;
+input feta-macros;
+
+staffsize# := 20 pt#; %% arbitrary
+
+input feta-params;
+
+%
+% We must let the design increase for each font to make sure that mftrace
+% doesn't jack up the resolution too highly for the longer braces.
+%
+
+fet_beginfont ("feta-braces-" & char (97 + font_count),
+ (font_count + 1) * 20, "fetaBraces");
+
+mode_setup;
+
+
+save code, braces_per_font;
+code := 64;
+braces_per_font := 64;
+
+def draw_brace (expr height_sharp, width_sharp, slt_sharp, brace_number) =
+ save pendir, height, width, thin, thick, slt, pat;
+ save penangle;
+ pair pendir;
+ path pat;
+
+ height# := height_sharp;
+ width# := width_sharp;
+ slt# := slt_sharp;
+
+ fet_beginchar ("brace number " & decimal (brace_number),
+ "brace" & decimal (brace_number))
+ set_char_box (width#, 0, height# / 2, height# / 2);
+
+ define_pixels (height, width, slt);
+ thin = 2 slt;
+ thick = .5 width;
+
+ z2 = .5 [z1, z3];
+ y3l = y1 + height / 2;
+ x3 = x1 + width;
+ y1 = 0;
+ x1 = -b;
+ y0 = y1;
+ x0 = x1 - 2/6 thin;
+
+ pendir = unitvector (x3 - x1, y3l / 6 - y1);
+ penangle = angle pendir - 90;
+ penpos3 (thin, penangle);
+ penpos2 (thick, angle (z3 - z1) - 90);
+ penpos1 (2/3 thin, penangle);
+
+ penlabels (1, 2, 3);
+ labels (0);
+
+ pat := z2r
+ .. simple_serif (z3r, z3l, 90)
+ .. z2l
+ .. z1l{dir (angle (z1r - z1l) - 90)}
+ .. z0{down}
+ .. z1r{-dir (angle (z1l - z1r) + 90)}
+ .. cycle;
+ pat := subpath (0, 5) of pat
+ -- subpath (6, 7) of pat
+ .. cycle;
+
+ fill pat;
+ fill pat yscaled -1;
+ fet_endchar;
+enddef;
+
+
+save stafflinethickness;
+save increment;
+
+linethickness := 0.5 pt#;
+increment := 0.5 pt#;
+y := 10 pt#;
+
+for i := 0 step 1 until font_count:
+ save number;
+
+ number := braces_per_font * i;
+
+ for j := 0 step 1 until (braces_per_font - 1):
+ % message "l: "&decimal l;
+ % note: define_pixels (x) multiplies x by hppp,
+ % must never get bigger than infinity
+ y := y + increment;
+ if y > infinity / hppp:
+ message "Resolution and/or magnification is too high";
+ message "HPPP: "& decimal hppp &" Y: " & decimal y;
+ errmessage "please report to <bug-lilypond@gnu.org>";
+ fi;
+
+ % x should be about one staff space, taking brace to have
+ % default height of 3 staffs, this yields height / 3 / 4 = 12
+ % but 15 looks better
+ x := y / 15;
+
+ increment := x / 10;
+ linethickness := min (0.5 pt#, y / 150);
+ if i = font_count:
+ draw_brace (y, x, linethickness, number);
+ fi;
+
+ number := number + 1;
+ endfor;
+endfor;
+
+fet_endfont ("feta-braces");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-bolletjes.mf b/muse2/share/scoreglyphs/feta-original/feta-bolletjes.mf
new file mode 100644
index 00000000..fcda6009
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-bolletjes.mf
@@ -0,0 +1,1497 @@
+% -*-Fundamental-*-
+% feta-bolletjes.mf -- implement noteheads
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+% & Han-Wen Nienhuys <hanwen@xs4all.nl>
+% & Juergen Reuter <reuter@ipd.uka.de>
+%
+
+test_outlines := 0;
+
+
+save remember_pic;
+picture remember_pic;
+
+
+% Most beautiful noteheads are pronounced, not circular,
+% and not even symmetric.
+% These examples are inspired by [Wanske]; see literature list.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% NOTE HEAD VARIABLES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+save black_notehead_width, noteheight;
+save half_notehead_width, whole_notehead_width, slash_thick;
+save slash_slope, overdone_heads, solfa_noteheight;
+
+numeric noteheight;
+numeric slash_thick;
+numeric black_notehead_width;
+numeric whole_notehead_width;
+numeric half_notehead_width;
+
+
+fet_begingroup ("noteheads");
+
+
+% Slope of slash. From scm/grob-description.scm. How to auto-copy?
+slash_slope := 1.7;
+
+% Thickness of slash lines. Quarter notes get 1.5slt width.
+slash_thick# := 2/3 * 0.48 staff_space#;
+
+
+%
+% Hand-engraved music often has balls extending above and below
+% the lines. If you like that, modify overdone heads (unit:
+% stafflinethickness).
+%
+overdone_heads = 0.0;
+noteheight# := staff_space# + (1 + overdone_heads) * stafflinethickness#;
+
+
+%
+% solfa heads should not overlap on chords.
+%
+solfa_noteheight# := staff_space# - stafflinethickness#;
+
+define_pixels (slash_thick);
+define_whole_vertical_pixels (noteheight);
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SLANT moves both extrema on the long axis (by SLANT * ELLIPTICITY,
+% so SLANT = -1, puts the extreme on the long axis next to the short
+% axis one).
+%
+
+def draw_outside_ellipse (expr ellipticity, tilt, superness, slant) =
+ save attachment_y;
+ save pat;
+ path pat;
+
+ pat := superellipse ((ellipticity, 0), (-slant * ellipticity, 1.0),
+ (-ellipticity, 0), (slant * ellipticity, -1.0),
+ superness);
+ pat := pat rotated tilt;
+
+ save top_point, right_point;
+ pair top_point, right_point;
+
+ top_point := directionpoint left of pat;
+ right_point := directionpoint up of pat;
+
+ save scaling, width;
+
+ scaling# = noteheight# / (2 ypart (top_point));
+ width# := 2 xpart (right_point) * scaling#;
+ define_pixels (scaling, width);
+
+ set_char_box (0, width#, noteheight# / 2, noteheight# / 2);
+
+ d := d - feta_space_shift;
+
+ % attachment Y
+ charwy := ypart (right_point) * scaling#;
+ charwx := width#;
+
+ pat := pat scaled scaling shifted (w / 2, .5 (h - d));
+
+ width := hround width;
+
+ if test_outlines = 1:
+ draw pat;
+ else:
+ fill pat;
+ fi;
+enddef;
+
+
+def undraw_inside_ellipse (expr ellipticity, tilt, superness, clearance) =
+begingroup
+ save pat;
+ path pat;
+
+ pat := superellipse ((ellipticity, 0), (0, 1.0),
+ (-ellipticity, 0), (0, -1.0),
+ superness);
+ pat := pat rotated tilt;
+
+ save top_point, right_point;
+ pair top_point, right_point;
+
+ top_point := directionpoint left of pat;
+ right_point := directionpoint up of pat;
+
+ save height, scaling;
+
+ height# = staff_space# + stafflinethickness# - clearance;
+ scaling# = height# / (2 ypart (top_point));
+ define_pixels (scaling);
+ pat := pat scaled scaling shifted (w / 2, .5 (h - d));
+
+ if test_outlines = 1:
+ draw pat;
+ else:
+ unfill pat;
+ fi
+endgroup;
+enddef;
+
+
+%
+% dimensions aren't entirely right.
+%
+def draw_longa (expr up) =
+ save stemthick, fudge;
+
+ stemthick# = 2 stafflinethickness#;
+ define_whole_blacker_pixels (stemthick);
+
+ fudge = hround (blot_diameter / 2);
+
+ draw_outside_ellipse (1.80, 0, 0.707, 0);
+ undraw_inside_ellipse (1.30, 125, 0.68, 2 stafflinethickness#);
+
+ pickup pencircle scaled stemthick;
+
+ if up:
+ bot y1 = -d;
+ top y2 = h;
+ rt x1 - fudge = 0;
+ x1 = x2;
+
+ fudge + lft x3 = w;
+ x4 = x3;
+ top y4 = h + 3.0 staff_space;
+ y3 = y1;
+ else:
+ bot y1 = -d - 3.0 staff_space;
+ top y2 = h;
+ rt x1 - fudge = 0;
+ x1 = x2;
+
+ fudge + lft x3 = w;
+ x4 = x3;
+ y4 = y2;
+ bot y3 = -d;
+ fi;
+
+ draw_gridline (z1, z2, stemthick);
+ draw_gridline (z3, z4, stemthick);
+
+ labels (1, 2, 3, 4);
+enddef;
+
+
+fet_beginchar ("Longa notehead", "uM2");
+ draw_longa (true);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+fet_beginchar ("Longa notehead", "dM2");
+ draw_longa (false);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Longa notehead", "uM2");
+ draw_longa (true);
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+
+ fet_beginchar ("Longa notehead", "dM2");
+ draw_longa (false);
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+%
+% dimensions aren't entirely right.
+%
+def draw_brevis =
+ save stemthick, fudge;
+
+ stemthick# = 2 stafflinethickness#;
+ define_whole_blacker_pixels (stemthick);
+
+ fudge = hround (blot_diameter / 2);
+
+ draw_outside_ellipse (1.80, 0, 0.707, 0);
+ undraw_inside_ellipse (1.30, 125, 0.68, 2 stafflinethickness#);
+
+ pickup pencircle scaled stemthick;
+
+ bot y1 = -d;
+ top y2 = h;
+ rt x1 - fudge = 0;
+ x1 = x2;
+
+ fudge + lft x3 = w;
+ x4 = x3;
+ y4 = y2;
+ y3 = y1;
+
+ draw_gridline (z1, z2, stemthick);
+ draw_gridline (z3, z4, stemthick);
+enddef;
+
+
+fet_beginchar ("Brevis notehead", "sM1");
+ draw_brevis;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Brevis notehead", "sM1");
+ draw_brevis;
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+fet_beginchar ("Whole notehead", "s0");
+ draw_outside_ellipse (1.80 - puff_up_factor / 3.0, 0, 0.707, 0);
+ undraw_inside_ellipse (1.30, 125 - puff_up_factor * 10,
+ 0.68, 2 stafflinethickness#);
+
+ whole_notehead_width# := charwd;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Whole notehead", "s0");
+ draw_outside_ellipse (1.80 - puff_up_factor / 3.0, 0,
+ 0.707, 0);
+ undraw_inside_ellipse (1.30, 125 - puff_up_factor * 10,
+ 0.68, 2 stafflinethickness#);
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+fet_beginchar ("Half notehead", "s1");
+ draw_outside_ellipse (1.53 - puff_up_factor / 3.0, 34, 0.66, 0.17);
+ undraw_inside_ellipse (3.25, 33, 0.81, 2.5 stafflinethickness#);
+
+ half_notehead_width# := charwd;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Half notehead", "s1");
+ draw_outside_ellipse (1.53 - puff_up_factor / 3.0, 34,
+ 0.66, 0.17);
+ undraw_inside_ellipse (3.25, 33, 0.81,
+ 2.5 stafflinethickness#);
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+fet_beginchar ("Quart notehead", "s2");
+ % used to have 32. With 31, they are slightly bolder.
+ draw_outside_ellipse (1.49 - puff_up_factor / 3.0, 31, 0.707, 0);
+ black_notehead_width# := charwd;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Quart notehead", "s2");
+ draw_outside_ellipse (1.49 - puff_up_factor / 3.0, 31,
+ 0.707, 0);
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+fet_beginchar ("Whole diamondhead", "s0diamond");
+ draw_outside_ellipse (1.80, 0, 0.495, 0);
+ undraw_inside_ellipse (1.30, 125, 0.6,
+ .4 staff_space# + stafflinethickness#);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Whole diamondhead", "s0diamond");
+ draw_outside_ellipse (1.80, 0, 0.495, 0);
+ undraw_inside_ellipse (1.30, 125, 0.6,
+ .4 staff_space# + stafflinethickness#);
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+fet_beginchar ("Half diamondhead", "s1diamond");
+ draw_outside_ellipse (1.50, 34, 0.49, 0.17);
+ undraw_inside_ellipse (3.5, 33, 0.80,
+ .3 staff_space# + 1.5 stafflinethickness#);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Half diamondhead", "s1diamond");
+ draw_outside_ellipse (1.50, 34, 0.49, 0.17);
+ undraw_inside_ellipse (3.5, 33, 0.80,
+ .3 staff_space#
+ + 1.5 stafflinethickness#);
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+fet_beginchar ("Quart diamondhead", "s2diamond");
+ draw_outside_ellipse (1.80, 35, 0.495, -0.25);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Quart diamondhead", "s2diamond");
+ draw_outside_ellipse (1.80, 35, 0.495, -0.25);
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+vardef penposx@# (expr d) =
+begingroup;
+ save pat;
+ path pat;
+
+ pat = top z@#
+ .. lft z@#
+ .. bot z@#
+ .. rt z@#
+ .. cycle;
+ z@#l = pat intersectionpoint (z@# -- infinity * dir (d + 180));
+ z@#r = pat intersectionpoint (z@# -- infinity * dir (d));
+endgroup
+enddef;
+
+
+%
+% UGH: xs not declared as argument.
+%
+def define_triangle_shape (expr stemdir) =
+ save triangle_a, triangle_b, triangle_c;
+ save triangle_out_a, triangle_out_b, triangle_out_c;
+ save triangle_in, triangle_out;
+ save width, depth, height;
+ save origin, left_up_dir;
+ save exact_left_point, exact_right_point, exact_down_point;
+
+ path triangle_a, triangle_b, triangle_c;
+ path triangle_out_a, triangle_out_b, triangle_out_c;
+ path triangle_in, triangle_out;
+ pair origin, left_up_dir;
+ pair exact_down_point, exact_left_point, exact_right_point;
+
+ save pen_thick;
+ pen_thick# = stafflinethickness# + .1 staff_space#;
+ define_pixels (llap);
+ define_blacker_pixels (pen_thick);
+
+ left_up_dir = llap# * dir (90 + tilt);
+
+ xpart (left_up_dir) * xs - (pen_thick# * xs) / 2 + xpart origin = 0;
+ ypart origin = 0;
+
+ exact_left_point := origin + (left_up_dir xscaled xs);
+ exact_down_point := origin + (left_up_dir rotated 120 xscaled xs);
+ exact_right_point := origin + (left_up_dir rotated 240 xscaled xs);
+
+ height# = ypart (exact_left_point + origin) + pen_thick# / 2;
+ depth# = -ypart (exact_down_point + origin) + pen_thick# / 2;
+ width# = xpart (exact_right_point - exact_left_point)
+ + pen_thick# * xs;
+
+ set_char_box (0, width#, depth#, height#);
+
+ % Formerly, the shape has simply been drawn with an elliptical pen
+ % (`scaled pen_thick xscaled xs'), but the envelope of such a curve
+ % is of 6th degree. For the sake of mf2pt1, we approximate it.
+
+ pickup pencircle scaled pen_thick xscaled xs;
+
+ z0 = (hround_pixels (xpart origin), 0);
+
+ z1 = z1' = z0 + llap * dir (90 + tilt) xscaled xs;
+ z2 = z2' = z0 + llap * dir (90 + tilt + 120) xscaled xs;
+ z3 = z3' = z0 + llap * dir (90 + tilt + 240) xscaled xs;
+
+ z12 = caveness [.5[z1, z2], z3];
+ z23 = caveness [.5[z2, z3], z1];
+ z31 = caveness [.5[z3, z1], z2];
+
+ triangle_a = z1 .. z12 .. z2;
+ triangle_b = z2 .. z23 .. z3;
+ triangle_c = z3 .. z31 .. z1;
+
+ penposx1 (angle (direction 0 of triangle_a) - 90);
+ penposx2 (angle (direction 0 of triangle_b) - 90);
+ penposx3 (angle (direction 0 of triangle_c) - 90);
+
+ penposx1' (angle (direction infinity of triangle_c) + 90);
+ penposx2' (angle (direction infinity of triangle_a) + 90);
+ penposx3' (angle (direction infinity of triangle_b) + 90);
+
+ penposx12 (angle (z12 - z0));
+ penposx23 (angle (z23 - z0));
+ penposx31 (angle (z31 - z0));
+
+ z10 = (z0 -- z1) intersectionpoint (z1l .. z12l .. z2'r);
+ z20 = (z0 -- z2) intersectionpoint (z2l .. z23l .. z3'r);
+ z30 = (z0 -- z3) intersectionpoint (z3l .. z31l .. z1'r);
+
+ triangle_in = z10
+ .. z12l
+ .. z20
+ & z20
+ .. z23l
+ .. z30
+ & z30
+ .. z31l
+ .. z10
+ & cycle;
+
+ triangle_out_a = z1r .. z12r .. z2'l;
+ triangle_out_b = z2r .. z23r .. z3'l;
+ triangle_out_c = z3r .. z31r .. z1'l;
+
+ triangle_out = top z1
+ .. lft z1
+ .. z1r{direction 0 of triangle_out_a}
+ & triangle_out_a
+ & {direction infinity of triangle_out_a}z2'l
+ .. lft z2
+ .. bot z2
+ .. z2r{direction 0 of triangle_out_b}
+ & triangle_out_b
+ & {direction infinity of triangle_out_b}z3'l
+ .. rt z3
+ .. top z3
+ .. z3r{direction 0 of triangle_out_c}
+ & triangle_out_c
+ & {direction infinity of triangle_out_c}z1'l
+ .. cycle;
+
+ labels (0, 10, 20, 30);
+ penlabels (1, 1', 2, 2', 3, 3', 12, 23, 31);
+
+ % attachment Y
+ if stemdir = 1:
+ charwy := ypart exact_right_point;
+ charwx := xpart exact_right_point + .5 pen_thick# * xs;
+ else:
+ charwy := -ypart exact_down_point;
+ charwx := width# - (xpart exact_down_point - .5 pen_thick# * xs);
+ fi
+enddef;
+
+
+def draw_whole_triangle_head =
+ save hei, xs;
+ save llap;
+ save tilt;
+
+ tilt = 40;
+ llap# = 3/4 noteheight#;
+
+ xs = 1.5;
+ caveness := 0.1;
+ define_triangle_shape (1);
+ fill triangle_out;
+ unfill triangle_in;
+enddef;
+
+
+fet_beginchar ("Whole trianglehead", "s0triangle");
+ draw_whole_triangle_head;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Whole trianglehead", "s0triangle");
+ draw_whole_triangle_head;
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+def draw_small_triangle_head (expr dir) =
+ save hei, xs;
+ save llap;
+ save tilt;
+
+ tilt = 40;
+ llap# = 2/3 noteheight#;
+ xs = 1.2;
+ caveness := 0.1;
+ define_triangle_shape (dir);
+
+ pickup feta_fillpen;
+
+ filldraw triangle_out;
+ unfilldraw triangle_in;
+enddef;
+
+
+fet_beginchar ("Half trianglehead (downstem)", "d1triangle");
+ draw_small_triangle_head (-1);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Half trianglehead (upstem)", "u1triangle");
+ draw_small_triangle_head (1);
+
+ draw_staff (-2, 2, 0.5);
+fet_endchar;
+
+
+def draw_closed_triangle_head (expr dir) =
+ save hei, xs;
+ save llap;
+ save tilt;
+
+ tilt = 40;
+ llap# = 2/3 noteheight#;
+ xs = 1.0;
+ caveness := 0.1;
+ define_triangle_shape (dir);
+ fill triangle_out;
+enddef;
+
+
+fet_beginchar ("Quart trianglehead (upstem)", "u2triangle");
+ draw_closed_triangle_head (1);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Quart trianglehead (downstem)", "d2triangle");
+ draw_closed_triangle_head (-1);
+
+ draw_staff (-2, 2, 0.5);
+fet_endchar;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Slash heads are for indicating improvisation. They are
+% twice as high as normal heads.
+%
+def draw_slash (expr hwid_hash) =
+ save exact_height;
+ save ne, nw_dist;
+ pair ne, nw_dist;
+ exact_height = staff_space# + stafflinethickness# / 2;
+
+ set_char_box (0, 2 exact_height / slash_slope + hwid_hash,
+ exact_height, exact_height);
+
+ charwx := charwd;
+ charwy := charht;
+
+ clearxy;
+
+ d := d - feta_shift;
+
+ pickup pencircle scaled blot_diameter;
+
+ bot y1 = -d;
+ top y2 = h;
+ lft x1 = 0;
+ lft x2 = 2 h / slash_slope;
+
+ rt x3 = w;
+ y3 = y2;
+ y4 = y1;
+ x3 - x2 = x4 - x1;
+
+ ne = unitvector (z3 - z4);
+ nw_dist = (ne rotated 90) * 0.5 blot_diameter;
+
+ fill bot z1{left}
+ .. (z1 + nw_dist){ne}
+ -- (z2 + nw_dist){ne}
+ .. top z2{right}
+ -- top z3{right}
+ .. (z3 - nw_dist){-ne}
+ -- (z4 - nw_dist){-ne}
+ .. bot z4{left}
+ -- cycle;
+
+ if hwid_hash > 2 slash_thick#:
+ save th;
+
+ th = slash_thick - blot_diameter;
+ y6 = y7;
+ y5 = y8;
+ y3 - y7 = th;
+ y5 - y1 = th;
+ z6 - z5 = whatever * ne;
+ z8 - z7 = whatever * ne;
+
+ z5 = z1 + whatever * ne + th * (ne rotated -90);
+ z8 = z4 + whatever * ne + th * (ne rotated 90);
+
+ unfill z5
+ -- z6
+ -- z7
+ -- z8
+ -- cycle;
+ fi
+ labels (range 1 thru 10);
+enddef;
+
+
+fet_beginchar ("Whole slashhead", "s0slash");
+ draw_slash (4 slash_thick# + 0.5 staff_space#);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Half slashhead", "s1slash");
+ draw_slash (3.0 slash_thick# + 0.15 staff_space#);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Quart slashhead", "s2slash");
+ draw_slash (1.5 slash_thick#);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% `thick' is the distance between the NE/SW parallel lines in the cross
+% (distance between centres of lines) in multiples of stafflinethickness
+%
+def draw_cross (expr thick) =
+ save ne, nw;
+ save ne_dist, nw_dist, rt_dist, up_dist;
+ save crz_in, crz_out;
+ save thickness;
+ pair ne, nw;
+ pair ne_dist, nw_dist, rt_dist, up_dist;
+ path crz_in, crz_out;
+
+ pen_thick# := 1.2 stafflinethickness#;
+ thickness# := thick * stafflinethickness#;
+ define_pixels (thickness);
+ define_blacker_pixels (pen_thick);
+
+ pickup pencircle scaled pen_thick;
+
+ h := h - feta_shift;
+
+ top y3 = h;
+ ne = unitvector ((1, (2 h - pen_thick) / (w - pen_thick)));
+ rt x4 = w / 2;
+ y5 = 0;
+ z4 - z5 = whatever * ne;
+ x6 = 0;
+ z6 - z3 = whatever * ne;
+ z3 - z4 = whatever * (ne yscaled -1);
+
+ z4 - z3 = whatever * (ne) + (ne rotated -90) * thickness;
+
+
+ x1 = charwd / 2 - .5 pen_thick#;
+ z1 = whatever * ne
+ + thick / 2 * stafflinethickness# * (ne rotated -90);
+
+ % labels (1, 2, 3, 4, 5, 6);
+
+ nw = unitvector (z3 - z4);
+
+ up_dist = up * 0.5 pen_thick / cosd (angle (ne));
+ rt_dist = right * 0.5 pen_thick / sind (angle (ne));
+ nw_dist = (ne rotated 90) * 0.5 pen_thick;
+ ne_dist = (nw rotated -90) * 0.5 pen_thick;
+
+ x4' := x4;
+ x5' := x5;
+ y6' := y6;
+
+ x4 := hround (x4' + .5 pen_thick) - .5 pen_thick;
+ x5 := hfloor (x5' + xpart rt_dist) - xpart rt_dist;
+ y6 := vfloor (y6' + ypart up_dist) - ypart up_dist;
+
+ crz_out = (z6 + up_dist)
+ -- (z3 + nw_dist){ne}
+ .. (top z3)
+ .. (z3 + ne_dist){-nw}
+ -- (z4 + ne_dist){-nw}
+ .. (rt z4)
+ .. (z4 - nw_dist){-ne}
+ -- (z5 + rt_dist);
+ crz_out := crz_out shifted (0, feta_shift)
+ -- reverse crz_out yscaled -1 shifted (0, -feta_eps);
+ fill crz_out
+ -- reverse crz_out xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
+
+ if (thick > 1):
+ x4 := hround (x4' - xpart rt_dist) + xpart rt_dist;
+ x5 := hceiling (x5' - .5 pen_thick) + .5 pen_thick;
+ y6 := vfloor (y6' - .5 pen_thick) + .5 pen_thick;
+
+ crz_in = (bot z6){right}
+ .. (z6 - nw_dist){ne}
+ -- (z3 - up_dist)
+ -- (z4 - rt_dist)
+ -- (z5 + nw_dist){-ne}
+ .. {down}(lft z5);
+ crz_in := crz_in shifted (0, feta_shift)
+ -- reverse crz_in yscaled -1 shifted (0, -feta_eps);
+ unfill crz_in
+ -- reverse crz_in xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
+ fi
+
+ % ugh
+ currentpicture := currentpicture shifted (hround (w / 2), 0);
+
+ charwx := charwd;
+ charwy := y1 + feta_shift;
+
+ z12 = (charwx * hppp, y1 * vppp);
+
+ labels (12);
+enddef;
+
+
+fet_beginchar ("Whole Crossed notehead", "s0cross");
+ save wid, hei;
+
+ wid# := black_notehead_width# + 4 stafflinethickness#;
+ hei# := noteheight# + stafflinethickness#;
+
+ set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+ draw_cross (3.75);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Whole Crossed notehead", "s0cross");
+ save wid, hei;
+
+ wid# := black_notehead_width# + 4 stafflinethickness#;
+ hei# := noteheight# + stafflinethickness#;
+
+ set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+ currentpicture := remember_pic;
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+fet_beginchar ("Half Crossed notehead", "s1cross");
+ save wid, hei;
+
+ wid# := black_notehead_width# + 2 stafflinethickness#;
+ hei# := noteheight# + stafflinethickness# / 2;
+
+ set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+ draw_cross (3.0);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Half Crossed notehead", "s1cross");
+ save wid, hei;
+
+ wid# := black_notehead_width# + 2 stafflinethickness#;
+ hei# := noteheight# + stafflinethickness# / 2;
+
+ set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+ currentpicture := remember_pic;
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+fet_beginchar ("Crossed notehead", "s2cross");
+ wid# := black_notehead_width#;
+ hei# := noteheight#;
+ set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+ draw_cross (1.0);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("Crossed notehead", "s2cross");
+ wid# := black_notehead_width#;
+ hei# := noteheight#;
+ set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+ currentpicture := remember_pic;
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+fet_beginchar ("X-Circled notehead", "s2xcircle");
+ save wid, hei;
+ save cthick, cxd, cyd, dy;
+
+ wid# := black_notehead_width# * sqrt (sqrt2);
+ hei# := noteheight# * sqrt (sqrt2);
+
+ set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+ d := d - feta_space_shift;
+
+ cthick# := (1.2 + 1/4) * stafflinethickness#;
+ define_blacker_pixels (cthick);
+
+ cxd := w - cthick;
+ cyd := h + d - cthick / 2;
+
+ dy = .5 (h - d);
+
+ pickup pencircle scaled cthick;
+
+ fill fullcircle xscaled (cxd + cthick)
+ yscaled (cyd + cthick)
+ shifted (w / 2, dy);
+ unfill fullcircle xscaled (cxd - cthick)
+ yscaled (cyd - cthick)
+ shifted (w / 2, dy);
+
+ xpos := .5 cxd / sqrt2;
+ ypos := .5 cyd / sqrt2;
+
+ pickup penrazor scaled cthick rotated (angle (xpos, ypos) + 90);
+ draw (-xpos + w / 2, -ypos + dy) -- (xpos + w / 2, ypos + dy);
+
+ pickup penrazor scaled cthick rotated (angle (xpos, -ypos) + 90);
+ draw (-xpos + w / 2, ypos + dy) -- (xpos + w / 2, -ypos + dy);
+
+ charwx := charwd;
+ charwy := 0;
+
+ z12 = (charwx * hppp, charwy * vppp);
+ labels (12);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+ fet_beginchar ("X-Circled notehead", "s2xcircle");
+ save wid, hei;
+ save cthick, cxr, cyr;
+
+ wid# := black_notehead_width# * sqrt (sqrt2);
+ hei# := noteheight# * sqrt (sqrt2);
+
+ set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+ currentpicture := remember_pic;
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+
+
+%%%%%%%%
+%
+% SOLFA SHAPED NOTES
+%
+
+save solfa_pen_thick;
+solfa_pen_thick# = 1.75 stafflinethickness#;
+define_blacker_pixels (solfa_pen_thick);
+
+
+save solfa_base_notewidth;
+solfa_base_notewidth# := black_notehead_width#;
+
+solfa_whole_width := whole_notehead_width# / black_notehead_width#;
+solfa_half_width := half_notehead_width# / black_notehead_width#;
+solfa_quarter_width := 1.0;
+
+def draw_do_head (expr width_factor, dir) =
+ save p_in, p_out;
+ save left_dist, right_dist;
+ path p_in, p_out;
+ pair left_dist, right_dist;
+
+ set_char_box (0, width_factor * solfa_base_notewidth#,
+ 0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+
+ pickup pencircle scaled solfa_pen_thick;
+
+ bot y1 = -d;
+ y1 = y2;
+ lft x1 = 0;
+ rt x2 = w;
+ top y3 = h;
+ x3 =.5 [x1, x2];
+
+ left_dist = (unitvector (z3 - z1) rotated 90) * 0.5 solfa_pen_thick;
+ right_dist = (unitvector (z2 - z3) rotated 90) * 0.5 solfa_pen_thick;
+
+ p_in := (((z1 - left_dist) -- (z3 - left_dist)) intersectionpoint
+ (top z1 -- top z2))
+ -- ((top z1 -- top z2) intersectionpoint
+ ((z2 - right_dist) -- (z3 - right_dist)))
+ -- (((z2 - right_dist) -- (z3 - right_dist)) intersectionpoint
+ ((z1 - left_dist) -- (z3 - left_dist)))
+ -- cycle;
+
+ p_out := bot z1
+ -- bot z2{right}
+ .. rt z2{up}
+ .. (z2 + right_dist){z3 - z2}
+ -- (z3 + right_dist){z3 - z2}
+ .. top z3{left}
+ .. (z3 + left_dist){z1 - z3}
+ -- (z1 + left_dist){z1 - z3}
+ .. lft z1{down}
+ .. {right}cycle;
+
+
+ labels (1, 2, 3);
+
+ charwx := charwd;
+ charwy := -chardp + 0.5 stafflinethickness#;
+ if dir = -1:
+ charwy := -charwy;
+ fi;
+enddef;
+
+
+fet_beginchar ("Whole dohead", "s0do");
+ draw_do_head (solfa_whole_width, 1);
+ fill p_out;
+ unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half dohead", "d1do");
+ draw_do_head (solfa_half_width, -1);
+ fill p_out;
+ unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half dohead", "u1do");
+ draw_do_head (solfa_half_width, 1);
+ fill p_out;
+ unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Quart dohead", "d2do");
+ draw_do_head (solfa_quarter_width, -1);
+ fill p_out;
+fet_endchar;
+
+
+fet_beginchar ("Quart dohead", "u2do");
+ draw_do_head (solfa_quarter_width, 1);
+ fill p_out;
+fet_endchar;
+
+
+%
+% re - flat top, curved bottom:
+% (0,h/2) {dir -90} .. (w/2,-h/2) .. {dir 90} (w,h/2) -- cycle;
+% (broader along the base and with more vertical sides for half and
+% whole notes)
+% stem attachment: h/2
+%
+
+def draw_re_head (expr width_factor, dir) =
+ save p_in, p_out;
+ path p_in, p_out;
+
+ set_char_box (0, width_factor * solfa_base_notewidth#,
+ 0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+
+ pickup pencircle scaled solfa_pen_thick;
+
+ save curve_start;
+ curve_start = 0.7;
+ lft x1 = 0;
+ y1 = y5;
+ x1 = x2;
+ y2 = curve_start [y3, y1];
+ bot y3 = -d;
+ x3 = .5 [x2, x4];
+ rt x4 = w;
+ y4 = y2;
+ top y5 = h;
+ x5 = x4;
+
+ labels (range 1 thru 5);
+
+ p_in := (z1 + 0.5 solfa_pen_thick * (1, -1))
+ -- rt z2{down}
+ .. top z3
+ .. lft z4{up}
+ -- (z5 + 0.5 solfa_pen_thick * (-1, -1))
+ -- cycle;
+
+ p_out := lft z1
+ -- lft z2{down}
+ .. bot z3
+ .. rt z4{up}
+ -- rt z5{up}
+ .. top z5{left}
+ -- top z1{left}
+ .. {down}cycle;
+
+ charwx := charwd;
+ charwy := curve_start [-chardp, charht];
+
+ if dir = -1:
+ charwy := -charwy;
+ fi;
+enddef;
+
+
+fet_beginchar ("Whole rehead", "s0re");
+ draw_re_head (solfa_whole_width, 1);
+ fill p_out;
+ unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half up rehead", "u1re");
+ draw_re_head (solfa_half_width, 1);
+ fill p_out;
+ unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half down rehead", "d1re");
+ draw_re_head (solfa_half_width, -1);
+ fill p_out;
+ unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Quart rehead", "u2re");
+ draw_re_head (solfa_quarter_width, 1);
+ fill p_out;
+fet_endchar;
+
+
+fet_beginchar ("Quart rehead", "d2re");
+ draw_re_head (solfa_quarter_width, -1);
+ fill p_out;
+fet_endchar;
+
+
+def draw_mi_head (expr width_factor) =
+ save path_out, path_in;
+ save ne_dist, se_dist, ne, se;
+ path path_out, path_in;
+ pair ne_dist, se_dist, ne, se;
+
+ set_char_box (0, width_factor * solfa_base_notewidth#,
+ 0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+
+ pickup pencircle scaled solfa_pen_thick;
+
+ lft x1 = 0;
+ y1 = 0;
+ bot y2 = -d;
+ x2 = .5 [x1, x3];
+ rt x3 = w;
+ x4 = x2;
+ y3 = y1;
+ top y4 = h;
+
+ z6 - z5 = whatever * (z2 - z1);
+ z8 - z7 = whatever * (z2 - z1);
+ z8 - z5 = whatever * (z4 - z1);
+ z6 - z7 = whatever * (z4 - z1);
+
+ ne = unitvector (z4 - z1);
+ se = unitvector (z1 - z2);
+
+ ne_dist = (ne rotated 90) * 0.5 solfa_pen_thick;
+ se_dist = (se rotated 90) * 0.5 solfa_pen_thick;
+
+ z5 = whatever [z1, z4] - ne_dist;
+ z5 = whatever [z1, z2] - 1.5 se_dist;
+
+ z5 - z1 = -(z7 - z3);
+
+ labels (range 1 thru 8);
+
+ path_in := z5
+ -- z6
+ -- z7
+ -- z8
+ -- cycle;
+
+ path_out := lft z1
+ .. (z1 + se_dist){-se}
+ -- (z2 + se_dist){-se}
+ .. bot z2
+ .. (z2 - ne_dist){ne}
+ -- (z3 - ne_dist){ne}
+ .. rt z3
+ .. (z3 - se_dist){se}
+ -- (z4 - se_dist){se}
+ .. top z4
+ .. (z4 + ne_dist){-ne}
+ -- (z1 + ne_dist){-ne}
+ .. cycle;
+enddef;
+
+
+fet_beginchar ("Whole mihead", "s0mi");
+ draw_mi_head (solfa_whole_width);
+ fill path_out;
+ unfill path_in;
+fet_endchar;
+
+
+fet_beginchar ("Half mihead", "s1mi");
+ draw_mi_head (solfa_quarter_width);
+ fill path_out;
+ unfill path_in;
+fet_endchar;
+
+
+fet_beginchar ("Quart mihead", "s2mi");
+ draw_mi_head (solfa_quarter_width);
+ fill path_out;
+fet_endchar;
+
+
+def draw_fa_head (expr width_factor) =
+ set_char_box (0, width_factor * solfa_base_notewidth#,
+ 0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+
+ save p_down_in, p_down_out, p_up_in, p_up_out, nw_dist, nw;
+ path p_down_in, p_down_out, p_up_in, p_up_out;
+ pair nw_dist, nw;
+
+ pickup pencircle scaled solfa_pen_thick;
+
+ lft x1 = 0;
+ top y1 = h;
+
+ rt x2 = w;
+ y2 = y1;
+ bot y3 = -d;
+ x3 = x2;
+
+ y4 = y3;
+ x4 = x1;
+
+ labels (1, 2, 3, 4);
+
+ nw = unitvector (z1 - z3);
+ nw_dist = (nw rotated 90) * 0.5 solfa_pen_thick;
+
+ p_up_in := (((z1 - nw_dist) -- (z3 - nw_dist)) intersectionpoint
+ (bot z1 -- bot z2))
+ -- (((z1 - nw_dist) -- (z3 - nw_dist)) intersectionpoint
+ (lft z3 -- lft z2))
+ -- (z2 + 0.5 solfa_pen_thick * (-1, -1))
+ -- cycle;
+
+ p_up_out := lft z1{down}
+ .. (z1 + nw_dist){-nw}
+ -- (z3 + nw_dist){-nw}
+ .. bot z3{right}
+ .. rt z3{up}
+ -- rt z2{up}
+ .. top z2{left}
+ -- top z1{left}
+ .. {down}cycle;
+
+ p_down_in := p_up_in rotated 180 shifted (w, 0);
+ p_down_out := p_up_out rotated 180 shifted (w, 0);
+
+ charwy := 0.0;
+ charwx := charwd;
+enddef;
+
+
+fet_beginchar ("Whole fa up head", "u0fa");
+ draw_fa_head (solfa_whole_width);
+ fill p_up_out;
+ unfill p_up_in;
+fet_endchar;
+
+
+fet_beginchar ("Whole fa down head", "d0fa");
+ draw_fa_head (solfa_whole_width);
+ fill p_down_out;
+ unfill p_down_in;
+fet_endchar;
+
+
+fet_beginchar ("half fa up head", "u1fa");
+ draw_fa_head (solfa_half_width);
+ fill p_up_out;
+ unfill p_up_in;
+fet_endchar;
+
+
+fet_beginchar ("Half fa down head", "d1fa");
+ draw_fa_head (solfa_half_width);
+ fill p_down_out;
+ unfill p_down_in;
+fet_endchar;
+
+
+fet_beginchar ("Quarter fa up head", "u2fa");
+ draw_fa_head (solfa_quarter_width);
+ fill p_up_out;
+fet_endchar;
+
+
+fet_beginchar ("Quarter fa down head", "d2fa");
+ draw_fa_head (solfa_quarter_width);
+ fill p_down_out;
+fet_endchar;
+
+
+def draw_la_head (expr width_factor) =
+ set_char_box (0, width_factor * solfa_base_notewidth#,
+ 0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+ save p_in, p_out;
+ path p_in, p_out;
+
+ pickup pencircle scaled solfa_pen_thick;
+
+ lft x1 = 0;
+ top y1 = h;
+
+ rt x2 = w;
+ y2 = y1;
+ bot y3 = -d;
+ x3 = x2;
+
+ y4 = y3;
+ x4 = x1;
+
+ labels (range 1 thru 4);
+
+ p_in := (z1 + 0.5 solfa_pen_thick * (1, -1))
+ -- (z2 + 0.5 solfa_pen_thick * (-1, -1))
+ -- (z3 + 0.5 solfa_pen_thick * (-1, 1))
+ -- (z4 + 0.5 solfa_pen_thick * (1, 1))
+ -- cycle;
+
+ p_out := top z1
+ -- top z2{right}
+ .. rt z2{down}
+ -- rt z3{down}
+ .. bot z3{left}
+ -- bot z4{left}
+ .. lft z4{up}
+ -- lft z1{up}
+ .. cycle;
+enddef;
+
+
+fet_beginchar ("Whole lahead", "s0la");
+ draw_la_head (solfa_whole_width);
+ fill p_out;
+ unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half lahead", "s1la");
+ draw_la_head (solfa_half_width);
+ fill p_out;
+ unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Quart lahead", "s2la");
+ draw_la_head (solfa_quarter_width);
+ fill p_out;
+fet_endchar;
+
+
+def draw_ti_head (expr width_factor, dir) =
+ set_char_box (0, width_factor * solfa_base_notewidth#,
+ 0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+ save p_in, p_out, p_top;
+ save nw_dist, sw_dist, nw, sw;
+ path p_in, p_out, p_top;
+ pair nw_dist, sw_dist, nw, sw;
+ save cone_height;
+ cone_height = 0.64;
+
+ pickup pencircle scaled solfa_pen_thick;
+
+ x1 = .5 [x2, x4];
+ bot y1 = -d;
+ lft x2 = 0;
+ y2 = cone_height [y1, y3];
+ rt x4 = w;
+ y4 = y2;
+ x3 = x1;
+ top y3 = h;
+
+ labels (range 1 thru 4);
+
+ nw = unitvector (z2 - z1);
+ sw = unitvector (z1 - z4);
+
+ nw_dist = (nw rotated 90) * 0.5 solfa_pen_thick;
+ sw_dist = (sw rotated 90) * 0.5 solfa_pen_thick;
+
+ p_top := (z2 - sw_dist)
+ .. (top z3){right}
+ .. (z4 - nw_dist);
+
+ p_in := (((z1 - nw_dist) -- (z2 - nw_dist)) intersectionpoint
+ ((z1 - sw_dist) -- (z4 - sw_dist)))
+ -- (((z1 - nw_dist) -- (z2 - nw_dist)) intersectionpoint
+ ((z2 + sw_dist) .. {right}(bot z3)))
+ .. bot z3
+ .. (((bot z3){right} .. (z4 + nw_dist)) intersectionpoint
+ ((z1 - sw_dist) -- (z4 - sw_dist)))
+ -- cycle;
+
+ p_out := bot z1
+ .. (z1 + nw_dist)
+ -- (z2 + nw_dist)
+ .. lft z2
+ .. (z2 - sw_dist){direction 0 of p_top}
+ & p_top
+ & {direction infinity of p_top}(z4 - nw_dist)
+ .. rt z4
+ .. (z4 + sw_dist)
+ -- (z1 + sw_dist)
+ .. cycle;
+
+ charwx := charwd;
+ charwy := cone_height [-chardp, charht];
+ if dir = -1:
+ charwy := -charwy;
+ fi;
+enddef;
+
+
+fet_beginchar ("Whole up tihead", "s0ti");
+ draw_ti_head (solfa_whole_width, 1);
+ fill p_out;
+ unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half up tihead", "u1ti");
+ draw_ti_head (solfa_half_width, 1);
+ fill p_out;
+ unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half down tihead", "d1ti");
+ draw_ti_head (solfa_half_width, -1);
+ fill p_out;
+ unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Quart up tihead", "u2ti");
+ draw_ti_head (solfa_quarter_width, 1);
+ fill p_out;
+fet_endchar;
+
+
+fet_beginchar ("Quart down tihead", "d2ti");
+ draw_ti_head (solfa_quarter_width, -1);
+ fill p_out;
+fet_endchar;
+
+
+fet_endgroup ("noteheads");
+
+
+%
+% we derive black_notehead_width# from the quarter head,
+% so we have to define black_notehead_width (pixel qty)
+% after the black_notehead_width# itself.
+%
+% Let's keep it outside the group as well.
+%
+
+define_pixels (black_notehead_width);
diff --git a/muse2/share/scoreglyphs/feta-original/feta-braces-a.mf b/muse2/share/scoreglyphs/feta-original/feta-braces-a.mf
new file mode 100644
index 00000000..9d8a9d83
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-braces-a.mf
@@ -0,0 +1,11 @@
+%
+% feta-braces-a.mf -- 256 smallest braces
+%
+% source file of the Feta (Font-En-Tja) music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+
+font_count := 0;
+input feta-beugel;
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta-braces-b.mf b/muse2/share/scoreglyphs/feta-original/feta-braces-b.mf
new file mode 100644
index 00000000..e74606dc
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-braces-b.mf
@@ -0,0 +1,11 @@
+%
+% feta-braces-b.mf -- next 256 braces
+%
+% source file of the Feta (Font-En-Tja) music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+
+font_count := 1;
+input feta-beugel;
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta-braces-c.mf b/muse2/share/scoreglyphs/feta-original/feta-braces-c.mf
new file mode 100644
index 00000000..06a273ed
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-braces-c.mf
@@ -0,0 +1,11 @@
+%
+% feta-braces-c.mf -- next 256 braces
+%
+% source file of the Feta (Font-En-Tja) music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+
+font_count := 2;
+input feta-beugel;
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta-braces-d.mf b/muse2/share/scoreglyphs/feta-original/feta-braces-d.mf
new file mode 100644
index 00000000..d926a595
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-braces-d.mf
@@ -0,0 +1,11 @@
+%
+% feta-braces-d.mf -- next 256 braces
+%
+% source file of the Feta (Font-En-Tja) music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+
+font_count := 3;
+input feta-beugel;
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta-braces-e.mf b/muse2/share/scoreglyphs/feta-original/feta-braces-e.mf
new file mode 100644
index 00000000..ed89fc5a
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-braces-e.mf
@@ -0,0 +1,11 @@
+%
+% feta-braces-e.mf -- next 256 braces
+%
+% source file of the Feta (Font-En-Tja) music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+
+font_count := 4;
+input feta-beugel;
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta-braces-f.mf b/muse2/share/scoreglyphs/feta-original/feta-braces-f.mf
new file mode 100644
index 00000000..4a96744e
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-braces-f.mf
@@ -0,0 +1,11 @@
+%
+% feta-braces-f.mf -- next 256 braces
+%
+% source file of the Feta (Font-En-Tja) music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+
+font_count := 5;
+input feta-beugel;
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta-braces-g.mf b/muse2/share/scoreglyphs/feta-original/feta-braces-g.mf
new file mode 100644
index 00000000..3a12239c
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-braces-g.mf
@@ -0,0 +1,11 @@
+%
+% feta-braces-g.mf -- next 256 braces
+%
+% source file of the Feta (Font-En-Tja) music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+
+font_count := 6;
+input feta-beugel;
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta-braces-h.mf b/muse2/share/scoreglyphs/feta-original/feta-braces-h.mf
new file mode 100644
index 00000000..9d4988e7
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-braces-h.mf
@@ -0,0 +1,11 @@
+%
+% feta-braces-h.mf -- next 256 braces
+%
+% source file of the Feta (Font-En-Tja) music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+
+font_count := 7;
+input feta-beugel;
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta-braces-i.mf b/muse2/share/scoreglyphs/feta-original/feta-braces-i.mf
new file mode 100644
index 00000000..7089e60c
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-braces-i.mf
@@ -0,0 +1,11 @@
+%
+% feta-braces-i.mf -- next 256 braces
+%
+% source file of the Feta (Font-En-Tja) music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+
+font_count := 8;
+input feta-beugel;
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta-din-code.mf b/muse2/share/scoreglyphs/feta-original/feta-din-code.mf
new file mode 100644
index 00000000..809227de
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-din-code.mf
@@ -0,0 +1,791 @@
+% feta-din-code.mf -- implement dynamic signs
+%
+% part of LilyPond's pretty-but-neat music font
+%
+% source file of the Feta (not the Font-En-Tja) music font
+%
+% (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+
+
+ex# := (dynamic_design_size / 2.4) * pt#;
+descender# := 0.5 ex#;
+ascender# := 0.72 ex#;
+staffspace# := 1.75 / 2.0 * ex#;
+horizontal_space# := .66 ex#;
+
+font_x_height ex#;
+font_normal_space horizontal_space#;
+
+define_pixels (staffspace, linethickness, ex, descender, ascender);
+
+
+%
+% TODO: blot diameter should be fixed, not scalable.
+%
+
+save serif_thick, med_thick, bottom_blot;
+
+serif_thick# = 1.1 linethickness#;
+define_blacker_pixels (serif_thick);
+
+med_thick = round (1.5 linethickness);
+bottom_blot = 1.3 serif_thick;
+
+
+code := 32;
+
+fet_beginchar ("Space", "space");
+ set_char_box (0, horizontal_space#, 0, ex#);
+fet_endchar;
+
+
+%
+% Couldn't find many z examples. This one is losely inspired
+% by a sfz from Mueller Etuden fuer Horn (Edition Hofmeister).
+%
+
+code := 121;
+
+fet_beginchar ("dynamic z", "z");
+ save thin_thick, top_narrow, over_shoot;
+ save bot_thick;
+
+ set_char_box (0, .98 ex#, 0, 0.9 ex#);
+
+ thin_thick = serif_thick;
+ top_narrow = thin_thick;
+ top_overshoot = .8 serif_thick;
+ top_thick = .3 h;
+ bot_thick = .2 ex;
+ bot_overshoot = serif_thick;
+
+ x0 = top_narrow;
+ y0 = .9 [y1r, y1l];
+
+ penpos1 (top_thick, 80);
+ y1l = .72 h;
+ x1r = .34 ex;
+
+ x2 = .66 ex;
+ y2 = y1r - top_overshoot;
+
+ y3 = h - .7 thin_thick;
+ x3 = w - .6 top_narrow - .5 thin_thick;
+ y4 = .5 thin_thick;
+ x4 = .5 thin_thick;
+
+ penpos3 (thin_thick, angle (z3 - z4) + 90);
+ penpos4 (thin_thick, angle (z3 - z4) + 90);
+
+ penpos5 (bot_thick, 70);
+ x5l =.25 ex;
+ y5l = .4 bot_overshoot;
+
+ penpos6 (3/2 bot_thick, 70);
+ y6l = -bot_overshoot;
+ x6 = w - 3 top_narrow;
+
+ x7 = w;
+ y7 = .82 [y8r, y6r];
+
+ penpos8 (thin_thick, 20);
+ x8r = w - .35 top_narrow;
+ y8r = .45 h;
+
+ penlabels (range 0 thru 8);
+
+% pickup pencircle scaled 1;
+
+% draw
+ fill z0{down}
+ .. z1l{dir (10)}
+ .. simple_serif (z3l, z3r, 90)
+ .. z2{left}
+ .. z1r{left}
+ ..tension 1.2.. cycle;
+
+% draw
+ fill z3l
+ -- z3r
+ -- z4r
+ -- z4l
+ -- cycle;
+
+% draw
+ fill simple_serif (z4r, z4l, 90)
+ .. z5l{right}
+ .. z6l{right}
+ .. z7{up}
+ .. simple_serif (z8r, z8l, 90)
+ .. z6r{left}
+ .. z5r{left}
+ .. cycle;
+fet_endchar;
+
+
+% forte f, grabbed from Ed Breitkopf Mozart horn concerto 3.
+%
+% NOTES:
+%
+% * the bulbs are open
+%
+% * blotting around the serif
+%
+% TODO: insert blots around the serif
+%
+
+slant_angle = 20;
+code := 101;
+
+fet_beginchar ("dynamic f", "f");
+ save left_angle, right_angle;
+ save serif_length, serif_eccentricity;
+ save f_thick;
+ save bulb_thick, bulb_diam, fill_up;
+ save slant;
+ save p;
+ path p;
+
+ set_char_box (0, 1.1 ex#, descender#, ex# + ascender#);
+
+ bulb_diam = 7.5 / 40 ex;
+ bulb_thick = 8.5 / 40 ex;
+ fill_up = 1.5 serif_thick;
+ left_angle = slant_angle - 6;
+ right_angle = slant_angle - 3;
+ f_thick = 7/16 ex;
+ serif_length = 0.96 ex;
+ serif_eccentricity = 0.01 ex;
+
+ % z1 is the `base point'
+ z1 = (0.2 ex, -serif_thick);
+
+ penpos2 (f_thick, 0);
+ y2 = y1 + ex;
+ z2l = z1 + whatever * dir (90 - left_angle);
+
+ penpos3 (med_thick, -90);
+ y3l = y1 + ex + ascender;
+ x3l = x1 + ex;
+
+ penpos4 (bulb_thick, -20);
+ z3r = whatever [z4r, z4l];
+
+ x4l - x3l = 1/10 ex;
+
+ penpos5 (bulb_thick, -45);
+ x5r = 0.1 [x4l, x4r];
+ y5l = y4l - bulb_diam;
+
+ z6 = z2r + whatever * dir (90 - right_angle);
+ y6 = y1 + 3/8 ex;
+
+ penpos7 (med_thick, -90);
+ x7 = x1 - 1/4 ex;
+ y7r = y1 -descender;
+
+ penpos8 (bulb_thick, 160);
+ x8l = x7l - 1/10 ex;
+
+ z7l = whatever [z8r, z8l];
+
+ penpos9 (bulb_thick, 135);
+ x9r = 0.1 [x8l, x8r];
+ y9l = y8l + bulb_diam;
+
+ labels (1, 6, 9);
+ penlabels (2, 3, 4, 5, 7, 8, 9);
+
+% pickup pencircle scaled 1;
+
+% draw
+ fill z1
+ -- z2l{z2l - z1}
+ ..tension 1.1.. z3l{right}
+ .. z4r{down}
+ .. z5r{left}
+ .. z5l{up}
+ ..tension 0.8.. z4l{up}
+ .. z3r{left}
+ ..tension 1.1.. z2r{z6 - z2r}
+ -- z6{z6 - z2r}
+ ..tension 1.25.. z7r{left}
+ .. z8r{up}
+ .. z9r{right}
+ .. z9l{down}
+ ..tension 0.8.. z8l{down}
+ .. z7l{right}
+ .. {z2l - z1}cycle;
+
+ x13 - x14 = serif_length;
+ y13 = y14;
+ y14 = y2;
+ 0.5 [x13, x14] = x2 + serif_eccentricity;
+
+ draw_rounded_block (z14 - (0, 0.7 serif_thick),
+ z13 + (0, 0.7 serif_thick),
+ 1.4 serif_thick);
+
+ labels (13, 14);
+fet_endchar;
+
+
+%
+% Notes:
+%
+% - The `s' is trapezoidal (i.e., narrower at the top).
+%
+% - The white space is differently shaped at the top (the bulb's inner
+% curve is filled up).
+%
+% - Less heavy than the `f' and `p' signs.
+%
+
+code := 114;
+
+fet_beginchar ("dynamic s", "s");
+ save left_angle, right_angle;
+ save s_thick, s_thin;
+ save bulb_diam, bulb_len;
+ save over_shoot;
+ save base_point;
+ pair base_point;
+
+ set_char_box (0, 17/24 ex#, 0, ex#);
+
+ over_shoot = 0; % .2 serif_thick;
+ bulb_diam = 11/70 ex;
+ bulb_len = 1.0 bulb_diam;
+ left_angle = slant_angle - 2;
+ right_angle = slant_angle - 11;
+ s_thick = 16/70 ex;
+ s_thin = serif_thick;
+
+ base_point = (0, 0);
+
+ penpos1 (bulb_diam, -45);
+ z1 = 0.35 [z2l, z2r] + bulb_len * dir (45);
+
+ penpos2 (bulb_diam, -25);
+ y2l = 0.845 [y7r, y3r];
+ z2l = base_point + whatever * dir (90 - left_angle);
+
+ penpos3 (s_thin, 100);
+ x3l = 1/2 w;
+ y3l = ypart base_point - over_shoot;
+
+ penpos4 (s_thick, 25);
+ y4l = y1r;
+ z4r = base_point + (w, 0) + whatever * dir (90 - right_angle);
+
+ penpos5 (s_thick, 40);
+ z5 = z3l + whatever * dir (90 - right_angle);
+ y5 = 0.48 [y7r, y3r];
+
+ penpos6 (s_thick, 25);
+ z6l = base_point + whatever * dir (90 - left_angle);
+ y6r = y9l;
+
+ penpos7 (.9 s_thin, 110);
+ z7l = 0.45 [z6r, z8l] + whatever * dir (90 - left_angle);
+ y7r = h + over_shoot;
+
+ penpos8 (.9 bulb_diam, -25);
+ z8 = .6 [z4l, z4r] + whatever * dir (90 - right_angle);
+ y8r = 0.23 [y7r, y3r];
+
+ penpos9 (.9 bulb_diam, -45);
+ z9 = .4 [z8r, z8l] + .9 bulb_len * dir (-135);
+
+ penlabels (range 1 thru 9);
+
+% pickup pencircle scaled 1;
+
+% draw
+ fill z2l{down}
+ .. z3l{right}
+ .. z4r{up}
+ .. z5r
+ .. z6r{up}
+ .. z7l{right}
+ % .. z8l{down}
+ .. z9l{dir (-125)}
+ .. z9r{right}
+ .. z7r{left}
+ .. z6l{down}
+ .. z5l
+ .. z4l{down}
+ .. z3r{left}
+ .. z2r{up}
+ .. z1r{up}
+ .. z1l{left}
+ .. cycle;
+fet_endchar;
+
+
+% for `p' and `m'
+
+save slant;
+slant := ypart (dir (slant_angle));
+
+
+%
+% Piano `p', grabbed from Ed Breitkopf Mozart horn concerto 3.
+%
+% Notes:
+%
+% * There is no dishing in the serif (but we do it anyway).
+%
+% * The cheek is a little fatter than the stem.
+%
+% * The slant is extreme: 20 degrees.
+%
+% * The twiddle (what's-it-called) is a slightly darker than the serif.
+%
+% * The hole in the cheek has a straight right side.
+%
+% * Corners are filled up.
+%
+
+code := 111;
+
+fet_beginchar ("dynamic p", "p")
+ % TODO: w really is 13/12 ex
+ % but should do kerning
+
+ save twiddle_thick, stem_thick, cheek_thick, cheek_width;
+ save fill_up, straigh_len;
+ save serif, dishing_angle, p, tmp;
+ save cheek_medium, left_serif_protrude, right_serif_protrude;
+ save lower_overshoot;
+ save blot_t, corner_t;
+ path serif, p;
+ pair tmp, updir;
+
+ set_char_box (0, 15/12 ex#, descender#, 1.0 ex#);
+
+ twiddle_thick = med_thick;
+ cheek_medium = 1/6 ex;
+
+ dishing_angle = 5;
+ fill_up = 1.5 serif_thick;
+ straigh_len = 0.5 ex;
+ lower_overshoot = .3 serif_thick;
+
+ stem_thick = 2/6 ex;
+ cheek_thick = 13/32 ex;
+ cheek_width = 0.72 ex;
+ left_serif_protrude = 18/60 ex;
+ right_serif_protrude = 15/60 ex;
+
+ currenttransform := currenttransform slanted slant;
+
+ penpos1 (twiddle_thick, -slant - 5);
+ penpos2 (cheek_medium, 90 - slant);
+ penpos3 (cheek_medium, 90 - slant);
+
+ x4r - x4l = cheek_thick;
+
+ penpos4 (whatever, 0);
+ penpos5 (whatever, -38);
+ penpos6 (stem_thick, 0);
+ penpos17 (straigh_len, 90 - slant);
+
+ whatever [z17l, z17r] = z4l;
+ y17 = 7/16 ex;
+ x6l = 0;
+ y6l = -descender + serif_thick / 2;
+ z1l = z6l - whatever * dir (110);
+ y1r = 0.5 ex;
+ y2r = ex;
+ z7 = whatever * up + z6l;
+ y7 = 43/60 ex;
+ z2l = whatever * up + 0.3 [z7, z1r];
+ y8 = 0.9 [y7, y2l];
+ z8 = 2/3 [z6l, z6r] + whatever * up;
+ y3r = ex;
+ z3l = 0.58 [(stem_thick, -descender),
+ (stem_thick + cheek_width - cheek_thick, -descender)]
+ + whatever * up;
+ y4r = .38 ex;
+ z4r = whatever * up + (stem_thick + cheek_width, -descender);
+ z5l = whatever * up + z3l;
+ y5r = -lower_overshoot;
+ y5l = y5r + cheek_medium * ypart dir (55);
+ z9 = z6r + whatever * up;
+ y9 = .2 [y5l, y5r];
+
+ p := z2r{right}
+ .. {dir (-60)}z8{dir 60}
+ .. z3r{right}
+ .. z4r{down}
+ ..tension 1.1.. z5r{left}
+ .. {curl 1}z9
+ -- z6r
+ -- z6l
+ -- z7{up}
+ .. z2l{left}
+ ..tension 1.2.. simple_serif (z1r, z1l, -90)
+ .. cycle;
+
+ blot_t := 0.13;
+ corner_t := xpart (p intersectiontimes z9);
+
+% pickup pencircle scaled 1;
+
+% draw
+ fill subpath (0, corner_t - 2 blot_t) of p
+ .. subpath (corner_t + blot_t, length p) of p
+ .. cycle;
+
+ y12 = 0.5 ex;
+ z12 = z6r + whatever * up;
+
+ unfill z17l
+ ..tension 1.5.. z17r
+ .. z3l{left}
+ ..tension 1.05.. z12{down}
+ ..tension 1.05.. z5l{right}
+ .. cycle;
+
+ penlabels (1, 2, 3, 4, 5, 6, 17);
+ labels (7, 8, 9);
+
+ pickup pencircle scaled serif_thick;
+
+ lft x11 = -left_serif_protrude;
+ rt x10 = stem_thick + right_serif_protrude;
+ bot y10 = bot y11 = -descender;
+
+ z15 = z6l + up * fill_up;
+ z16 = z6r + up * 1.2 fill_up;
+
+ % Since pens are not affected by currenttransform we directly
+ % transform the necessary points, then simulating the pen with
+ % an outline while using the identity transformation.
+
+ forsuffixes $ = 7, 10, 11, 15, 16:
+ tmp := z$ transformed currenttransform;
+ x$ := xpart tmp;
+ y$ := ypart tmp;
+ endfor;
+
+ currenttransform := identity;
+
+ updir = z7 - z15;
+
+ serif := simple_serif (z10, z11, dishing_angle);
+
+ penpos10 (serif_thick, -dishing_angle - 90);
+ penpos11 (serif_thick, dishing_angle - 90);
+ penpos13 (serif_thick, angle (direction 0.05 of serif) + 90);
+ penpos14 (serif_thick, angle (direction 0.85 of serif) + 90);
+
+ z13 = point 0.05 of serif;
+ z14 = point 0.85 of serif;
+
+ penlabels (10, 11, 13, 14);
+ labels (15, 16);
+
+% draw
+ fill z15{-updir}
+ .. z14l{direction 0.85 of serif}
+ .. z11l{-dir (dishing_angle)}
+ .. z11r{dir (dishing_angle)}
+ .. z14r{-direction 0.85 of serif}
+ .. z13r{-direction 0.05 of serif}
+ .. z10r{dir (-dishing_angle)}
+ .. z10l{-dir (-dishing_angle)}
+ .. z13l{direction 0.05 of serif}
+ .. z16{updir}
+ -- cycle;
+fet_endchar;
+
+
+%
+% NOTES:
+%
+% * Right stem is fatter and more straight than the left two stems.
+%
+% * The twiddle at the left is similar to the `p' twiddle.
+%
+% * The bottoms of the stems are blotted.
+%
+%
+% This is cut & paste programming. Somehow three `i' shapes in two
+% characters (`p' and `m') -- doesn't seem worth the trouble of writing
+% a macro.
+%
+
+code := 108;
+
+fet_beginchar ("dynamic m", "m");
+ save i_thick, i_angle, i_twiddle_thick;
+ save i_twiddle_start_angle, i_twiddle_start_y;
+ save i_twiddle_end_angle, i_left_space;
+ save idir, center, right_ending;
+ save overshoot;
+ save p;
+ pair center, idir, right_ending;
+ path p;
+
+ set_char_box (0, 1.5 ex#, 0, 1.0 ex#);
+
+ % should share code with p for twiddle.
+
+ overshoot = .25 serif_thick;
+ i_thick := 21/80 ex;
+ i_twiddle_thick = 1.2 serif_thick;
+ i_twiddle_start_y = 8/16 ex;
+ i_twiddle_start_angle = 0;
+ i_twiddle_end_angle := 35;
+
+ center = (0, 0);
+
+ currenttransform := currenttransform slanted slant;
+
+ i_angle := 0;
+ idir := dir (90 - i_angle);
+ i_left_space = 16/80 ex;
+
+ penpos1 (i_twiddle_thick, -i_twiddle_start_angle);
+ y1 = i_twiddle_start_y;
+ z1r = center - (i_left_space, 0) + whatever * idir;
+
+ y2l = ex + overshoot;
+ z2l = .08 [z3l, z3r] + whatever * idir;
+ z2r = 5/8 [z1r, z3l] + whatever * idir;
+ y2r = y5l + 1/9 ex;
+ z2 = 1/2 [z2l, z2r];
+
+ penpos3 (i_thick, 0);
+ y3 = 0.5 bottom_blot + ypart center;
+ z3l = center + whatever * idir;
+
+ penpos4 (i_thick - bottom_blot, 0);
+ y4 = ypart center;
+ z4 - z3 = whatever * idir;
+
+ penpos5 (i_thick, 0);
+ z5 = z4 + whatever * idir;
+ y5 = 55/80 ex;
+
+ fill simple_serif (z1l, z1r, 90)
+ ..tension 1.2.. z2r{right}
+ .. z5l{z3 - z5}
+ -- z3l{z3 - z5}
+ .. z4l{right}
+ -- z4r{right}
+ .. z3r{z5 - z3}
+ -- z5r{z5 - z3}
+ ..tension 1.2.. z2l{left}
+ .. cycle;
+
+ right_ending := z5r;
+ penlabels (1, 2, 3, 4, 5);
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ clearxy;
+
+ i_angle := -3.2;
+ idir := dir (90 - i_angle);
+ i_left_space := 14/80 ex;
+
+ penpos1 (serif_thick, -i_twiddle_start_angle);
+ z1r = right_ending;
+
+ y2l = ex+ overshoot;
+ z2l = .08 [z3l, z3r] + whatever * idir;
+ z2r = 5/8 [z1r, z3l] + whatever * idir;
+ y2r = y5l + 1/9 ex;
+ z2 = 1/2 [z2l, z2r];
+
+ penpos3 (i_thick, 0);
+ y3 = 0.5 bottom_blot + ypart center;
+ z3l = z5l + whatever * idir;
+
+ penpos4 (i_thick - bottom_blot, 0);
+ y4 = ypart center;
+ z4 - z3 = whatever * idir;
+
+ penpos5 (i_thick, 0);
+ z5l = right_ending + (i_left_space, 0);
+
+ fill simple_serif (z1l, z1r, 90)
+ ..tension 1.05.. z2r{right}
+ .. z5l{z3 - z5}
+ -- z3l
+ .. z4l{right}
+ -- z4r{right}
+ .. z3r{z5 - z3}
+ -- z5r{z5 - z3}
+ ..tension 1.2.. z2l{left}
+ .. cycle;
+
+ right_ending := z5r;
+ penlabels (1, 2, 3, 4, 5);
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ clearxy;
+
+ i_thick := 23/80 ex;
+ i_angle := -6;
+ idir := dir (90 - i_angle);
+ i_left_space := 14/80 ex;
+
+ penpos1 (serif_thick, -i_twiddle_start_angle);
+ z1r = right_ending;
+
+ y2l = ex + overshoot;
+ z2l = .08 [z3l, z3r] + whatever * idir;
+ z2r = 5/8 [z1r, z3l] + whatever * idir;
+ y2r = y5l + 1/9 ex;
+ z2 = 1/2 [z2l, z2r];
+
+ penpos3 (whatever, 20);
+ y3l = 1/8 ex + ypart center;
+ z3l = z7l + whatever * idir;
+ z3r = z7r + whatever * idir;
+
+ penpos5 (whatever, 10);
+ z5l = right_ending + (i_left_space, 0);
+ z5r = z7r + whatever * idir;
+
+ penpos6 (serif_thick, -i_twiddle_end_angle);
+ y6l = 23/80 ex + ypart center;
+ z6l = 1.6 [z3l, z3r] + whatever * idir;
+
+ penpos7 (i_thick, 0);
+ y7 = 0;
+ z7l = z5l + whatever * idir;
+
+ z8 = z7 - (0, overshoot);
+
+ fill simple_serif (z1l, z1r, 90)
+ ..tension 1.05.. z2r{right}
+ .. z5l{z3 - z5}
+ -- z3l{z3 - z5}
+ .. z8{right}
+ .. simple_serif (z6r, z6l, 90)
+ ..tension 0.85.. z3r{z5 - z3}
+ -- z5r{z5 - z3}
+ ..tension 1.2.. z2l{left}
+ .. cycle;
+
+ penlabels (range 1 thru 8);
+fet_endchar;
+
+
+code := 113;
+
+fet_beginchar ("dynamic r", "r");
+ save base_point, stem_thick, bulb_diam;
+ save twiddle_thick, attach_len, overshoot, taille;
+ pair base_point;
+
+ set_char_box (0, .75 ex#, 0, ex#);
+
+ stem_thick =.26 ex;
+ bulb_diam = .30 ex;
+ twiddle_thick = 1.1 serif_thick;
+ overshoot = .5 serif_thick;
+ taille = -0.3 serif_thick;
+ attach_len + bulb_diam / 2 + stem_thick = w;
+
+
+ base_point = (0, 0);
+
+ currenttransform := identity slanted ypart (dir (15));
+
+ penpos1 (stem_thick, 0);
+ x1l = 0;
+ y1l = .5 bottom_blot;
+
+ penpos2 (stem_thick, 0);
+ x2l = x1l;
+ y2l - y1l = 36/47 ex;
+
+ penpos3 (twiddle_thick, -20);
+ x3r = x2l - .2 ex;
+ y3 = .77 ex;
+
+ x4l = -0.1 [x1l, x1r];
+ y4l = ex + overshoot;
+ x4r = 0.62 [x3r, x2l];
+ y4r = 0.5 [y4l, y2l];
+
+ penpos5 (whatever, -74);
+ y5l - y5r = bulb_diam;
+ y5l = ex + overshoot;
+ x5 = x2r + attach_len;
+
+ penpos6 (bulb_diam, 0);
+ z6 = z5;
+
+% z7 = z6l + taille * dir (180);
+ z7 = z6 + .4 * bulb_diam * dir (-125);
+
+ z8 = 9/10 [z1r, z2r];
+
+ x9 = 0.15 [x1r, x1l];
+ y9 = y4l - .12 ex;
+
+ penpos10 (stem_thick - bottom_blot, 0);
+ x10 = x1;
+ y10 = 0;
+
+% pickup pencircle scaled 1;
+
+% draw
+ fill z1r{down}
+ .. z10r{left}
+ -- z10l{left}
+ .. z1l{up}
+ -- z2l{up}
+ .. z4r{left}
+ ..tension 1.2.. {down}simple_serif (z3r, z3l,-90){up}
+ ..tension 0.95.. z4l
+ .. {curl 1}z9{curl 1}
+ .. z5l
+ .. z6r{dir (-80)}
+ .. z5r{left}
+ .. z7
+ .. z6l
+ ..tension 1.2.. z8{down}
+ -- cycle;
+
+ penlabels (range 1 thru 10);
+fet_endchar;
+
+
+%%% KERNING
+
+ligtable "m":
+ "p" kern 0.2 ex#,
+ "f" kern -0.1 ex#;
+
+ligtable "f":
+ "f" kern -0.13 ex#;
+
+ligtable "r":
+ "f" kern 0.1 ex#;
+
+
+%% notes from old dyn code.
+
+% `f' obviously has a _lot_ bigger slant than `p' (see Wanske p.239).
+% However; perhaps we need two f symbols:
+% - a super-slanted one used in `f', `mf', `sfz', `sf'
+% - a more normal-slanted in `ff', `fff', `fp', `fp' (see Wanske p.241)
+%
+% Looking at professionally typeset music reveals that typesetters
+% are somewhat unsure about slanting in `mf', `fp', `sfz'
+%
+% `f' and `p' (in any combination) are a lot (factor two) fatter than
+% `s', `m', and `z'. Sometimes the `m' and `z' are a bit fatter than
+% `s'.
+%
+% Chester, Breitkopf suggest smaller sizes of these other glyphs,
+% using the x-height as reference point.
diff --git a/muse2/share/scoreglyphs/feta-original/feta-eindelijk.mf b/muse2/share/scoreglyphs/feta-original/feta-eindelijk.mf
new file mode 100644
index 00000000..de97f186
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-eindelijk.mf
@@ -0,0 +1,593 @@
+% feta-eindelijk.mf -- implement rest symbols -*-Fundamental-*-
+%
+% part of LilyPond's pretty-but-neat music font
+%
+% source file of the Feta (not the Font-En-Tja) music font
+%
+% (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+
+fet_begingroup ("rests");
+
+save block_rest_y, block_rest_x;
+save breve_rest_y, breve_rest_x;
+
+breve_rest_y# = staff_space#;
+breve_rest_x# = 3/5 staff_space#;
+block_rest_y# = 5/8 staff_space#;
+block_rest_x# = 3/2 staff_space#;
+
+define_whole_pixels (block_rest_y, block_rest_x);
+define_whole_pixels (breve_rest_y, breve_rest_x);
+
+
+def block_rest =
+ draw_block ((0, 0), (block_rest_x, block_rest_y));
+enddef;
+
+
+fet_beginchar ("whole rest", "0");
+ set_char_box (0, block_rest_x#,
+ block_rest_y#, 0);
+
+ block_rest;
+ currentpicture := currentpicture
+ shifted (0, -block_rest_y + feta_space_shift);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("half rest", "1");
+ set_char_box (0, block_rest_x#, 0, block_rest_y#);
+
+ block_rest;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+%
+% should use ledgerline thickness?
+%
+fet_beginchar ("whole rest (outside staff)", "0o");
+ set_char_box (0, block_rest_x#,
+ block_rest_y#, ledgerlinethickness# / 2);
+
+ block_rest;
+ currentpicture := currentpicture shifted (0, -block_rest_y);
+
+ pickup pencircle scaled ledgerlinethickness;
+
+ y5 = y6 = 0;
+ lft x5 = -b - block_rest_y;
+ rt x6 = w + block_rest_y;
+ draw_gridline (z5, z6, ledgerlinethickness_rounded);
+
+ draw_staff (-2, 2, -3);
+fet_endchar;
+
+
+fet_beginchar ("half rest (outside staff)", "1o");
+ set_char_box (0, block_rest_x#,
+ ledgerlinethickness# / 2, block_rest_y#);
+
+ block_rest;
+
+ pickup pencircle scaled ledgerlinethickness;
+
+ y5 = y6 = 0;
+ lft x5 = -b - block_rest_y;
+ rt x6 = w + block_rest_y;
+
+ draw_gridline (z5, z6, ledgerlinethickness_rounded);
+
+ draw_staff (-2, 2, 3);
+fet_endchar;
+
+
+fet_beginchar ("maxima rest", "M3");
+ set_char_box (0, 3 breve_rest_x#, breve_rest_y#, breve_rest_y#);
+
+ draw_block ((0, -breve_rest_y + feta_shift),
+ (breve_rest_x, breve_rest_y));
+
+ addto currentpicture also currentpicture shifted (2 breve_rest_x, 0);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("longa rest", "M2");
+ set_char_box (0, breve_rest_x#, breve_rest_y#, breve_rest_y#);
+
+ draw_block ((0, -breve_rest_y + feta_shift),
+ (breve_rest_x, breve_rest_y));
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("breve rest", "M1");
+ set_char_box (0, breve_rest_x#, 0, breve_rest_y#);
+
+ draw_block ((0, 0), (breve_rest_x, breve_rest_y));
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Quarter rest", "2");
+ save alpha, yshift, height;
+ save xcenter;
+
+ yshift# := -1.25 staff_space#;
+ height# := 2.8125 staff_space#;
+ define_pixels (yshift, height);
+
+ alpha := -50;
+ thick := 1/4 staff_space;
+ rthin := 1.25 linethickness;
+ xcenter := -0.1 staff_space;
+ rthick := 2 thick + rthin;
+
+ set_char_box (0, 0.95 staff_space#, -yshift#, yshift# + height#);
+
+ save ne, nw, se, sw;
+ pair ne, nw, se, sw;
+
+ se = dir alpha;
+ ne = dir (alpha + 90);
+ nw = dir (alpha + 180);
+ sw = dir (alpha + 270);
+
+ penpos1 (rthin, alpha + 90);
+ penpos2 (5/4 rthick, alpha);
+ penpos4 (5/4 rthick, alpha);
+ penpos5 (rthin, alpha + 90);
+ penpos3 (3/4 rthick, alpha);
+% penpos6 (5/8 rthick, alpha);
+ penpos6 (2/3 rthick, alpha);
+ penpos7 (1/2 rthin, alpha + 90);
+
+ z10 = z2l + 1/2 rthin * sw;
+% z11 = z4l + 1/2 rthin * sw;
+ z11 = z4l + 1/2 rthin * sw + 1/2 rthin * se;
+ z12 = z4r + 1/2 rthin * ne;
+% z13 = z2r + 1/2 rthin * ne;
+ z13 = z2r + 1/2 rthin * ne + 1/2 rthin * nw;
+
+ y1r = h;
+ x1l = xcenter + 1/3 staff_space;
+ z2r = z1 + staff_space * se;
+ z3 = 1/2 [z2, z4];
+ x4 = xcenter + 3/8 staff_space;
+ y4 = 0;
+ y4l := vround y4l;
+ z5 = round (z4l + 1.3 staff_space * se) + feta_offset;
+ x6l = x4l;
+ y6l = vround y4r;
+ x6r := hround x6r + xpart feta_offset;
+ y6r := vround y6r + ypart feta_offset;
+ x7 = hround (xcenter + 2/5 staff_space) + xpart feta_offset;
+ y7 = -d;
+
+ save before, after;
+ path before, after;
+ before = z11{se}
+ .. {se}z5l;
+ after = z5r{nw}
+ ..tension1.4.. z6l;
+ (u, v) = before intersectiontimes after;
+
+ fill z1l{se}
+ .. {se}z10
+ .. z3l
+ .. subpath (0, u) of before
+ .. subpath (v, infinity) of after
+ ..tension1.4.. {se}z7l
+ .. z7r{nw}
+ ..tension1.4.. z6r
+ ..tension1.4.. {se}z5l
+ .. z5r{nw}
+ .. {nw}z12
+ .. z3r
+ .. z13{nw}
+ .. {nw}z1r
+ .. cycle;
+
+ penlabels (1, 2, 3, 4, 5, 6, 7);
+ penlabels (10, 11, 12, 13);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+%
+% Notes about 8th rest:
+%
+% * 8th rest should be no wider than the black note head
+%
+% * The inside corner of the horizontal portion is usually a little blotted.
+%
+% * The top of the crook chops off the vertical brush
+%
+% * The crook widens a little
+%
+% * The bottom of the brush is slightly flat, as it has to align with
+% stafflines if it is inside the staff.
+%
+% * The top of the brush usually is a little lower than the top of bulb.
+%
+% * The bulb can vary. Sometimes it is open (like in the clefs). Sometimes
+% it is closed, or even a flare.
+%
+
+% from an email to Rune Zedeler:
+%
+%
+% For example, the 8th rest was vaguely based on a book with trumpet
+% studies by Duhem, and by Baerenreiters cello suites. I included my
+% findings in a comment in the mf file. One of the things that I tried
+% to do was make the rest a little lighter and narrower than the black
+% note head. I think this looks better in polyphonic music, when the
+% rest is below a head from a different voice.
+%
+
+save bulb_diam, thin, thick;
+
+bulb_diam# := 0.64 staff_space#;
+thin# := 1.4 linethickness# - 0.02 staff_space#;
+thick# := 2.2 linethickness#;
+
+crook_thin := 0.5 linethickness + 0.08 staff_space;
+lower_brush := 1.5 linethickness;
+
+define_pixels (bulb_diam);
+define_whole_blacker_pixels (thin, thick);
+
+
+%
+% PAT is a compact way to pass the brush shape to the routine.
+%
+
+def draw_rest_bulb (expr ycenter, ycut, pat, stretch, show_labels) =
+begingroup;
+ save x, y, pt, res;
+
+ z1l = point 0 of pat;
+ z2l = point 1 of pat;
+ z2r = point 3 of pat;
+ z1r = point 4 of pat;
+ z1 = 0.5 [z1l, z1r];
+ z2 = 0.5 [z2l, z2r];
+ y10 = ycenter;
+ z10 = whatever [z2, z1] + left * bulb_diam * stretch;
+
+ % this enforces similar bulb shapes for lower resolutions
+ x10 := hround x10;
+
+ z3 = z10 + bulb_diam / 2.15 * dir (-72);
+ y3 := hround y3;
+ z5 = z10 + up * bulb_diam / 2 + right * linethickness / 3;
+ y5 := hround y5;
+
+ z7 = 0.5 [z4, z5] + crook_thin * (0.45, 0.4) / 1.3;
+ x8 = hround (x10 - 0.4 bulb_diam);
+ y8 = y10 + 0.25 linethickness;
+
+ z6 = whatever [z1l, z2l];
+ z6 = z3 + whatever * dir (12);
+
+ z4 = z3 + whatever * (z6 - z3)
+ + 1.1 crook_thin * (unitvector (z6 - z3) rotated 90);
+ x4 = x10 + bulb_diam * .62;
+ y4 := vround y4;
+
+ (pt, whatever) = pat intersectiontimes ((0, ycut) -- (w, ycut));
+
+ path res;
+ res = point pt of pat {-direction pt of pat}
+ ..tension 2.. z4{left}
+ ..tension 0.9.. z7
+ .. z5{left}
+ .. z8
+ .. z3{right}
+ .. {curl 0.2}z6;
+
+ if show_labels = 1:
+ labels (3, 4, 5, 6, 7, 8, 10);
+ fi;
+
+res
+endgroup;
+enddef;
+
+
+def draw_eighth_rest (expr show_labels) =
+ save ycenter;
+ save pat, bulb;
+ path pat, bulb;
+
+ set_char_box (0, 1.0 staff_space#,
+ 1.0 staff_space# + 0.5 linethickness#,
+ 0.5 staff_space# + bulb_diam# / 2);
+
+ penpos1 (thick, 0);
+ penpos2 (thin, 10);
+
+ y1 = -staff_space_rounded;
+ y2 = h - vround lower_brush;
+ x2r = w;
+ z2 = z1 + whatever * dir (72);
+ z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
+ y9 := vround y9;
+
+ x1l := hround x1l;
+ x1r := hround x1r;
+ x1 := .5 [x1l, x1r];
+
+ if show_labels = 1:
+ penlabels (1, 2);
+ labels (9);
+ fi;
+
+ pat = z1l
+ -- z2l
+ .. z9
+ .. z2r
+ -- z1r
+ .. cycle;
+ bulb = draw_rest_bulb (0.5 staff_space, y2r, pat, 1.0, show_labels);
+
+ fill simple_serif (z1l, z1r, 40)
+ -- z2r
+ .. z9
+ .. bulb
+ -- z1l
+ .. cycle;
+
+ draw_staff (-2, 2, 0);
+enddef;
+
+
+fet_beginchar ("Classical quarter rest", "2classical");
+ draw_eighth_rest (0);
+ currentpicture := currentpicture xscaled -1 shifted (w, 0);
+fet_endchar;
+
+
+fet_beginchar ("8th rest", "3");
+ draw_eighth_rest (1);
+fet_endchar;
+
+
+%
+% TODO: the X dimensions of the rests are fucked up:
+% they can collide with augmentation dots.
+%
+
+fet_beginchar ("16th rest", "4");
+ save ycenter;
+ save pat, bulb_a, bulb_b;
+ path pat, bulb_a, bulb_b;
+
+ set_char_box (0, 1.2 staff_space#,
+ 2.0 staff_space# + 0.5 linethickness#,
+ 0.5 staff_space# + bulb_diam# / 2);
+
+ penpos1 (thick, 0);
+ penpos2 (thin, 10);
+
+ y1 = -2 staff_space_rounded;
+ y2 = h - vround lower_brush;
+ x2r = w;
+ z2 = z1 + whatever * dir (74);
+ z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
+ y9 := vround y9;
+
+ x1l := hround x1l;
+ x1r := hround x1r;
+ x1 := .5 [x1l, x1r];
+
+ pat = z1l
+ -- z2l
+ .. z9
+ .. z2r
+ -- z1r
+ .. cycle;
+ bulb_a = draw_rest_bulb (.5 staff_space,
+ y2r, pat, 0.98, 1);
+ bulb_b = draw_rest_bulb (.5 staff_space - staff_space_rounded,
+ hround ((-0.5 + 0.2) * staff_space),
+ pat, 1.02, 1);
+
+ fill simple_serif (z1l, z1r, 40)
+ -- z2r
+ .. z9
+ .. bulb_a
+ -- bulb_b
+ -- z1l
+ .. cycle;
+
+ penlabels (1, 2);
+ labels (9);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("32th rest", "5");
+ save ycenter;
+ save pat, bulb_a, bulb_b, bulb_c;
+ path pat, bulb_a, bulb_b, bulb_c;
+
+ set_char_box (0, 1.3 staff_space#,
+ 2.0 staff_space# + 0.5 linethickness#,
+ 1.5 staff_space# + bulb_diam# / 2);
+
+ penpos1 (thick, 0);
+ penpos2 (thin, 10);
+
+ y1 = -2 staff_space_rounded;
+ y2 = h - vround lower_brush;
+ x2r = w;
+ z2 = z1 + whatever * dir (76);
+ z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
+ y9 := vround y9;
+
+ x1l := hround x1l;
+ x1r := hround x1r;
+ x1 := .5 [x1l, x1r];
+
+ pat = z1l
+ -- z2l
+ .. z9
+ .. z2r
+ -- z1r
+ .. cycle;
+ bulb_a = draw_rest_bulb (.5 staff_space + staff_space_rounded,
+ y2r, pat, 0.96, 1);
+ bulb_b = draw_rest_bulb (.5 staff_space,
+ hround ((0.5 + 0.2) * staff_space),
+ pat, 1.00, 1);
+ bulb_c = draw_rest_bulb (.5 staff_space - staff_space_rounded,
+ hround ((-0.5 + 0.21) * staff_space),
+ pat, 1.04, 1);
+
+ fill simple_serif (z1l, z1r, 40)
+ -- z2r
+ .. z9
+ .. bulb_a
+ -- bulb_b
+ -- bulb_c
+ -- z1l
+ .. cycle;
+
+ penlabels (1, 2);
+ labels (9);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("64th rest", "6");
+ save ycenter;
+ save pat, bulb_a, bulb_b, bulb_c, bulb_d;
+ path pat, bulb_a, bulb_b, bulb_c, bulb_d;
+
+ set_char_box (0, 1.4 staff_space#,
+ 3.0 staff_space# + 0.5 linethickness#,
+ 1.5 staff_space# + bulb_diam# / 2);
+
+ penpos1 (thick, 0);
+ penpos2 (thin, 10);
+
+ y1 = -3 staff_space_rounded;
+ y2 = h - vround lower_brush;
+ x2r = w;
+ z2 = z1 + whatever * dir (78);
+ z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
+ y9 := vround y9;
+
+ x1l := hround x1l;
+ x1r := hround x1r;
+ x1 := .5 [x1l, x1r];
+
+ pat = z1l
+ -- z2l
+ .. z9
+ .. z2r
+ -- z1r
+ .. cycle;
+ bulb_a = draw_rest_bulb (.5 staff_space + staff_space_rounded,
+ y2r, pat, 0.94, 1);
+ bulb_b = draw_rest_bulb (.5 staff_space,
+ hround ((0.5 + 0.20) * staff_space),
+ pat, 0.98, 1);
+ bulb_c = draw_rest_bulb (.5 staff_space - staff_space_rounded,
+ hround ((-0.5 + 0.21) * staff_space),
+ pat, 1.02, 1);
+ bulb_d = draw_rest_bulb (.5 staff_space - 2 staff_space_rounded,
+ hround ((-1.5 + 0.22) * staff_space),
+ pat, 1.06, 1);
+
+ fill simple_serif (z1l, z1r, 40)
+ -- z2r
+ .. z9
+ .. bulb_a
+ -- bulb_b
+ -- bulb_c
+ -- bulb_d
+ -- z1l
+ .. cycle;
+
+ penlabels (1, 2);
+ labels (9);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("128th rest", "7");
+ save ycenter;
+ save pat, bulb_a, bulb_b, bulb_c, bulb_d, bulb_e;
+ path pat, bulb_a, bulb_b, bulb_c, bulb_d, bulb_e;
+
+ set_char_box (0, 1.5 staff_space#,
+ 3.0 staff_space# + 0.5 linethickness#,
+ 2.5 staff_space# + bulb_diam# / 2);
+
+ penpos1 (thick, 0);
+ penpos2 (thin, 10);
+
+ y1 = -3 staff_space_rounded;
+ y2 = h - vround lower_brush;
+ x2r = w;
+ z2 = z1 + whatever * dir (80);
+ z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1)- 10);
+ y9 := vround y9;
+
+ x1l := hround x1l;
+ x1r := hround x1r;
+ x1 := .5 [x1l, x1r];
+
+ pat = z1l
+ -- z2l
+ .. z9
+ .. z2r
+ -- z1r
+ .. cycle;
+ bulb_a = draw_rest_bulb (.5 staff_space + 2 staff_space_rounded,
+ y2r, pat, 0.92, 1);
+ bulb_b = draw_rest_bulb (.5 staff_space + staff_space_rounded,
+ hround ((1.5 + 0.20) * staff_space),
+ pat, 0.96, 1);
+ bulb_c = draw_rest_bulb (.5 staff_space,
+ hround ((0.5 + 0.21) * staff_space),
+ pat, 1.0, 1);
+ bulb_d = draw_rest_bulb (.5 staff_space - staff_space_rounded,
+ hround ((-0.5 + 0.22) * staff_space),
+ pat, 1.04, 1);
+ bulb_e = draw_rest_bulb (.5 staff_space - 2 staff_space_rounded,
+ hround ((-1.5 + 0.23) * staff_space),
+ pat, 1.08, 1);
+
+ fill simple_serif (z1l, z1r, 40)
+ -- z2r
+ .. z9
+ .. bulb_a
+ -- bulb_b
+ -- bulb_c
+ -- bulb_d
+ -- bulb_e
+ -- z1l
+ .. cycle;
+
+ penlabels (1, 2);
+ labels (9);
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_endgroup ("rests");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-generic.mf b/muse2/share/scoreglyphs/feta-original/feta-generic.mf
new file mode 100644
index 00000000..f2c90cdf
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-generic.mf
@@ -0,0 +1,57 @@
+%
+% feta-generic.mf -- implement generic stuff: include lots of files, but don't
+% set dims.
+%
+% source file of the Feta (defintively not an abbreviation for Font-En-Tja)
+% music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+
+
+if test = -1:
+ mode := smoke;
+fi
+
+staffsize# := design_size * pt#;
+
+mode_setup;
+
+input feta-macros;
+
+input feta-params;
+
+font_x_height staff_space#;
+
+%% this is a fallback so we can run the font without including feta-bolletjes.
+black_notehead_width# := 1.0 staff_space#;
+
+
+fet_beginfont ("feta", design_size, "fetaMusic");
+
+if test = 0:
+ input feta-eindelijk;
+ input feta-toevallig;
+ input feta-arrow;
+ input feta-puntje;
+ input feta-bolletjes;
+ input feta-schrift;
+ input feta-banier;
+ input feta-klef;
+ input feta-timesig;
+ input feta-pendaal;
+ input feta-haak;
+ input feta-accordion;
+else:
+ input feta-test-generic.mf;
+fi
+
+autometric_parameter ("staffsize", staffsize#);
+autometric_parameter ("stafflinethickness", stafflinethickness#);
+autometric_parameter ("staff_space", staff_space#);
+autometric_parameter ("linethickness", linethickness#);
+autometric_parameter ("black_notehead_width", black_notehead_width#);
+autometric_parameter ("ledgerlinethickness", ledgerlinethickness#);
+autometric_parameter ("blot_diameter", blot_diameter#);
+
+fet_endfont;
diff --git a/muse2/share/scoreglyphs/feta-original/feta-haak.mf b/muse2/share/scoreglyphs/feta-original/feta-haak.mf
new file mode 100644
index 00000000..ddc01c08
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-haak.mf
@@ -0,0 +1,92 @@
+% feta-haak.mf -- implement bracket tips -*-Fundamental-*-
+%
+% part of LilyPond's pretty-but-neat music font
+%
+% source file of the Feta (not the Font-En-Tja) music font
+%
+% (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+fet_begingroup ("brackettips");
+
+def draw_bracket (expr thick_sharp, width_sharp, updown) =
+begingroup;
+ save p, thin, thick, flattening, width, hair, flare;
+ path p;
+ pair tipdir;
+
+ flattening = 0.72;
+ thick# = thick_sharp;
+ flare# = flattening * width#;
+ width# = width_sharp;
+
+ define_pixels (thick, width, flare);
+ if updown = 1:
+ set_char_box (0, width#,
+ .5 thick#, flare#);
+ else:
+ set_char_box (0, width#,
+ flare#, .5 thick#);
+ fi;
+
+ thin = 2 linethickness;
+ hair = 1.25 linethickness;
+
+ pickup pencircle scaled thin;
+ y7 = y1;
+ x7 = x2;
+ z2 = z4r + (thin, 0);
+
+ penpos3 (thin, 0);
+ penpos4 (thin, 90);
+
+ z3 = z4;
+
+ top y3 = 0.5 thick;
+ lft x3 = 0.0;
+ x1 = x3l;
+ y1 = -0.5 thick;
+
+ z8 = .5 [z2, z7];
+ top y5 = flare;
+ rt x5 = width;
+
+ p := z8{right}
+ ..tension 1.2.. z5{curl 0};
+ tipdir := direction 1 of p;
+
+ penpos5 (hair, angle tipdir);
+ penpos6 (hair, 90 + angle tipdir);
+
+ z5 = z6;
+
+ pickup pencircle scaled 1;
+
+ fill (z1
+ -- z3l{up}
+ .. z4r{right}
+ -- z2{right}
+ .. z6r{tipdir}
+ .. z5r
+ .. z6l{-tipdir}
+ ..tension 1.1.. z7{left}
+ & z7
+ -- z1
+ & cycle) yscaled updown;
+
+ if updown = 1:
+ penlabels (1, 2, 3, 4, 5, 6, 7, 8);
+ fi;
+endgroup;
+enddef;
+
+
+fet_beginchar ("bracket tip up", "up");
+ draw_bracket (0.45 staff_space#, 1.9 staff_space#, 1);
+fet_endchar;
+
+
+fet_beginchar ("bracket tip down", "down");
+ draw_bracket (0.45 staff_space#, 1.9 staff_space#, -1);
+fet_endchar;
+
+fet_endgroup ("brackettips");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-klef.mf b/muse2/share/scoreglyphs/feta-original/feta-klef.mf
new file mode 100644
index 00000000..15008d84
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-klef.mf
@@ -0,0 +1,698 @@
+% feta-klef.mf -- implement Clefs -*-Fundamental-*-
+%
+% part of LilyPond's pretty-but-neat music font
+%
+% source file of the Feta (not the Font-En-Tja) music font
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>,
+% Jan Nieuwenhuizen <janneke@gnu.org>,
+% Juergen Reuter <reuter@ipd.uka.de>
+
+
+fet_begingroup ("clefs");
+
+%
+% [Wanske] says the bulbs should be positioned about 1/4 right of the
+% `arrow'.
+%
+% TODO: The hair-curve at z6r looks a little awkward.
+%
+
+def draw_c_clef (expr reduction) =
+ save hair, norm, reduced_ss, right_edge;
+ save xoff;
+
+ reduced_ss# = staff_space# * reduction;
+ norm# := 2/3 reduced_ss#;
+ hair# := 0.06 reduced_ss# + 0.5 linethickness#;
+ right_edge# = 15/4 norm# + 2 hair#;
+ define_pixels (norm, reduced_ss, right_edge);
+ define_whole_vertical_blacker_pixels (hair);
+
+ set_char_box (0, right_edge#, 2 reduced_ss#, 2 reduced_ss#);
+
+ % make unreduced glyph fit exactly into five staff lines
+ if reduction = 1:
+ h := d := 2 staff_space_rounded;
+ fi;
+
+ % assure that the gap between the left and right stem
+ % has the same number of pixels as the thickness of the right
+ % stem
+ draw_block ((0, -d + feta_shift),
+ (3/4 norm + 1/2 hair, h));
+ draw_block ((3/4 norm + 1/2 hair + hround (3/2 hair), -d + feta_shift),
+ (3/4 norm + 1/2 hair + 2 hround (3/2 hair), h));
+
+ % assure symmetry
+ h := h - feta_shift;
+
+ pickup feta_fillpen;
+
+ xoff = 3/4 norm + 1/2 hair + 2 hround (3/2 hair);
+ z5l = (xoff - 3/4 hair, 0);
+ z5r = (x4, 0);
+
+ penpos1 (hair - pen_top - pen_bot, -90);
+ top z1l = (xoff + norm + hair, h);
+
+ penpos2 (hround (norm - 3/2 hair) - pen_lft - pen_rt, 180);
+ rt z2l = (w, h / 2);
+
+ penpos3 (hair - pen_top - pen_bot, 90);
+ bot z3l = ((right_edge - xoff) / 2 + xoff,
+ vround (.5 norm - 1.5 hair));
+
+ penpos4 (hair - pen_lft - pen_rt, 0);
+ top z4 = (xoff + 1/2 norm + 1/2 hair,
+ vfloor (reduced_ss - linethickness - .2 hair));
+
+ bot z6 = (xoff + 3/4 norm, vround (.5 norm - .5 hair));
+
+ save t;
+ t = 0.833;
+
+ save pat;
+ path pat;
+
+ pat = z5l{curl 1}
+ .. z4l{up}
+ .. z4r{down}
+ .. z3r{right}
+ ..tension t.. z2r{up}
+ ..tension t.. flare_path (top z1l, 180, 90,
+ hair, hfloor (norm - 1/2 hair), -1)
+ ..tension t.. z2l{down}
+ .. z3l{left}
+ .. z6
+ .. z5r{down};
+
+ filldraw pat shifted (0, feta_shift)
+ -- reverse pat yscaled -1 shifted (0, -feta_eps)
+ -- cycle;
+
+ penlabels (1, 2, 3, 4, 5, 6);
+
+ % ugh, should be bulb, not flare?
+
+ draw_staff (-2, 2, 0);
+enddef;
+
+
+fet_beginchar ("C clef", "C");
+ draw_c_clef (1.0);
+fet_endchar;
+
+
+fet_beginchar ("C clef", "C_change");
+ draw_c_clef (.8);
+fet_endchar;
+
+
+%
+% New bulb routine:
+%
+% Insert a brushed piece of the path, and draw the rest of the bulb
+% separately.
+%
+% The bulb has circular form. Neat merging of the bulb and brushed path
+% is done by playing with tension.
+%
+
+def new_bulb (expr start_point, start_angle,
+ outer_tangent_point,
+ end_point, end_angle,
+ big_radius, bulb_radius, flare,
+ direction, turning_dir) =
+begingroup;
+ save pat, before, after;
+ save center;
+ save u, v;
+ path pat, before, after;
+ pair center;
+
+ clearxy;
+
+ center = outer_tangent_point
+ + big_radius * dir (0);
+% + (big_radius - bulb_radius) * dir (-turning_dir * 90)
+
+ z1' = center + bulb_radius * dir (turning_dir * 180);
+ z2' = outer_tangent_point + flare * dir (0);
+ z3' = center + bulb_radius * dir (0);
+ z4' = center + bulb_radius * dir (turning_dir * 90);
+ z5' = center - 0.5 [big_radius, bulb_radius] * dir (turning_dir * 90);
+
+ labels (1', 2', 3', 4', 5');
+
+ before := z3'{dir (turning_dir * 90)}
+ .. z4'{-dir (0)}
+ ..tension 1.1.. z1'{-dir (turning_dir* 90)};
+ after := z2'{dir (turning_dir * 90)}
+ .. end_point{dir (end_angle)};
+ (u, v) = before intersectiontimes after;
+
+ pat := start_point{dir (start_angle)}
+ .. outer_tangent_point{dir (-turning_dir * 90)}
+ ..tension 1.02.. z5'{dir (0)}
+ .. subpath (0, u) of before
+ .. subpath (v, infinity) of after;
+
+ if direction = 0:
+ pat := reverse pat;
+ fi
+
+pat
+endgroup
+enddef;
+
+
+%
+% There is some variation in the shape of bass clefs.
+%
+% * In some clefs the size of the swoosh tip almost reaches the
+% bottom staff line; in some it crosses the 2nd line from the bottom
+% with a small overshoot.
+%
+% The most popular design is where the X part of the tip is aligned
+% with the left bulb boundary, and the Y part ends on the 2nd
+% staffline exactly. This is what we do.
+%
+% * The diameter of the bulb is the width of the open space.
+%
+% * The vertical center of the bulb can be on or slightly above the
+% staff line.
+%
+% * The vertical position of the dots can be symmetrical around the
+% staffline, centered in the staff space. The Baerenreiter SCS has
+% the bottom dot raised by approximately 0.1 staff space.
+%
+% * Uncarefully set music may have overshoots at the top. We have none.
+%
+% * It is not exactly clear where the vertical tangent at the right
+% of the swoosh should be.
+%
+
+def draw_bass_clef (expr exact_center, reduction) =
+ save reduced_ss, swoosh_width;
+ save right_thickness, right_offset, tip_protrude;
+ save dot_diam, bulb_y_offset, bulb_flare;
+ pair tip_protrude;
+
+ reduced_ss# = staff_space# * reduction;
+ 2.2 dot_diam# = reduction * (staff_space# - stafflinethickness#);
+ right_thickness# = 0.37 staff_space# + 1.2 linethickness#;
+ swoosh_width# = 2.1 reduced_ss#;
+ define_pixels (swoosh_width);
+ define_whole_pixels (reduced_ss);
+ define_whole_blacker_pixels (dot_diam, right_thickness);
+
+ right_offset = 0.05 staff_space;
+ bulb_y_offset := 0.075 staff_space;
+ bulb_flare := 2.5 linethickness;
+% tip_protrude := (-linethickness, -.2 staff_space);
+ tip_protrude := (0, 0);
+
+ set_char_box (-xpart exact_center,
+ xpart exact_center + swoosh_width# + 7/12 reduced_ss#,
+ -ypart exact_center + 2.5 reduced_ss#,
+ ypart exact_center + reduced_ss#);
+
+ y1 = bulb_y_offset;
+ x1 = 0;
+
+ x2 = .5 [x1, x3];
+ x2l = x2r = x2;
+
+ y2l := vround_pixels (reduced_ss# + 0.5 linethickness#);
+ y2l - y2r = linethickness;
+
+ x3l - x1 = swoosh_width;
+ x3l - x3r = right_thickness;
+
+ % optical correction: the top dot seems farther away if y3l = 0.
+ y3l = right_offset;
+
+ z4 = -(0, 2.0 reduced_ss) + tip_protrude;
+
+ penpos3 (whatever, 185);
+ penpos4 (linethickness, 135);
+
+ fill new_bulb (z2l, 180, z1, z2r, 0,
+ 0.45 reduced_ss, 0.4 reduced_ss,
+ bulb_flare, 1, 1)
+ .. z3r{down}
+ .. {curl 0}simple_serif (z4r, z4l, 90){curl 0}
+ .. z3l{up}
+ ..tension 0.9.. cycle;
+
+ pickup pencircle scaled dot_diam;
+
+ lft x5 = hround (x3l + 1/3 reduced_ss - dot_diam / 2);
+ bot y5 = vfloor (.5 reduced_ss - dot_diam / 2);
+ z6 = z5 yscaled -1;
+
+ % for symmetry
+ y5 := y5 + feta_shift;
+
+ drawdot z5;
+ drawdot z6;
+
+ penlabels (1, 2, 3, 4, 5, 6);
+
+ draw_staff (-3, 1, 0);
+enddef;
+
+
+fet_beginchar ("F clef ", "F");
+ draw_bass_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("F clef (reduced)", "F_change");
+ draw_bass_clef ((0, 0), 0.8);
+fet_endchar;
+
+
+
+%
+% Inspired by Baerenreiter
+%
+%
+% 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
+%
+% -- vrij naar Van Kooten & De Bie
+%
+
+def debugfill = fill enddef;
+
+def draw_gclef (expr reduction) =
+ save reduced_ss, downstroke_dir, downstroke_angle, center;
+ save breapth_factor, inner_thick_end, thinness, thickness, thinnib;
+ save start_angle, inner_start_angle, thinness;
+ save upward_swoosh_angle, bot_angle;
+ save pat;
+ path pat;
+ pair downstroke_dir, center;
+
+ reduced_ss# = staff_space# * reduction;
+ define_pixels (reduced_ss);
+
+ thinness = 0.095 staff_space + 0.75 linethickness;
+ downstroke_dir = unitvector (14, -75);
+ downstroke_angle = angle downstroke_dir;
+ bot_angle = -180; % downstroke_angle - 87
+
+ upward_swoosh_angle = 132;
+ start_angle = -97;
+
+ breapth_factor = 21/14;
+ inner_thick_end = 45;
+ inner_start_angle = downstroke_angle - 43;
+ thickness = .32 reduced_ss + 1.1 linethickness;
+
+ thinnib = thinness;
+
+ set_char_box (0, 1.71 * breapth_factor * reduced_ss#,
+ 2.6 * reduced_ss#, 5 * reduced_ss#);
+
+ center := (breapth_factor * reduced_ss, 0);
+
+ z1 = center + whatever * dir (inner_start_angle);
+ x1 = xpart center - .28 reduced_ss;
+ penpos1 (thinnib, inner_start_angle);
+
+ x2r = xpart center;
+ y2r = vround_pixels (reduced_ss# + .5 stafflinethickness#);
+ penpos2 (thickness, 90);
+
+ z3 = (z4 - center) rotated inner_thick_end + center;
+ penpos3 (thinnib, -90 + inner_thick_end);
+
+ x4 = xpart center - .1 reduced_ss;
+ y4r = -y2r + feta_shift;
+ penpos4 (thinnib, -90);
+
+ x5r = -breapth_factor * reduced_ss + xpart center;
+ y5r = .37 reduced_ss + ypart center;
+ penpos5 (thickness, upward_swoosh_angle);
+
+ z6 = center + whatever * downstroke_dir;
+ y6 = ypart center + 2 reduced_ss;
+ % penpos6 is computed later
+
+ z7l - z6 = whatever * (z5 - z6) ;
+ y7l = 3.5 reduced_ss;
+ penpos7 (thickness, upward_swoosh_angle);
+
+ x9 = .7 [x10, x7r];
+ top y9l = 5 reduced_ss;
+ penpos9 (1.45 thickness, -70);
+
+ x11 - x13r = 1.5 reduced_ss + 0.5 thinnib;
+ y11 = ypart center - 47/28 reduced_ss;
+ y12 = ypart center - 71/28 reduced_ss;
+ y13 = .48 [y12, y4r];
+ x12r = xpart (.45 [z13r, z11] + .75 reduced_ss * downstroke_dir);
+
+% z10 = center + whatever * dir (downstroke_angle - 1.5);
+ x10 = x6 - 2 thinnib;
+ y10 = ypart center + 3.5 reduced_ss;
+ y10l - y10r = 1.0 thickness;
+ z10r - z10l = .7 thinnib * dir (downstroke_angle + 90)
+ + whatever * downstroke_dir;
+ z10 = .5 [z10l, z10r];
+ z11 = center + whatever * downstroke_dir + (-0.05 reduced_ss, 0);
+
+ penpos11 (thinnib, start_angle + 90);
+ penpos12 (thinnib, bot_angle + 90);
+ penpos13 (thinnib + 0.14 staff_space, 180);
+
+ % this auxiliary point ensures good contour overlapping
+ z8 = .5 [z9l, z9r] + .25 ((z9r - z9l) rotated -90);
+
+ z20 = z9l - (0, .25 blot_diameter);
+ penpos20 (blot_diameter, 0);
+
+ pat := z10{down}
+ .. z6
+ ..tension 1.1.. z11{dir (start_angle)};
+
+ penpos6 (thinnib, angle (direction 1 of pat) + 90);
+
+ % two auxiliary points to simulate `draw' with `penstroke'
+ z10' = point 0.3 of pat;
+ penpos10' (1.3 thinnib, angle (direction 0.3 of pat) + 50);
+
+ z11' = point 1.5 of pat;
+ penpos11' (thinnib, angle (direction 1.5 of pat) + 90);
+
+ z21l = z20l;
+ z21r = z9r;
+
+ pat := z21l
+ .. z10l{down}
+ .. z10'l;
+
+ fill z2l{right}
+ .. z3l
+ .. z4l{left}
+ ..tension 1.07.. z5l{up} % inside curve
+ .. z7l{up}
+ ..tension 1.2.. z20r{curl 1}
+ .. {direction 0 of pat}z20l
+ -- z8
+ -- z9r % {dir (downstroke_angle + 0)}
+ ..tension 0.8.. z7r{down}
+ .. z5r{down}
+ .. z4r{right}
+ .. z3r
+ .. z2r{left}
+ ..tension .95.. z1r
+ -- simple_serif (z1r, z1l, 80)
+ -- z1l
+ ..tension 0.85.. cycle;
+
+ penstroke z21e
+ .. z10e{down}
+ .. z10'e
+ .. z6e
+ .. z11'e
+ .. z11e{dir (-95)}
+ .. z12e{dir (bot_angle)};
+
+ fill new_bulb (z12r, bot_angle, z13r, z12l, bot_angle + 180,
+ 0.45 reduced_ss, 0.38 reduced_ss,
+ thinnib + .05 staff_space, 1, -1)
+ -- cycle;
+
+ penlabels (range 1 thru 21);
+ penlabels (10', 11');
+
+ draw_staff (-1, 3, 0);
+enddef;
+
+
+fet_beginchar ("G clef", "G");
+ draw_gclef (1.0);
+fet_endchar;
+
+
+fet_beginchar ("G clef", "G_change");
+ draw_gclef (0.8);
+fet_endchar;
+
+
+%%%%
+%
+% PERCUSSION
+%
+
+%
+% The percussion clef extent is not coincident with its bbox, since
+% the percussion clef needs more space in front than a normal clef.
+%
+
+def draw_percussion_clef (expr reduction) =
+ save reduced_ss, razt;
+
+ reduced_ss# = staff_space# * reduction;
+ define_pixels (reduced_ss);
+
+ set_char_box (-.67 reduced_ss#, 2.0 reduced_ss#,
+ reduced_ss#, reduced_ss#);
+
+ razt := hround (0.45 reduced_ss);
+
+ d := d - feta_shift;
+
+ draw_block ((-b, -d), (-b + razt, h));
+ draw_block ((w - razt, -d), (w, h));
+
+ draw_staff (-3, 1, 1);
+enddef;
+
+
+fet_beginchar ("percussion clef", "percussion");
+ draw_percussion_clef (1.0);
+fet_endchar;
+
+
+fet_beginchar ("percussion clef (reduced)", "percussion_change");
+ draw_percussion_clef (.8);
+fet_endchar;
+
+
+def draw_tab_T (expr pos, siz, slant) =
+begingroup;
+ save vx, vy;
+ pair vx, vy;
+
+ clearxy;
+
+ vx = (xpart siz) * dir 0;
+ vy = (ypart siz) * dir 90;
+
+ penpos1 (.75 penh, 100);
+ z1 = z2 + (1/6 * vx - .15 * vy);
+ penpos2 (hround (.9 penw), 0);
+ x2l = hround xpart (pos + .75 vy);
+ y2l = ypart (pos + .75 vy);
+ penpos3 (penh, -100);
+ z3l = pos + .4 vx + vy;
+ penpos4 (penh, -90);
+ z4 = -.1 vy + .5 [z3, z5];
+ penpos5 (.8 penh, -30);
+ x5r = xpart (pos + siz);
+ y5l = ypart (pos + siz);
+
+ penpos10 (penw, 170);
+ z10 = pos + .55 vx + .9 vy;
+ penpos11 (.75 [penh, penw], 170);
+ z11 = z10 - .5 vy + .025 vx;
+ penpos12 (penh, 100);
+ z12l = (xpart .5 [z13, z11], ypart (pos - .025 * siz));
+ penpos13 (.75 penh, 60);
+ z13 = pos + .2 vx + .15 vy;
+
+ % penlabels (range 1 thru 13);
+
+ soft_penstroke (z1e
+ ..tension 1.1.. z2e
+ .. z3e{right}
+ ..tension 1.5.. z4e
+ ..z5e)
+ slanted slant shifted (slant * -ypart pos, 0);
+
+ soft_end_penstroke (z10e
+ ..tension 1.5.. z11e
+ .. z12e
+ ..tension 1.1.. z13e{(z13r - z13l) rotated 90})
+ slanted slant shifted (slant * -ypart pos, 0);
+endgroup;
+enddef;
+
+
+def draw_tab_A (expr pos, siz, slant) =
+begingroup;
+ save vx, vy, pat;
+ pair vx, vy;
+ path pat;
+
+ clearxy;
+
+ vx = (xpart siz) * dir 0;
+ vy = (ypart siz) * dir 90;
+
+ penpos1 (.75 penh, -110);
+ z1r = pos + .07 vy;
+ penpos2 (penh, -75);
+ z2r = (.5 [x1, x3], ypart pos);
+ penpos3 (.25 [penh, penw], -30);
+ z3 = (.45 [x2, x4], .15 [y2, y4]);
+ penpos4 (1 [penh, penw], 0);
+ z4 = pos + .5 vx + .975 vy;
+
+ penpos5 (1 [penh, penw], -180);
+ z5 = z4;
+ penpos6 (.2 [penh, penw], -150);
+ z6l = (.8 [x5l, x7l], .9 [y5l, y7l]);
+ penpos7 (penh,-90);
+ z7r = (.5 [x6, x8], ypart pos);
+ penpos8 (.75 penh, -70);
+ z8r = (xpart (pos + siz), y7r + .075 ypart (siz));
+
+ pat := z2
+ .. z3
+ .. z4;
+
+ penpos10 (penh, angle (direction 1.2 of pat) - 180);
+ z10 = point 1.2 of pat;
+ penpos11 (.9 penh, -90);
+ z11 = .4 [z10, z6] - 0.05 vy;
+ penpos12 (.75 penh, -75);
+ z12 = .3 [z11, z6] + 0.02 vy;
+
+ % penlabels (range 1 thru 12);
+
+ soft_penstroke (z1e{(z1r - z1l) rotated 90}
+ .. z2e
+ .. z3e
+ .. z4e)
+ slanted slant shifted (slant * -ypart pos, 0);
+
+ soft_end_penstroke (z5e
+ .. z6e
+ .. z7e
+ .. z8e{(z8r - z8l) rotated 90})
+ slanted slant shifted (slant * -ypart pos, 0);
+
+ soft_end_penstroke (z10e
+ .. z11e
+ .. z12e)
+ slanted slant shifted (slant * -ypart pos, 0);
+endgroup;
+enddef;
+
+
+def draw_tab_B (expr pos, siz, slant) =
+begingroup;
+ save vx, vy;
+ pair vx, vy;
+
+ clearxy;
+
+ vx = (xpart siz) * dir 0;
+ vy = (ypart siz) * dir 90;
+
+ penpos1 (.75 penh, 100);
+ z1 = z2 + (.15 * vx - .1 * vy);
+ penpos2 (hround (.9 penw), 0);
+ x2l = hround xpart (pos + .75 vy);
+ y2l = ypart (pos + .75 vy);
+ penpos3 (penh, -100);
+ z3l = pos + .4 vx + 1.05 vy;
+ penpos4 (.8 [penh, penw], -180);
+ z4 = (xpart (pos + .75 siz), .5 [y3, y5]);
+ penpos5 (.8 penh, 90);
+ z5 = (.5 [x10, x4], ypart (pos + .55 siz));
+
+ penpos6 (.8 penh, 270);
+ z6 = z5;
+ penpos7 (penw, 180);
+ z7l = (xpart (pos + siz), .5 [y6, y8]);
+ penpos8 (.8 penh, 45);
+ z8 = .5 [z12l, z11l] + .15 vx - .05 vy;
+
+ penpos10 (.75 [penh, penw], 170);
+ z10 = pos + .375 vx + vy;
+ penpos11 (.8 [penh, penw], 150);
+ z11 = z10 - .5 vy + .04 vx;
+ penpos12 (penh, 100);
+ z12l = (xpart .5 [z13, z11], ypart pos);
+ penpos13 (.75 penh, 60);
+ z13 = pos + .1 vx + .15 vy;
+
+ % penlabels (range 1 thru 13);
+
+ soft_penstroke (z1e
+ ..tension 1.1.. z2e
+ .. z3e
+ .. z4e
+ ..z5e {left})
+ slanted slant shifted (slant * -ypart pos, 0);
+
+ soft_end_penstroke (z6e{right}
+ .. z7e
+ .. z8e{(z8r - z8l) rotated 90})
+ slanted slant shifted (slant * -ypart pos, 0);
+
+ soft_end_penstroke (z10e
+ ..tension 1.5.. z11e
+ .. z12e
+ ..tension 1.1.. z13e{(z13r - z13l) rotated 90})
+ slanted slant shifted (slant * -ypart pos, 0);
+endgroup;
+enddef;
+
+
+def draw_tab_clef (expr reduction) =
+ save reduced_ss, letterheight, penw, penh;
+
+ reduced_ss# = staff_space# * reduction;
+ letterheight# = 1.8 reduced_ss#;
+ define_pixels (reduced_ss, letterheight);
+
+ set_char_box (-.2 reduced_ss#, 2.8 reduced_ss#,
+ 1.6 letterheight#, 1.6 letterheight#);
+
+ penw = .45 reduced_ss;
+ penh = .2 reduced_ss;
+
+ draw_tab_T ((-b + .15 reduced_ss, h - letterheight),
+ (2.1 reduced_ss, letterheight), 0.2);
+ draw_tab_A ((-b - .05 reduced_ss, -.5 letterheight +.15 reduced_ss),
+ (2.2 reduced_ss, letterheight), 0.4);
+ draw_tab_B ((-b + .025 reduced_ss, -d),
+ (2.1 reduced_ss, letterheight), 0.25);
+
+ draw_staff (-3, 2, 0.5);
+enddef;
+
+
+fet_beginchar ("tab clef", "tab");
+ draw_tab_clef (1.0);
+fet_endchar;
+
+
+fet_beginchar ("tab clef (reduced)", "tab_change");
+ draw_tab_clef (.8);
+fet_endchar;
+
+fet_endgroup ("clefs");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-macros.mf b/muse2/share/scoreglyphs/feta-original/feta-macros.mf
new file mode 100644
index 00000000..19cc379a
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-macros.mf
@@ -0,0 +1,497 @@
+%
+% feta-macros.mf -- auxiliary macros for both feta and parmesan fonts
+%
+% source file of the GNU LilyPond music typesetter
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+
+%
+% debugging
+%
+
+def print_penpos (suffix $) =
+ message
+ "z" & str$ & "l = (" & decimal x.$.l & ", " &decimal y.$.l & ");"
+ & " z" & str$ & "r = (" & decimal x.$.r & ", " & decimal y.$.r & ");";
+enddef;
+
+
+def test_grid =
+ if test > 1:
+ proofrulethickness 1pt#;
+
+ makegrid
+ (0pt, 0pt for i := -5pt step 1pt until 5pt: , i endfor)
+ (0pt, 0pt for i := -5pt step 1pt until 5pt: , i endfor);
+
+ proofrulethickness .1pt#;
+
+ makegrid
+ (0pt, 0pt for i := -4.8pt step .2pt until 4.8pt: , i endfor)
+ (0pt, 0pt for i := -4.8pt step .2pt until 4.8pt: , i endfor);
+ fi;
+enddef;
+
+
+def treq =
+ tracingequations := tracingonline := 1;
+enddef;
+
+
+def draw_staff (expr first, last, offset) =
+ if test <> 0:
+ pickup pencircle scaled stafflinethickness;
+
+ for i := first step 1 until last:
+ draw (-staff_space,
+ (i + offset) * staff_space_rounded)
+ -- (4 staff_space,
+ (i + offset) * staff_space_rounded);
+ endfor;
+ fi;
+enddef;
+
+
+%
+% Draw the outline of the stafflines. For fine tuning.
+%
+
+def draw_staff_outline (expr first, last, offset) =
+ if test <> 0:
+ save p;
+ path p;
+
+ pickup pencircle scaled 2;
+
+ for i := first step 1 until last:
+ p := (-staff_space,
+ (i + offset) * staff_space_rounded)
+ -- (4 staff_space,
+ (i + offset) * staff_space_rounded);
+
+ draw p shifted (0, .5 stafflinethickness);
+ draw p shifted (0, -.5 stafflinethickness);
+ endfor;
+ fi;
+enddef;
+
+
+%
+% Transformations
+%
+
+def scaledabout (expr point, scale) =
+ shifted -point scaled scale shifted point
+enddef;
+
+
+%
+% make a local (restored after endgroup) copy of t_var
+%
+
+def local_copy (text type, t_var) =
+ save copy_temp;
+ type copy_temp;
+ copy_temp := t_var;
+ save t_var;
+ type t_var;
+ t_var := copy_temp;
+enddef;
+
+
+%
+% Urgh! Want to do parametric types
+%
+
+def del_picture_stack =
+ save save_picture_stack, picture_stack_idx;
+enddef;
+
+
+%
+% better versions of Taupin/Egler savepic cmds
+%
+
+def make_picture_stack =
+ % override previous stack
+ del_picture_stack;
+ picture save_picture_stack[];
+ numeric picture_stack_idx;
+ picture_stack_idx := 0;
+
+ def push_picture (expr p) =
+ save_picture_stack[picture_stack_idx] := p;
+ picture_stack_idx := picture_stack_idx + 1;
+ enddef;
+
+ def pop_picture = save_picture_stack[decr picture_stack_idx] enddef;
+ def top_picture = save_picture_stack[picture_stack_idx] enddef;
+enddef;
+
+
+%
+% save/restore pens
+% why can't I delete individual pens?
+%
+
+def make_pen_stack =
+ del_pen_stack;
+ pen save_pen_stack[];
+ numeric pen_stack_idx;
+ pen_stack_idx := 0;
+ def push_pen (expr p) =
+ save_pen_stack[pen_stack_idx] := p;
+ pen_stack_idx := pen_stack_idx + 1;
+ enddef;
+ def pop_pen = save_pen_stack[decr pen_stack_idx] enddef;
+ def top_pen = save_pen_stack[pen_stack_idx] enddef;
+enddef;
+
+
+def del_pen_stack =
+ save save_pen_stack, pen_stack_idx;
+enddef;
+
+
+%
+% drawing
+%
+
+def soft_penstroke text t =
+ forsuffixes e = l, r:
+ path_.e := t;
+ endfor;
+
+ if cycle path_.l:
+ cyclestroke_;
+ else:
+ fill path_.l
+ ..tension1.5.. reverse path_.r
+ ..tension1.5.. cycle;
+ fi;
+enddef;
+
+
+def soft_start_penstroke text t =
+ forsuffixes e = l, r:
+ path_.e := t;
+ endfor;
+
+ if cycle path_.l:
+ cyclestroke_;
+ else:
+ fill path_.l
+ -- reverse path_.r
+ ..tension1.5.. cycle;
+ fi;
+enddef;
+
+
+def soft_end_penstroke text t =
+ forsuffixes e = l, r:
+ path_.e := t;
+ endfor;
+
+ if cycle path_.l:
+ cyclestroke_;
+ else:
+ fill path_.l
+ ..tension1.5.. reverse path_.r
+ -- cycle;
+ fi;
+enddef;
+
+
+%
+% Make a round path segment going from P to Q. 2*A is the angle that the
+% path should take.
+%
+
+def simple_serif (expr p, q, a) =
+ p{dir (angle (q - p) - a)}
+ .. q{-dir (angle (p - q) + a)}
+enddef;
+
+
+%
+% Draw an axis aligned block making sure that edges are on pixels.
+%
+
+def draw_rounded_block (expr bottom_left, top_right, roundness) =
+begingroup;
+ save size;
+ save x, y;
+
+ % Originally, there was `floor' instead of `round', but this is
+ % not correct because pens use `round' also.
+ size = round min (roundness,
+ xpart (top_right - bottom_left),
+ ypart (top_right - bottom_left));
+
+ z2 + (size / 2, size / 2) = top_right;
+ z4 - (size / 2, size / 2) = bottom_left;
+ y3 = y2;
+ y4 = y1;
+ x2 = x1;
+ x4 = x3;
+
+ pickup pencircle scaled size;
+
+ fill bot z1{right}
+ .. rt z1{up}
+ -- rt z2{up}
+ .. top z2{left}
+ -- top z3{left}
+ .. lft z3{down}
+ -- lft z4{down}
+ .. bot z4{right}
+ -- cycle;
+endgroup;
+enddef;
+
+
+def draw_block (expr bottom_left, top_right) =
+ draw_rounded_block (bottom_left, top_right, blot_diameter);
+enddef;
+
+
+def draw_square_block (expr bottom_left, top_right) =
+ save x, y;
+
+ x1 = xpart bottom_left;
+ y1 = ypart bottom_left;
+ x2 = xpart top_right;
+ y2 = ypart top_right;
+
+ fill (x1, y1)
+ -- (x2, y1)
+ -- (x2, y2)
+ -- (x1, y2)
+ -- cycle;
+enddef;
+
+
+def draw_gridline (expr bottom_left, top_right, thickness) =
+ draw_rounded_block (bottom_left - (thickness / 2, thickness / 2),
+ top_right + (thickness / 2, thickness / 2),
+ thickness);
+enddef;
+
+
+def draw_brush (expr a, w, b, v) =
+ save x, y;
+
+ z1 = a;
+ z2 = b;
+ z3 = z4 = z1;
+ z5 = z6 = z2;
+
+ penpos3 (w, angle (z2 - z1) + 90);
+ penpos4 (w, angle (z2 - z1));
+ penpos5 (v, angle (z1 - z2) + 90);
+ penpos6 (v, angle (z1 - z2));
+
+ fill z3r{z3r - z5l}
+ .. z4l
+ .. {z5r - z3l}z3l
+ .. z5r{z5r - z3l}
+ .. z6l
+ .. {z3r - z5l}z5l
+ .. cycle;
+enddef;
+
+
+%
+% Make a superellipsoid segment going from FROM to TO, with SUPERNESS.
+% Take superness = sqrt(2)/2 to get a circle segment.
+%
+% See Knuth, p. 267 and p.126.
+
+def super_curvelet (expr from, to, superness, dir) =
+ if dir = 1:
+ (superness [xpart to, xpart from],
+ superness [ypart from, ypart to]){to - from}
+ else:
+ (superness [xpart from, xpart to],
+ superness [ypart to, ypart from]){to - from}
+ fi
+enddef;
+
+
+%
+% Bulb with smooth inside curve.
+%
+% alpha = start direction
+% beta = which side to turn to
+% flare = diameter of the bulb
+% line = diameter of line attachment
+% direction = is ink on left or right side (1 or -1)
+%
+% Note that `currentpen' must be set correctly -- only circular pens
+% are supported properly.
+
+def flare_path (expr pos, alpha, beta, line, flare, direction) =
+begingroup;
+ save thick;
+
+ thick = pen_top + pen_bot;
+
+ clearxy;
+
+ penpos1' (line - thick, 180 + beta + alpha);
+ top z1'r = pos;
+
+ penpos2' (flare - thick, 180 + beta + alpha);
+ z2' = z3';
+
+ penpos3' (flare - thick, 0 + alpha);
+ rt x3'l = hround (x1'r
+ + (1/2 + 0.43) * flare * xpart dir (alpha + beta));
+ bot y2'l = vround (y1'r
+ + (1 + 0.43) * flare * ypart dir (alpha + beta));
+
+ rt x4' = x2'r - line * xpart dir (alpha);
+ y4' = y2'r - line * ypart dir (alpha);
+
+ penlabels (1', 2', 3', 4');
+
+ save t, p;
+ t = 0.833;
+ path p;
+
+ p := z1'r{dir (alpha)}
+ .. z3'r{dir (180 + alpha - beta)}
+ .. z2'l{dir (alpha + 180)}
+ .. z3'l{dir (180 + alpha + beta)}
+ ..tension t.. z4'{dir (180 + alpha + beta)}
+ .. z1'l{dir (alpha + 180)};
+
+ if direction <> 1:
+ p := reverse p;
+ fi;
+
+p
+endgroup
+enddef;
+
+
+def brush (expr a, w, b, v) =
+begingroup;
+ draw_brush (a, w, b, v);
+ penlabels (3, 4, 5, 6);
+endgroup;
+enddef;
+
+
+%
+% Draw a (rest) crook, starting at thickness STEM in point A,
+% ending a ball W to the left, diameter BALLDIAM.
+% ypart of the center of the ball is BALLDIAM/4 lower than ypart A.
+%
+
+def balled_crook (expr a, w, balldiam, stem) =
+begingroup;
+ save x, y;
+
+ penpos1 (balldiam / 2, -90);
+ penpos2 (balldiam / 2, 0);
+ penpos3 (balldiam / 2, 90);
+ penpos4 (balldiam / 2, 180);
+
+ x4r = xpart a - w;
+ y3r = ypart a + balldiam / 4;
+ x1l = x2l = x3l = x4l;
+ y1l = y2l = y3l = y4l;
+
+ penpos5 (stem, 250);
+ x5 = x4r + 9/8 balldiam;
+ y5r = y1r;
+
+ penpos6 (stem, 260);
+ x6l = xpart a;
+ y6l = ypart a;
+
+ penstroke z1e
+ .. z2e
+ .. z3e
+ .. z4e
+ .. z1e
+ .. z5e{right}
+ .. z6e;
+
+ penlabels (1, 2, 3, 4, 5, 6);
+endgroup;
+enddef;
+
+
+def y_mirror_char =
+ currentpicture := currentpicture yscaled -1;
+
+ set_char_box (charbp, charwd, charht, chardp);
+enddef;
+
+
+def xy_mirror_char =
+ currentpicture := currentpicture scaled -1;
+
+ set_char_box (charwd, charbp, charht, chardp);
+enddef;
+
+
+%
+% center_factor: typically .5; the larger, the larger the radius of the bulb
+% radius factor: how much the bulb curves inward
+%
+
+def draw_bulb (expr turndir, zl, zr, bulb_rad, radius_factor)=
+begingroup;
+ save rad, ang, pat;
+ path pat;
+
+ clearxy;
+
+ ang = angle (zr - zl);
+
+ % don't get near infinity
+ % z0 = zr + bulb_rad * (zl - zr) / length (zr - zl);
+ z0' = zr + bulb_rad / length (zr - zl) * (zl - zr);
+
+ rad = bulb_rad;
+
+ z1' = z0' + radius_factor * rad * dir (ang + turndir * 100);
+ z2' = z0' + rad * dir (ang + turndir * 300);
+
+ labels (0', 1', 2');
+
+ pat = zr{dir (ang + turndir * 90)}
+ .. z1'
+ .. z2'
+ .. cycle;
+
+ % avoid grazing outlines
+ fill subpath (0, 2.5) of pat
+ -- cycle;
+endgroup
+enddef;
+
+
+pi := 3.14159;
+
+
+%
+% To get symmetry at low resolutions we need to shift some points and
+% paths, but not if mf2pt1 is used.
+%
+
+if known miterlimit:
+ vardef hfloor primary x = x enddef;
+ vardef vfloor primary y = y enddef;
+ vardef hceiling primary x = x enddef;
+ vardef vceiling primary y = y enddef;
+else:
+ vardef hfloor primary x = floor x enddef;
+ vardef vfloor primary y = (floor y.o_)_o_ enddef;
+ vardef hceiling primary x = ceiling x enddef;
+ vardef vceiling primary y = (ceiling y.o_)_o_ enddef;
+fi;
diff --git a/muse2/share/scoreglyphs/feta-original/feta-nummer-code.mf b/muse2/share/scoreglyphs/feta-original/feta-nummer-code.mf
new file mode 100644
index 00000000..ab8fe9f0
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-nummer-code.mf
@@ -0,0 +1,899 @@
+% feta-nummer-code.mf -- implement bold Orator numerals
+%
+% part of LilyPond's pretty-but-neat music font
+%
+% source file of the Feta (not the Font-En-Tja) music font
+%
+% (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+
+
+height# := number_design_size;
+space# := number_design_size / 2;
+
+font_x_height height#;
+font_normal_space space#;
+
+
+%
+% DOCME!
+%
+% ugh. b and h are reused.
+%
+
+save b, h;
+4 h + b = 1.15;
+10 h + b = 1;
+fatten := number_design_size * h + b;
+
+save b, h;
+4 h + b = 1.05;
+10 h + b = 1;
+widen := number_design_size * h + b;
+
+tense = 0.85;
+thick# := 7/30 height# * fatten;
+thin# := thick# / 4 * fatten + max (.1 (height# / 10 - 1), 0);
+
+%% sqrt (.8 * blot_diameter# * thin#);
+hair# := thin# * .8;
+
+flare# := 9/8 thick# + .75 (height# / 10 - 1);
+
+save b, h;
+4h + b = 1/8;
+10h + b = 1/6;
+kuulleke# := thick# * number_design_size * h + b;
+foot_top# := thick#;
+foot_width# := 9/4 thick#;
+
+
+%
+% These numbers were taken from a part that that the EJE violas played
+% 1997 -- Probably Mendelssohn's ouverture `Heimkehr aus der Fremde'.
+%
+
+
+%
+% TODO all the invocation of flare_path are weird --
+% the horizontal tangents should be more at the center of the
+% glyph.
+%
+
+define_pixels (height, thick, thick, thin, hair, flare);
+define_pixels (foot_top, foot_width);
+define_pixels (kuulleke);
+
+
+%
+% Yet Another Bulb Routine with smooth inside curve.
+%
+% alpha = start direction.
+% beta = which side to turn to
+% flare = diameter of the bulb
+% line = diameter of line attachment
+% direction = is ink on left or right side (1 or -1)
+%
+%
+% move_away_to = amount left (for 2)
+% turn_to = amount down (for 2)
+%
+
+def number_flare_path (expr pos, alpha, beta, line, flare,
+ move_away_to, turn_to, taille, taille_ratio,
+ direction) =
+begingroup;
+ save res;
+ path res;
+
+ clearxy;
+
+% z5 = z2 + 0.43 * flare * dir (alpha - 1.5 beta);
+
+ z4 = (0.75 - taille) [z2r, z2l] + whatever * dir (alpha - beta);
+ z4 = (taille_ratio * taille) [z3l, z3r] + whatever * dir (alpha);
+
+ z1r = pos;
+ z2r = z1r + move_away_to * dir (alpha)
+ + (line + turn_to) * dir (alpha + beta);
+ z3r = 0.5 [z2l, z2r] + 0.5 * flare * dir (alpha + beta);
+
+ penpos1 (line, 180 + beta + alpha);
+ penpos2 (flare, alpha);
+ penpos3 (flare, alpha + beta);
+
+ penlabels (1, 2, 3, 4, 5);
+
+ res := z1r{dir (alpha)}
+ .. z2r{dir (180 + alpha - beta)}
+ .. z3r{dir (alpha + 180)}
+ .. z2l{dir (alpha - beta)}
+
+%%% Two versions of the curve: one with z4, the other with z5.
+% .. z5{dir (alpha - beta / 2)}
+
+ .. z4{dir (180 + alpha + beta)}
+ .. z1l{dir (alpha + 180)};
+
+% pickup pencircle;
+% draw res;
+
+ if direction <> 1:
+ res := reverse res;
+ fi;
+
+res
+endgroup
+enddef;
+
+
+def calc_kuulleke (expr w, alpha) =
+begingroup;
+ save beta, gamma;
+
+ beta = (alpha - 90) / 2;
+ gamma = (90 + alpha) / 2;
+
+ penpos1 (w / cosd (alpha), alpha);
+ penpos2 (hair, 90 + beta);
+ penpos3 (hair, gamma - 90);
+
+ z2 = z1l + (1/2 hair / tand ((alpha + 90) / 2)) * dir (beta);
+ z3 = z1r - (1/2 hair / tand ((90 - alpha) / 2)) * dir (gamma);
+ z4 = z1 + kuulleke * dir (alpha - 90);
+endgroup;
+enddef;
+
+
+% should make generic macro?
+%
+def draw_foot (expr xpos) =
+begingroup;
+ clearxy;
+
+ penpos1 (thick, 0);
+ penpos2 (foot_width, 0);
+ penpos3 (hair, -90);
+ penpos4 (hair, 90);
+
+ z1= (xpos, foot_top);
+ z2= (x1, 0);
+ z3r = z2r;
+ z4l = z2l;
+ z5 = (x1, kuulleke);
+
+ penlabels (1, 2, 3, 4);
+
+ fill z1
+ .. {right}z1r{down}
+ .. {right}z3l
+ .. z3r{left}
+ .. z5
+ .. {left}z4l
+ .. z4r{right}
+ .. {up}z1l{right}
+ .. z1
+ .. cycle;
+endgroup;
+enddef;
+
+
+def draw_six =
+ save outer_t, t;
+ save before, after, u, v;
+ path before, after;
+
+ set_char_box (0, .68 height# * widen, 0, height#);
+
+ message "w:" & decimal w;
+ message "h:" & decimal h;
+
+ penpos2 (hair, 90);
+ z2 = (w / 2, h / 2 + thin - hair / 2);
+
+ penpos3 (15/16 thick, 0);
+ x3r = w;
+ y3r = .5 [y4r, y2r];
+
+ penpos4 (hair, -90);
+ z4r = (x2, 0);
+
+ penpos6 (hair, 90);
+ x6r = .56 w;
+ y6r = h;
+
+ penpos7 (thick, 180);
+ x7r = 0;
+ y7r = .50 h;
+
+ penpos10 (thick, 180);
+ z10r = (0, y3);
+
+ penlabels (range 1 thru 10);
+
+ outer_t = 0.88;
+ t := tense;
+
+ before := z7{right}
+ .. z2r{right};
+ after := z7r{up}
+ .. number_flare_path (z6r, 0, -90, hair, flare,
+ w - x6r - hair / 2, .16 h,
+ 0.05, 2.5, 1)
+ .. z7l{down};
+ (u, v) = before intersectiontimes after;
+
+% draw
+ fill subpath (u, infinity) of before
+ ..tension outer_t.. z3r{down}
+ ..tension outer_t.. z4r{left}
+ .. subpath (0, v) of after
+ .. cycle;
+
+ unfill z2l{right}
+ ..tension t.. z3l{down}
+ ..tension t.. z4l{left}
+ ..tension t.. z10l{up}
+ ..tension t.. cycle;
+enddef;
+
+
+save dot_diam;
+dot_diam# = 7/8 flare#;
+define_pixels (dot_diam);
+
+
+code := 42; % , 43
+
+fet_beginchar ("Plus", "plus");
+ set_char_box (0, .5 height#, -0.25 height#, 0.75 height#);
+
+ save hthick, vthick, size, outer_hsize, outer_vsize;
+
+ hthick# = vthick# = 2 linethickness#;
+ size# = 1.1 staff_space#;
+ define_whole_blacker_pixels (vthick);
+ define_whole_vertical_blacker_pixels (hthick);
+
+ outer_hsize = hround ((b + w - vthick) / 2);
+ outer_vsize = vround ((h + d - hthick) / 2);
+
+ centerx := hround (w / 2);
+ centery := vround ((h - d) / 2);
+
+ z1 = (centerx - hthick / 2, -d);
+ z2 = (centerx + hthick / 2, h);
+
+ labels (1, 2);
+
+ draw_rounded_block (z1, z2, hthick);
+ draw_rounded_block ((0, centery - vthick / 2),
+ (w, (centery + vthick / 2)),
+ vthick);
+fet_endchar;
+
+
+code := 43; % , = 44
+
+fet_beginchar ("Numeral comma", "comma");
+ save pat, pos;
+ path pat;
+
+ set_char_box (0, dot_diam#, 3/2 dot_diam#, dot_diam#);
+
+ pat := (dot_diam / 2, 0)
+ .. (dot_diam, dot_diam / 2)
+ .. (dot_diam / 2, dot_diam)
+ .. (0, dot_diam / 2)
+ .. cycle;
+
+ pos = ypart (((w / 3, 0) -- (w / 3, dot_diam / 2))
+ intersectiontimes pat);
+ z0 = point pos of pat;
+
+ alpha = 65;
+ penpos1 (thin, alpha + 90);
+
+ z1l = (w / 2, -1.5 h + hair);
+ z2 = (w, h / 2);
+
+ pickup feta_fillpen;
+
+ % include z0 to assist removal of overlaps
+ fill subpath (0,3) of pat
+ .. z0
+ .. cycle;
+ filldraw z1l{dir (alpha)}
+ .. {up}z2
+ -- z0{direction pos of pat}
+ ..tension 0.95.. {dir (180 + alpha)}z1r
+ .. cycle;
+
+ labels (0, 2);
+ penlabels (1);
+fet_endchar;
+
+
+fet_beginchar ("Numeral dash", "hyphen");
+ set_char_box (0, height# / 3, 0, height#);
+
+ draw_rounded_block ((-b, h / 3 - thin / 2),
+ (w, h / 3 + thin / 2), thin);
+fet_endchar;
+
+
+fet_beginchar ("Numeral dot", "period");
+ set_char_box (0, dot_diam#, 0, dot_diam#);
+
+ pickup pencircle scaled dot_diam;
+
+ drawdot (dot_diam / 2, dot_diam / 2);
+fet_endchar;
+
+
+% skip slash
+
+code := 47; % 0 = 48
+
+fet_beginchar ("Numeral 0", "zero");
+ set_char_box (0, 11/15 height# * widen, 0, height#);
+
+ message "w:" & decimal w;
+ message "h:" & decimal h;
+
+ penpos1 (thin, 90);
+ penpos2 (thick, 180);
+ penpos3 (thin,- 90);
+ penpos4 (thick, 0);
+
+ z1r = (w / 2, h);
+ z2r = (0, h / 2);
+ z3r = (w / 2, 0);
+ z4r = (w, h / 2);
+
+ fill z1r
+ .. z2r
+ .. z3r
+ .. z4r
+ .. cycle;
+
+ save t;
+ t = 1 / tense;
+
+ penlabels (1, 2, 3, 4);
+
+ unfill z1l
+ ..tension t.. z2l
+ ..tension t.. z3l
+ ..tension t.. z4l
+ ..tension t.. cycle;
+fet_endchar;
+
+
+fet_beginchar ("Numeral 1", "one");
+ save alpha, beta, gamma;
+
+% set_char_box (0, 19/30 height# * widen, 0, height#);
+ set_char_box (0, 1/2 foot_width# + 3/2 thick# + 1/2 hair#,
+ 0, height#);
+
+ message "w:" & decimal w;
+ message "h:" & decimal h;
+
+ alpha = 0;
+ calc_kuulleke (thick, alpha);
+ z1 = (3/2 thick, height);
+
+ penpos5 (thick, 0);
+ z5 = (x1, foot_top);
+
+ z6 = (0, h / 2);
+ beta = angle (z1l - z6);
+
+ penpos7 (thin, beta - 90);
+ z7l = z6;
+
+ penpos8 (thin / cosd (beta), -90);
+ z8l = z1l;
+
+ penpos9 (thin, beta - 90);
+ z9r = z8r + (thin / cosd (beta)) * down;
+
+ penlabels (range 1 thru 9);
+
+ gamma = angle (length (z1r - z1), 2 kuulleke);
+
+ fill z2r{dir (alpha - gamma)}
+ .. z4
+ .. {dir (alpha + gamma)}z3l
+ .. z3r{down}
+ -- z5r
+ -- z5l
+ -- z2l{up}
+ .. cycle;
+
+ fill z7l
+ -- z1l{dir (beta)}
+ .. {dir (alpha - gamma)}z2r
+ -- z9r{up}
+ .. {dir (180 + beta)}z9l
+ -- z7r{dir (180 + beta)}
+ .. {dir (beta)}cycle;
+
+ draw_foot (x1);
+fet_endchar;
+
+
+fet_beginchar ("Numeral 2", "two");
+ save tolerance;
+ save alpha, beta, gamma, theta;
+ save flare_start_distance;
+ save t, pat, bow;
+ path pat, bow;
+
+ set_char_box (0, 22/30 height# * widen, 0, height#);
+
+ message "w:" & decimal w;
+ message "h:" & decimal h;
+
+ alpha = -45 * widen;
+ beta = 85;
+ gamma = beta - 10;
+ theta = 20 / widen;
+
+ flare_start = 0.25;
+
+ penpos1 (hair, 90 + beta);
+ z1 = (0, 0) + (1/2 sqrt (2) * hair) * dir (45);
+
+ penpos3 (hair,90 + gamma);
+ z3 = (w, thick) + (1/2 sqrt (2) * hair) * dir (-135);
+
+ penpos2 (thick, 90 + alpha - 15);
+ x2 - x1 = x3 - x2;
+ y2 = 10/16 thick / widen;
+
+ tolerance := epsilon;
+
+ % Find proper tension to exactly touch the x axis.
+ % Later on we directly use `bow'.
+ vardef f (expr t) =
+ bow := z3l{dir (180 + gamma)}
+ ..tension t.. {dir (180 + alpha -5)}z2l;
+ ypart (directionpoint left of bow) < 0
+ enddef;
+
+ % the return value of `solve' is stored in a dummy variable
+ t = solve f (0.8, 1.2);
+
+ fill z1r{dir (beta)}
+ ..tension 0.9.. {dir (alpha + 10)}z2r
+ .. {dir (gamma)}z3r
+ .. bow
+ .. {dir (180 + beta)}z1l
+ .. cycle;
+
+ penpos4 (thick, 0);
+ z4r = (w - thin / 2, .71 h);
+
+ penpos5 (hair, 90);
+ y5r = h;
+ x5r = 9/20 w;
+
+ penlabels (range 1 thru 6);
+
+ t := tense;
+
+ pat := z1l{dir (beta)}
+ ..tension t.. z4r{up}
+ .. number_flare_path (z5r, 180, 90, hair, 1.05 flare,
+ x5r - 1/2 hair, .21 h, 0.006, 0.4, 1)
+ .. z4l{down}
+ ..tension t.. {dir (180 + beta)}z1r
+ -- cycle;
+
+% pickup pencircle scaled 1;
+% draw pat;
+
+ fill pat;
+fet_endchar;
+
+
+%%
+% TODO: should widen a bit. The right edge of the 3 bumps into next glyph in
+% combinations
+%
+fet_beginchar ("Numeral 3", "three");
+ set_char_box (0, 2/3 height# * widen, 0, height#);
+
+ message "w:" & decimal w;
+ message "h:" & decimal h;
+
+ penpos1 (hair, -90);
+
+% flare_start = 0.25;
+
+ x1l = 36/80 w;
+ y1l = h;
+
+% z1l = (17/16 thick, h);
+
+ penpos2 (7/8 thick, 180);
+ x2l = w - thick / 8;
+ y2l = 3/4 h + thick * 3/32;
+
+ penpos3 (thin, 90);
+ z3 = (w / 2, h / 2 + 1/8 thick);
+
+ penpos4 (thin, 90);
+ z4 = (5/8 thick + 1/2 thin, y3);
+
+ penpos5 (thick, 0);
+ x5r = w;
+ y5r = 17/64 h + thick / 16;
+
+ penpos6 (hair, -90);
+ x6r = 37/80 w;
+ y6r = 0;
+
+ penpos7 (3/2 thin, 90);
+ x7 = .83 w;
+ y7 = y3;
+
+ penlabels (range 1 thru 7);
+
+ save alpha, t, outer_t;
+ alpha = 25;
+ t = tense;
+ outer_t := 0.93;
+
+% pickup pencircle scaled 1;
+% draw
+ fill number_flare_path (z1l, 180, 90, hair, 7/8 flare, x1l - .5 hair,
+ .16 h, 0.06, 1.5, -1)
+ ..tension outer_t.. z2l{down}
+ ..tension outer_t.. z7r{dir (180 + alpha)}
+ .. z7l{dir (-alpha)}
+ ..tension outer_t.. z5r{down}
+ ..tension outer_t.. number_flare_path (z6r, 180, -90, hair,
+ flare, x6l, .18 h, 0.06,
+ 1.5, 1)
+ .. z5l{up}
+ ..tension t.. z3l{left}
+ .. z4l{left}
+ .. z4r{right}
+ .. z3r{right}
+ ..tension t.. z2r{up}
+ ..tension t.. cycle;
+fet_endchar;
+
+
+fet_beginchar ("Numeral 4", "four");
+ save alpha, beta, gamma;
+
+ set_char_box (0, 4/5 height# * widen, 0, height#);
+
+ message "w:" & decimal w;
+ message "h:" & decimal h;
+
+ alpha = 0;
+ calc_kuulleke (3/2 thick, alpha);
+
+ z1r = (w - 3/4 thick, height);
+ z5 = (thin, 1/4 height + thin);
+
+ beta = angle (z3r - z5);
+
+ penpos6 (thin, -90);
+ z6l = z5;
+
+ penpos7 (thin, -90);
+ y7 = y6;
+ x7 = w - 1/2 thin;
+
+ penpos8 (thin, -alpha);
+ z8r = z5;
+
+ penlabels (range 1 thru 8);
+
+ gamma = angle (length (z1r - z1), 2 kuulleke);
+
+ fill z2r{dir (alpha - gamma)}
+ .. z4
+ .. {dir (alpha + gamma)}z3l
+ .. {dir (180 + beta)}z3r
+ -- z8r
+ -- z7l{right}
+ .. {left}z7r
+ -- z6r{left}
+ ..tension 0.8 and 2.. z8l{dir (beta)}
+ .. {up}z2l
+ .. cycle;
+
+ clearxy;
+
+ alpha := beta;
+ calc_kuulleke (thick, alpha);
+
+ z1r = (w - 3/4 thick, height - (3/2 thin) / cosd (alpha));
+
+ penpos5 (thick, 0);
+ z5 = (x1, foot_top);
+
+ gamma := angle (length (z1r - z1), 2 kuulleke);
+
+ fill z2r{dir (alpha - gamma)}
+ .. z4
+ .. {dir (alpha + gamma)}z3l
+ .. {down}z3r
+ -- z5r
+ -- z5l
+ -- z2l{up}
+ .. cycle;
+
+ penlabels (1, 2, 3, 4, 5);
+
+ draw_foot (x5);
+fet_endchar;
+
+
+fet_beginchar ("Numeral 5", "five");
+ save alpha, beta, gamma, delta;
+ save inner_t, outer_t;
+ save pat;
+ path pat;
+
+ set_char_box (0, 27/40 height# * widen, 0, height#);
+
+ message "w:" & decimal w;
+ message "h:" & decimal h;
+
+ alpha = 0;
+ calc_kuulleke (w - thin, alpha);
+
+ z1 = (w / 2 + 1/8 thick, h);
+
+ penpos5 (thin, 0);
+ z5l = (x1l, h - 15/16 thick);
+
+ penpos6 (hair, 90 - 45);
+ z6 = z5r + 1/2 hair * dir (-45);
+
+ penpos7 (thin, 0);
+ z7l = (x1l, h / 2 + thin - hair);
+
+ penlabels (range 1 thru 7);
+
+ gamma = angle (length (z1r - z1), 2 kuulleke);
+
+ pat := z2r{dir (alpha - gamma)}
+ .. z4
+ .. {dir (alpha + gamma)}z3l
+ .. z3r{dir (-135)}
+ .. {left}z6r
+ .. {down}z6l
+ -- z7r{down}
+ .. {up}z7l
+ -- z2l{up}
+ .. cycle;
+
+ beta = 45;
+ delta = 180 + beta + 10;
+ z8r = (x7r, y7r - 1/16 thick + thin);
+ z8l = directionpoint dir (delta) of
+ subpath (6, 7) of pat;
+
+ % include intersection point to improve overlap removal
+ fill subpath (0, 6) of pat
+ .. z8l
+ .. subpath (7, length (pat)) of pat
+ .. cycle;
+
+ penpos9 (thin, 90);
+ y9 = 10/16 [y5, y7];
+ x9 = .36 [x8r, x10r];
+
+ penpos10 (thick, 0);
+ x10r = w + hair / 2;
+ y10r = 1/2 [y9r, y11r];
+
+ penpos11 (hair, -90);
+ y11r = 0;
+ x11r = .7 [0, x10l];
+
+ penlabels (range 8 thru 12);
+
+ inner_t = 1.0;
+ outer_t = .85;
+
+ fill z8r {dir (beta)}
+ .. z9r{right}
+ ..tension outer_t.. z10r{down}
+ .. number_flare_path (z11r, 180, -90, hair, flare, x11l,
+ .18 h, 0.06, 1.5, 1)
+ .. z11l{right}
+ ..tension inner_t.. z10l{up}
+ ..tension inner_t.. z9l{left}
+ .. z8l{dir (delta)}
+ -- cycle;
+fet_endchar;
+
+
+fet_beginchar ("Numeral 6", "six");
+ draw_six;
+fet_endchar;
+
+
+fet_beginchar ("Numeral 7", "seven");
+ save tolerance;
+ save alpha, beta, gamma, delta;
+ save bow;
+ save x_overshoot;
+
+ path bow;
+
+ set_char_box (0, 11/15 height# * widen - thin#, 0, height#);
+ overshoot_x = .75 thin;
+
+ message "w:" & decimal w;
+ message "h:" & decimal h;
+
+ alpha = -180;
+
+ penpos1 (3/2 thick, 180 + alpha);
+ penpos2 (hair, 180 + alpha - 45);
+ penpos3 (hair, 180 + alpha + 45);
+
+ z2 = z1l + (1/4 sqrt (2) * hair) * dir (alpha - 135);
+ z3 = z1r + (1/4 sqrt (2) * hair) * dir (alpha - 45);
+ z4 = z1 + kuulleke * dir (alpha - 90);
+
+ z1l = (thin, 0);
+
+ beta = 55;
+ penpos5 (thin, 90 + beta);
+ z5 = (w, h) + (1/2 sqrt (2) * thin) * dir (-135) + (overshoot_x, 0);
+
+ gamma = angle (length (z1r - z1), 2 kuulleke);
+ delta = 12;
+
+ pickup pencircle;
+
+ fill z3l{dir (alpha - gamma)}
+ .. z4
+ .. {dir (alpha + gamma)}z2r
+ .. z2l{dir (beta + delta)}
+ .. {dir (beta)}z5r
+ .. z5l{dir (180 + beta)}
+ .. {dir (delta - 90)}z3r
+ .. cycle;
+
+ penlabels (1, 2, 3, 4, 5);
+
+ alpha := -45 * widen;
+
+ penpos11 (1/2 thick, 90);
+ z11 = (3/2 thin, h - (thick + thin) / 2);
+
+ penpos13 (thin, 90 + beta);
+ z13 = z5;
+
+ penpos12 (thick, 90 + alpha);
+ x12 = 1/2 [x11, x13] - 1/4 thick;
+ y12 = h - 15/16 thick + thin * widen;
+
+ penpos14 (thin, 0);
+ z14l = (0, h - thin / 2);
+
+ penpos15 (thin, 0);
+ z15l = (0, h / 2 + thin / 2);
+
+ penpos16 (9/8 thick, 90);
+ z16r = (thin, y11r + 2/16 thick);
+
+ tolerance := epsilon;
+
+ % Find proper tension to exactly touch the x axis.
+ % Later on we directly use `bow'.
+ vardef f (expr t) =
+ bow := z11r{dir (beta)}
+ ..tension t.. {dir (alpha)}z12r;
+ ypart (directionpoint right of bow) > h
+ enddef;
+
+ % the return value of `solve' is stored in a dummy variable
+ t = solve f (0.8, 1.2);
+
+ fill bow
+ .. {dir (beta)}z13r
+ -- z13l{dir (180 + beta)}
+ .. {dir (180 + alpha)}z12l
+ .. {dir (180 + beta)}z11l
+ .. {down}z16l
+ -- z15r{down}
+ .. {up}z15l
+ -- z14l{up}
+ .. {down}z14r
+ -- z16r{down}
+ ..tension 1.5.. {dir (beta)}cycle;
+
+ penlabels (range 11 thru 16);
+fet_endchar;
+
+
+fet_beginchar ("Numeral 8", "eight");
+ save alpha, beta;
+
+ set_char_box (0, 11/15 height# * widen, 0, height#);
+
+ message "w:" & decimal w;
+ message "h:" & decimal h;
+
+ alpha = 60;
+ beta = alpha - 15;
+
+ z1 = (w / 2, h / 2 + thick / 8);
+
+ penpos2 (14/8 thin, 0);
+ z2 = (w / 3, h / 2 + thin);
+
+ penpos3 (3/2 thin, 0);
+ z3l = (0, h / 4 + thin / 2);
+
+ penpos4 (hair, 90);
+ z4l = (x1, 0);
+
+ penpos5 (thick, 90 + 90 + alpha);
+ z5 = z1 + w / 4 * dir (alpha - 90);
+
+ penpos6 (thick, 90 + 90 + alpha);
+ z6 = z1 + (w / 4 - thin / 2) * dir (90 + alpha);
+
+ penpos7 (hair, 90);
+ z7r = (x1 + .02 w, h);
+
+ penpos8 (3/2 thin, 0);
+ z8r = (w - thin / 2, 3/4 h + thin / 2);
+
+ penpos9 (13/8 thin, 0);
+ z9 = (2/3 w, h / 2);
+
+ penlabels (range 1 thru 9);
+
+ save t;
+ t = tense;
+
+ fill z2r{dir (180 + beta)}
+ .. z3r{down}
+ .. z4r{right}
+ .. z5r{dir (90 + alpha)}
+ -- z6r{dir (90 + alpha)}
+ ..tension t.. z7r{right}
+ .. z8r{down}
+ .. {dir (180 + beta)}z9r
+ -- z9l{dir (beta)}
+ .. z8l{up}
+ .. z7l{left}
+ .. {dir (alpha - 90)}z6l
+ -- z5l{dir (alpha - 90)}
+ ..tension t.. z4l{left}
+ .. z3l{up}
+ .. {dir (beta)}z2l
+ -- cycle;
+fet_endchar;
+
+
+fet_beginchar ("Numeral 9", "nine");
+ draw_six;
+% xy_mirror_char;
+
+ currentpicture := currentpicture scaled -1;
+ currentpicture := currentpicture shifted (w, h);
+fet_endchar;
+
+
+ligtable "3":
+ "3" kern 0.1 space#,
+ "0" kern 0.1 space#;
+
+ligtable "2":
+ "7" kern 0.15 space#;
diff --git a/muse2/share/scoreglyphs/feta-original/feta-params.mf b/muse2/share/scoreglyphs/feta-original/feta-params.mf
new file mode 100644
index 00000000..96d98628
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-params.mf
@@ -0,0 +1,213 @@
+%
+% feta-params.mf -- global parameters for both feta and parmesan fonts
+%
+% source file of the GNU LilyPond music typesetter
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+stafflines := 5;
+
+%
+% The design size of a staff should really be the
+% staff_space, but we use staffsize for historical reasons.
+%
+
+staff_space# := staffsize# / (stafflines - 1);
+staff_space_rounded# := staff_space#;
+
+
+%
+% Measuring on pocket scores turns out: stafflinethickness is
+% largely independent on staff size, and generally about 0.5 pt.
+%
+% By request of WL, we tune down the blackness a little
+% for increased contrast with beams.
+%
+
+%% !! synchronize with paper.scm
+
+save fixed_line_thickness, variable_line_factor;
+fixed_line_thickness + variable_line_factor * 5 pt# = 0.50 pt#;
+fixed_line_thickness + variable_line_factor * 4.125 pt# = 0.47 pt#;
+
+stafflinethickness# := fixed_line_thickness
+ + variable_line_factor * staff_space#;
+stafflinethickness_rounded# := stafflinethickness#;
+
+%
+% The following tunes the general blackness of the glyphs.
+%
+
+linethickness# := stafflinethickness#; %% 0.5 pt#;
+linethickness_rounded# := linethickness#;
+
+%
+% bigger puff_up_factor, relatively thicker stafflines.
+%
+% 20 pt = puff_up_factor 0
+% 10 pt = puff_up_factor 1
+%
+
+puff_up_factor = (linethickness# - 0.1 staff_space#) / (0.1 staff_space#);
+
+
+stemthickness# := 1.3 stafflinethickness#;
+stemthickness_rounded# := stemthickness#;
+ledgerlinethickness# := 2 stafflinethickness#;
+ledgerlinethickness_rounded# := ledgerlinethickness#;
+
+define_pixels (staff_space, stemthickness, stafflinethickness,
+ ledgerlinethickness, linethickness);
+define_whole_pixels (staff_space_rounded);
+define_whole_blacker_pixels (stemthickness_rounded);
+define_whole_vertical_blacker_pixels (stafflinethickness_rounded,
+ ledgerlinethickness_rounded,
+ linethickness_rounded);
+
+if ledgerlinethickness_rounded > 2 stafflinethickness_rounded:
+ ledgerlinethickness_rounded := 2 stafflinethickness_rounded;
+fi;
+
+%
+% Because of the engraving/stamping process, no traditional
+% characters have sharp edges and corners.
+% The following variable controls the amount of `roundness'.
+%
+% This is not a meta variable: it is related to absolute sizes.
+%
+% FIXME: According to [Wanske], only outside corners should be round
+% I don't think we do this anywhere -- jcn
+%
+
+blot_diameter# = .40 pt#;
+if (blot_diameter# * hppp) < 1:
+ blot_diameter# := 1 / hppp;
+fi
+if (blot_diameter# * vppp) < 1:
+ blot_diameter# := 1 / vppp;
+fi
+
+define_pixels (blot_diameter);
+
+
+%
+% symmetry
+% --------
+%
+% Some glyphs have to be positioned exactly between stafflines (clefs,
+% note heads). This needs some care at lower resolutions.
+%
+% Most glyphs use the staffline thickness and the space between two
+% staff lines as the fundamental parameters. The latter is the distance
+% between the middle of one staff line to the middle of the next. To
+% say it differently, the value `staff_space' is the sum of one staff line
+% thickness and the whitespace between two adjacent staff lines.
+%
+% Normally, feta's vertical origin for glyphs is either the middle
+% between two staff lines or the middle of a staff line. For example, the
+% lower edge of the central staff line is at the vertical position
+% `-<staffline thickness> / 2', and the upper edge at
+% `<staffline thickness> / 2'. Here we need a value rounded to an integer
+% (the feta code uses `stafflinethickness_rounded' for that purpose).
+%
+% If we have an odd number of pixels as the staffline thickness, Metafont
+% rounds `-stafflinethickness_rounded / 2' towards zero and
+% `stafflinethickness_rounded / 2' towards infinity. Example: `round -1.5'
+% yields -1, `round 1.5' yields 2. The whitespace between staff lines is
+% handled similarly. If we assume that stafflinethickness_rounded is odd,
+% we have the following cases:
+%
+% o The glyph is centered between three stafflines or five stafflines
+% (clef, `c' meter). We have this:
+%
+% ___________ a
+% ___________ 1
+% ___________ a
+%
+% whitespace
+%
+% ___________ a
+% ...... ___________ 1 .................. x axis
+% ___________ a
+%
+% whitespace
+%
+% ___________ a
+% ___________ 1
+% ___________ a
+%
+% As can be seen, we get symmetry if we split staff lines into two
+% equal parts `a' and a pixel line with thickness 1. Consequently, we
+% use the following algorithm:
+%
+% . Decrease the height `h' by 1 temporarily.
+%
+% . Compute the path for the upper half of the glyph.
+%
+% . Mirror the path at the x axis.
+%
+% . Shift the upper half one pixel up and connect it with the lower path.
+%
+% . Restore height and decrease `d' by 1.
+%
+% o The glyph is centered between two or four staff lines, and the origin is
+% the middle of the whitespace. Assuming that the the whitespace consists
+% of an odd number of pixels, we have this:
+%
+% -----------
+% b
+% 1
+% b
+% ___________
+% b
+% .................. 1 ................. x axis
+% b
+% ___________
+% b
+% 1
+% b
+% ___________
+%
+% For symmetrical glyphs, this leads to a similar algorithm as above.
+% Glyphs which can't be constructed from an upper and lower part need
+% to be handled differently, namely to shift up the vertical center by
+% half a pixel:
+%
+% ___________
+% b
+%
+% 0.5
+% .................. 0.5 ................ x axis
+%
+% b
+% ___________
+%
+
+feta_eps := 0;
+feta_shift := 0;
+feta_space_shift := 0;
+
+% Use this for paths with a slant of 45 degrees to assure that
+% the middle point of a penpos gets covered.
+pair feta_offset;
+feta_offset := (0, 0);
+
+if known miterlimit:
+ pickup nullpen;
+else:
+ feta_eps := eps;
+
+ if odd stafflinethickness_rounded:
+ feta_shift := 1;
+ fi;
+
+ if odd (staff_space_rounded - stafflinethickness_rounded):
+ feta_space_shift := 1;
+ fi;
+
+ feta_offset := (0.5, 0.5);
+
+ pickup pencircle scaled 1;
+fi;
+
+feta_fillpen := savepen;
diff --git a/muse2/share/scoreglyphs/feta-original/feta-pendaal.mf b/muse2/share/scoreglyphs/feta-original/feta-pendaal.mf
new file mode 100644
index 00000000..fded9ecb
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-pendaal.mf
@@ -0,0 +1,348 @@
+% -*- Fundamental -*- (emacs-20 mf mode mucks
+% feta-pendaal.mf -- piano pedal markings
+%
+% part of LilyPond's pretty-but-neat music font
+%
+% source file of the Feta (not the Font-En-Tja) music font
+%
+% (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+%
+% Voor Cup
+
+% Kerning
+%
+% Pe = -0.034 pedalh == -0.07 staff-space
+% ed = -0.27 pedalh == -0.53 staff-space
+
+
+fet_begingroup ("pedal");
+
+pedalpha = 40;
+pedbeta = 25;
+
+penh# = 0.7 linethickness#;
+penw# = 2 penh# + 0.14 staff_space#;
+define_pixels (penh, penw);
+
+pedalh# = 2 staff_space#;
+pedalbh# = 4/7 pedalh#;
+define_pixels (pedalh, pedalbh);
+
+
+fet_beginchar ("Pedal asterisk", "*");
+ save bulb, p, radius, thin, inner_r;
+ path pat;
+
+ set_char_box (0, 7/9 pedalh#, 0, pedalh#);
+
+ z0 = (1/2 w, h - 1/2 w);
+
+ thin = 0.8 linethickness;
+
+ bulb + 2 radius = w;
+ 0.9 thin + bulb = (radius * pi * 2) / 8;
+
+ pickup pencircle scaled penh;
+
+ penpos1 (bulb, 180);
+ penpos2 (bulb, 0);
+ penpos3 (thin, 0);
+
+ z1 = z0 + (0, radius);
+ z2 = z1;
+
+ inner_r = .45 radius;
+
+ z4l = z0 + inner_r * dir (90 + 360/16);
+ z4r = z0 + inner_r * dir (90 - 360/16);
+
+ z4 = .5 [z4l, z4r];
+ z3 = .75 [z1, z4];
+
+ penlabels (0, 1, 2, 3, 4);
+
+ pat := z3r{up}
+ .. z1l{up}
+ .. z2l{down}
+ .. z3l{down}
+ .. z4l{dir (180 + 360/16)};
+ for i = 1 upto 7:
+ pat := pat
+ .. ((z3r{up}
+ .. z1l{up}
+ .. z2l{down}
+ .. z3l{down}
+ .. z4l{dir (180 + 360/16)})
+ rotatedaround (z0, 360/8 i));
+ endfor;
+
+ pat := pat
+ .. cycle;
+ fill pat;
+
+ pickup pencircle scaled (7/8 inner_r);
+
+ undrawdot z0;
+fet_endchar;
+
+
+%% ugh. rounded corners!
+
+fet_beginchar ("Pedal dash", "M");
+ save dash_thickness;
+
+ dash_thickness# := penw#;
+ define_whole_vertical_blacker_pixels (dash_thickness);
+
+ set_char_box (0, 3 penw#, 0, pedalbh#);
+
+ penpos1 (dash_thickness, 60);
+ penpos2 (dash_thickness, 60);
+
+ z1l = (0, vround (2/3 h - 1/2 penw));
+ z2r = (w, vround (y1l + 1.2 penw));
+
+ penlabels (1, 2, 3);
+
+ penstroke z1e{dir 40}
+ ..tension 1.2.. z2e{dir 40};
+fet_endchar;
+
+
+fet_beginchar ("Pedal dot", ".");
+ set_char_box (0, penw#, 0, penw#);
+
+ pickup pencircle scaled penw;
+
+ drawdot (hround (1/2 penw), vround (1/2 penw));
+fet_endchar;
+
+
+def draw_pedal_P (expr show_labels) =
+begingroup;
+ clearxy;
+
+ penpos1 (hround penh, 0);
+ penpos2 (penw, 55);
+ penpos3 (penw, pedalpha);
+ penpos4 (1.2 penh, -pedalpha);
+ penpos5 (penh, -pedalpha);
+ penpos6 (penh, 180 - pedalpha);
+ penpos7 (penh, 180 - pedalpha);
+ penpos8 (penh, 90);
+ penpos9 (4/3 penw, 50);
+ penpos10 (1.4 penw, 50);
+ penpos11 (penh, 90 + pedalpha);
+
+ z1r = (hround 0.6 w, h);
+ x2l = hround (x1l - penw) + xpart feta_offset;
+ y2 = vround (0.7 h) + ypart feta_offset;
+ x3r = hround (x2l + 2 penw);
+ y3r = 0.4 h;
+ z4l = z5r + 1/4 (z3r - z5r);
+ x5 = 1/4 w;
+ y5r = 0;
+ z6 = z5;
+ z7l = z6r + 1/3 (z8r - z6r);
+ z8r = z5r + 3/5 (z3r - z5r);
+ x9l = x10l - penh;
+ y9l = 1/4 penh;
+ x10l = w - tand (90 - pedalpha) * y11l;
+ y10l = 1/4 penh;
+ x11l = w;
+ y11 = 1/5 h;
+
+ % don't stick out at the top
+ z1' = round (0.9 [z2, z1]) + (xpart feta_offset, 0);
+ penpos1' (penh, 0);
+
+ % shift start point of pen stroke to avoid overlapping contours
+ z8'l = z8l;
+ y8'r = y8r;
+ z8'r = z8l + whatever * (z3r - z8l);
+
+ penpos12 (hround penh, 0);
+ penpos13 (penw, -90 - pedbeta);
+ penpos14 (vround penh, 90);
+ penpos15 (penw, -90 + pedbeta);
+ penpos16 (penh, 180 + pedbeta);
+
+ z12r = (hround (5/9 x1 + 1/2 hround penh), y2);
+ z13l = (1/2 x12r, y15r);
+ z14r = z1r;
+ z15l = (1/2 [x16, w], y2l + 0.5 penw);
+ x16 = 1/4 [x1, w];
+ y16r = y2r;
+
+ % We now do a correction to `center' the stem horizontally. While
+ % this is not the most elegant solution, it is definitely the
+ % easiest...
+
+ save horz_corr;
+ horz_corr = 1/5 [x12, x16] - x2l;
+ x2 := x2 + horz_corr;
+ x2l := x2l + horz_corr;
+ x2r := x2r + horz_corr;
+
+ penstroke z1'e
+ ..tension 2.5.. z2e
+ ..tension 1.5.. z3e
+ ..tension 2.5.. {dir (225)}z4e;
+
+ soft_end_penstroke z8'e{right}
+ ..tension 1.5.. z9e{dir (-pedalpha)}
+ .. z10e
+ ..tension 2.5.. z11e;
+
+ fill z4r{dir (225)}
+ ..tension 1.5.. z5r{left}
+ .. z6r
+ ..tension 1.5.. z7r
+ ..tension 1.5.. z8r{right}
+ -- cycle;
+
+ soft_penstroke z12e{down}
+ ..tension 1.1.. z13e{dir (180 - pedbeta)}
+ ..tension 1.1.. z14e{right}
+ ..tension 1.1.. z15e{dir (180 + pedbeta)}
+ ..tension 1.1.. z16e{dir (90 + pedbeta)};
+
+ if show_labels = 1:
+ penlabels (range 1 thru 16);
+ penlabels (1', 8');
+ fi;
+endgroup;
+enddef;
+
+
+def draw_pedal_d (expr show_labels) =
+begingroup;
+ clearxy;
+
+ penpos1 (vround penh, -10 - 90);
+ penpos2 (hround penw, 190);
+ penpos3 (vround (2 penh), 90);
+ penpos4 (hround (3/4 penw), 0);
+ penpos5 (penh, -70);
+
+ x1r = 0;
+ y1l = h;
+ z2 = (w - 1/2 hround penw, 1/2 pedalbh + penh);
+ z4l = (hround (1/3 w), 1/2 pedalbh);
+ z5l = (2/3 w, pedalbh);
+ z3l = (hround x5l, 0);
+
+ if show_labels = 1:
+ penlabels (1, 2, 3, 4, 5);
+ fi;
+
+ soft_start_penstroke z1e{dir (-10)}
+ ..tension 1.1.. z2e{dir (-90 + 10)}
+ ..tension 1.1.. z3e{left}
+ ..tension 1.1.. z4e{up}
+ ..tension 1.1.. z5e{dir (-70 + 90)};
+endgroup;
+enddef;
+
+
+def draw_pedal_e (expr show_labels) =
+begingroup;
+ clearxy;
+
+ penpos1 (penh, pedalpha - 90);
+ penpos2 (penh, pedalpha - 90);
+ penpos3 (3/5 penw, pedalpha);
+ penpos4 (1.2 penh, 90 + pedalpha);
+ penpos5 (2/3 penw, 180);
+ penpos6 (penw, 180 + pedalpha);
+ penpos7 (2/3 penw, -90 - 20);
+ penpos8 (penh, pedalpha - 90);
+
+ z1l = (0, 1/5 pedalh);
+ % this helps to make the path go through z2 at low resolutions
+ z2 = round (z1 + dir pedalpha * penw) + feta_offset;
+ z3 = (3/5 w, 8/9 h);
+ z4 = (2/9 w, y3);
+ x4r := hround x4r;
+ x5r = 0;
+ y5 = y2;
+ x6 = 3/8 w;
+ y6r = 1/2 penh;
+ z7l = (x6l + penh, y6l);
+ x8r = w;
+ y8 = 1/5 pedalh;
+
+ soft_penstroke z1e
+ -- z2e{z2 - z1}
+ ..tension 1.1.. z3e
+ ..tension 1.05.. z4e
+ ..tension 1.1.. z5e
+ ..tension 1.5.. z6e{dir - pedalpha}
+ ..tension 1.1.. z7e
+ ..tension 2.5.. z8e;
+
+ if show_labels = 1:
+ penlabels (range 1 thru 8);
+ fi;
+endgroup;
+enddef;
+
+
+fet_beginchar ("Pedal P", "P");
+ set_char_box (0, 5/6 pedalh#, 0, pedalh#);
+
+ draw_pedal_P (1);
+fet_endchar;
+
+
+fet_beginchar ("Pedal d", "d");
+ set_char_box (0, 2/3 pedalh#, 0, 7/8 pedalh#);
+
+ draw_pedal_d (1);
+fet_endchar;
+
+
+fet_beginchar ("Pedal e", "e");
+ set_char_box (0, 2/5 pedalh#, 0, pedalbh#);
+
+ draw_pedal_e (1);
+fet_endchar;
+
+
+fet_beginchar ("Pedal Ped", "Ped");
+ P_width# = 5/6 pedalh#;
+ e_width# = 2/5 pedalh#;
+ d_width# = 2/3 pedalh#;
+ define_pixels (P_width, e_width, d_width);
+
+ e_height = pedalbh;
+ d_height = 7/8 pedalh;
+
+ % Pe = -0.034 pedalh == -0.07 staff-space
+ % ed = -0.27 pedalh == -0.53 staff-space
+ Pe_kern# = -0.034 pedalh#;
+ ed_kern# = -0.27 pedalh#;
+ define_pixels (Pe_kern, ed_kern);
+
+ w := hround d_width;
+ h := vround d_height;
+ draw_pedal_d (0);
+ currentpicture := currentpicture
+ shifted (hround (e_width + ed_kern), 0);
+
+ w := hround e_width;
+ h := vround e_height;
+ draw_pedal_e (0);
+ currentpicture := currentpicture
+ shifted (hround (P_width + Pe_kern), 0);
+
+ w := hround P_width;
+ h := vround pedalh;
+ draw_pedal_P (0);
+
+ set_char_box (0, P_width# + Pe_kern# + e_width# + ed_kern# + d_width#,
+ 0, pedalh#);
+fet_endchar;
+
+
+fet_endgroup ("pedal");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-puntje.mf b/muse2/share/scoreglyphs/feta-original/feta-puntje.mf
new file mode 100644
index 00000000..a24e3693
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-puntje.mf
@@ -0,0 +1,26 @@
+%
+% feta-puntje.mf -- a duration dot
+%
+% source file of the GNU LilyPond music typesetter
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+fet_begingroup ("dots");
+
+save dot_diam;
+
+2 dot_diam# = staff_space# - stafflinethickness#;
+define_whole_blacker_pixels (dot_diam);
+
+fet_beginchar ("duration dot", "dot");
+ pickup pencircle scaled dot_diam;
+
+ lft x0 = 0;
+ top y0 = vround (.5 dot_diam);
+
+ drawdot z0;
+
+ set_char_box (0, dot_diam#, .5 dot_diam#, .5 dot_diam#);
+fet_endchar;
+
+fet_endgroup ("dots");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-schrift.mf b/muse2/share/scoreglyphs/feta-original/feta-schrift.mf
new file mode 100644
index 00000000..5bb7c1ab
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-schrift.mf
@@ -0,0 +1,1560 @@
+% -*- 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--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% Jan Nieuwenhuizen <janneke@gnu.org>
+%
+
+
+fet_begingroup ("scripts");
+
+def draw_fermata =
+ save alpha, radius, crook_thinness, crook_fatness, dot_size;
+ save pat;
+ path pat;
+
+ % [Wanske] and some Baerenreiter editions
+ % suggest about 80 degrees instead of a half-circle
+ alpha := 10;
+
+ radius# = 1.25 staff_space#;
+ crook_thinness# = 1.5 linethickness#;
+ crook_fatness# = 0.25 staff_space# + 1.5 linethickness#;
+
+ 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_size# = 8/6 crook_fatness#;
+ define_whole_blacker_pixels (dot_size);
+
+ penpos1 (crook_thinness, 0);
+ penpos2 (crook_fatness, -90);
+ z1 = (-radius, 0);
+ z2 = (0, radius);
+
+ pat := z2l{left}
+ .. z1l{dir (-alpha - 90)}
+ .. {dir (90 - alpha)}z1r
+ .. {right}z2r;
+ pat := pat
+ -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
+ fill pat;
+
+ pickup pencircle scaled dot_size;
+ x4 = 0;
+ bot y4 = vround (-crook_thinness / 2);
+ drawdot z4;
+enddef;
+
+
+fet_beginchar ("fermata up", "ufermata");
+ draw_fermata;
+ penlabels (1, 2, 4);
+fet_endchar;
+
+
+fet_beginchar ("fermata down", "dfermata");
+ draw_fermata;
+ y_mirror_char;
+fet_endchar;
+
+
+def draw_short_fermata =
+ save fat_factor, thinness, dot_size;
+ save left_dist, right_dist, se, ne;
+ pair left_dist, right_dist, se, ne;
+
+ set_char_box (staff_space#, staff_space#, 0, 2.2 staff_space#);
+
+ dot_size# = 0.266 staff_space# + 2.666 linethickness#;
+ define_whole_blacker_pixels (dot_size);
+
+ fat_factor = .11;
+ thinness = 1.5 linethickness;
+
+ 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];
+
+ ne = unitvector (z3 - z5);
+ se = unitvector (z2 - z3);
+
+ left_dist = (ne rotated 90) * 0.5 thinness;
+ right_dist = (se rotated 90) * 0.5 thinness;
+
+ fill bot z5{right}
+ .. (z5 - left_dist){ne}
+ -- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint
+ ((z1 - right_dist) -- (z4 - right_dist)))
+ -- (z1 - right_dist){se}
+ .. bot z1{right}
+ -- bot z2{right}
+ .. (z2 + right_dist){-se}
+ -- (z3 + right_dist){-se}
+ .. top z3
+ .. (z3 + left_dist){-ne}
+ -- (z5 + left_dist){-ne}
+ .. cycle;
+
+ pickup pencircle scaled dot_size;
+
+ x1 - 2 x6 = x2;
+ x6 := vround (x6);
+ bot y6 = -d;
+
+ drawdot z6;
+enddef;
+
+fet_beginchar ("short fermata up", "ushortfermata");
+ draw_short_fermata;
+ labels (1, 2, 3, 4, 5, 6);
+fet_endchar;
+
+
+fet_beginchar ("short fermata down", "dshortfermata");
+ draw_short_fermata;
+ xy_mirror_char;
+fet_endchar;
+
+
+def draw_long_fermata =
+ save stemthick, beamheight, dot_size, wd;
+ save pat;
+ path pat;
+
+ wd# = 2.5 staff_space#;
+ stemthick = hround (1.5 linethickness);
+ beamheight = 0.3 staff_space + linethickness;
+ dot_size# = 0.266 staff_space# + 2.666 * linethickness#;
+ define_pixels (wd);
+ define_whole_blacker_pixels (dot_size);
+
+ set_char_box (wd# / 2, wd# / 2, 0, 3/2 staff_space#);
+
+ pickup pencircle scaled blot_diameter;
+
+ top y1 = h;
+ lft x1 = -b;
+
+ pat := top z1{left}
+ .. {down}lft z1;
+
+ pickup pencircle scaled stemthick;
+
+ x2 = -b + stemthick;
+ y2 = h - beamheight;
+ lft x3 = -b;
+ bot y3 = -d;
+
+ pat := pat
+ -- lft z3
+ .. bot z3
+ .. rt z3
+ -- z2;
+ pat := pat
+ -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
+
+ fill pat;
+
+ pickup pencircle scaled dot_size;
+
+ x4 = 0;
+ bot y4 = -d;
+
+ drawdot z4;
+enddef;
+
+
+fet_beginchar ("long fermata up", "ulongfermata");
+ draw_long_fermata;
+ labels (1, 2, 3, 4);
+fet_endchar;
+
+
+fet_beginchar ("long fermata down", "dlongfermata");
+ draw_long_fermata;
+ y_mirror_char;
+fet_endchar;
+
+
+def draw_very_long_fermata =
+ save ibeamheight, obeamheight;
+ save ihwd, ohwd, iht, oht; % inner/outer half_width/height
+ save stemthick, dot_size;
+ save opat, ipat;
+ path opat, ipat;
+
+ ihwd# = 1.0 staff_space#;
+ ohwd# = 1.5 staff_space#;
+ iht# = 0.9 staff_space#;
+ oht# = 1.6 staff_space#;
+ define_pixels (ihwd, ohwd, iht, oht)
+
+ stemthick = hround (1.5 linethickness);
+ ibeamheight# = 0.3 staff_space#;
+ obeamheight# = 0.5 staff_space#;
+ define_pixels (ibeamheight, obeamheight);
+
+ dot_size# = (iht# - ibeamheight#) * 8/10;
+ define_whole_blacker_pixels (dot_size);
+
+ set_char_box (ohwd#, ohwd#, 0, oht#);
+
+ pickup pencircle scaled blot_diameter;
+
+ top y1 = oht;
+ lft x1 = -ohwd;
+ top y11 = iht;
+ lft x11 = -ihwd;
+
+ opat := top z1{left}
+ .. {down}lft z1;
+ ipat := top z11{left}
+ .. {down}lft z11;
+
+ pickup pencircle scaled stemthick;
+
+ x2 = -ohwd + stemthick;
+ y2 = oht - obeamheight;
+ lft x3 = -ohwd;
+ bot y3 = 0;
+ x12 = -ihwd + stemthick;
+ y12 = iht - ibeamheight;
+ lft x13 = -ihwd;
+ bot y13 = 0;
+
+ opat := opat
+ -- lft z3
+ .. bot z3
+ .. rt z3
+ -- z2;
+ opat := opat
+ -- reverse opat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
+ ipat := ipat
+ -- lft z13
+ .. bot z13
+ .. rt z13
+ -- z12;
+ ipat := ipat
+ -- reverse ipat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
+
+ fill opat;
+ fill ipat;
+
+ pickup pencircle scaled dot_size;
+
+ x4 = 0;
+ bot y4 = -d;
+
+ drawdot z4;
+enddef;
+
+
+fet_beginchar ("very long fermata up", "uverylongfermata");
+ draw_very_long_fermata;
+ labels (1, 2, 3, 11, 12, 13, 4);
+fet_endchar;
+
+
+fet_beginchar ("very long fermata down", "dverylongfermata");
+ draw_very_long_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");
+ save thin, height, width, thick, depth;
+ height# = 5/4 width#;
+ height# = staff_space#;
+ depth# = 1.6 (height# / 2);
+
+ set_char_box (width# / 2, width# / 2, depth#, height# / 2);
+
+ define_pixels (height, width);
+
+ thin = .6 linethickness + 0.06 staff_space;
+ 2 thick + 0.5 (height - 2 thin) = width;
+
+ penpos1 (thick, 0);
+ penpos2 (thin, 90);
+ penpos3 (thick, 180);
+ penpos4 (thin, 270);
+ z1r = (w, 0);
+ z2r = (0, h);
+ z3r = (-w, 0);
+ z4r = (0, -h);
+
+ penlabels (1, 2, 3, 4);
+
+ penstroke z1e{up}
+ .. z2e{left}
+ .. z3e{down}
+ .. z4e{right}
+ .. cycle;
+
+ save brush_thick;
+ y5 = -d + brush_thick / 2;
+ brush_thick = 0.9 thick;
+ x5 = 0;
+
+ labels (5);
+
+ draw_brush (z4r, 1.4 thin, z5, brush_thick);
+fet_endchar;
+
+
+%
+% `\accent' is TeX reserved.
+%
+
+def draw_accent (expr bottom_left, top_right, thickness, diminish) =
+ save thinning_start;
+ thinning_start = 0.4;
+ pickup pencircle scaled thickness;
+
+ lft x1 = xpart bottom_left;
+ top y1 = ypart top_right;
+ lft x6 = xpart bottom_left;
+ bot y6 = ypart bottom_left;
+
+ rt z4 = (xpart top_right, (ypart top_right + ypart bottom_left) / 2);
+ x5 = x3 = thinning_start [xpart top_right, xpart bottom_left]
+ - linethickness + 0.1 staff_space;
+ z3 = whatever [z1, z4];
+ z5 = whatever [z6, z4];
+
+ penpos1 (thickness, angle (z3 - z1) + 90);
+ penpos3 (thickness, angle (z3 - z1) + 90);
+ penpos4 (thickness, 90);
+ penpos5 (thickness, angle (z6 - z5) + 90);
+ penpos6 (thickness, angle (z6 - z5) + 90);
+
+ x4 - x7 = diminish * thickness;
+ y7 = y4;
+
+ fill z1l
+ -- z3l
+ -- z7
+ -- z5l
+ -- z6l
+ .. lft z6{down}
+ .. bot z6
+ .. z6r
+ -- z4l
+ ..tension 0.8.. rt z4
+ ..tension 0.8.. z4r
+ -- z1r
+ .. top z1
+ .. lft z1{down}
+ .. cycle;
+enddef;
+
+
+fet_beginchar ("> accent", "sforzato");
+ set_char_box (.9 staff_space#, .9 staff_space#,
+ .5 staff_space#, .5 staff_space#);
+
+ draw_accent ((-w, -d), (w, h),
+ 0.05 staff_space + linethickness, 0.7);
+ penlabels (1, 3, 4, 5, 6);
+ labels (7);
+fet_endchar;
+
+
+fet_beginchar ("espr", "espr");
+ set_char_box (1.9 staff_space#, 1.9 staff_space#,
+ .5 staff_space#, .5 staff_space#);
+
+ draw_accent ((w - 1.78 staff_space, -d), (w, h),
+ 0.05 staff_space + linethickness, 0.6);
+ addto currentpicture also currentpicture xscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("staccato dot", "staccato");
+ save radius;
+ radius# = 0.20 * staff_space#;
+ define_whole_pixels (radius);
+
+ pickup pencircle scaled 2 radius;
+ drawdot (0, 0);
+
+ set_char_box (radius#, radius#, radius#, radius#);
+fet_endchar;
+
+
+def draw_staccatissimo =
+ save radius, height;
+ height# = .8 staff_space#;
+ radius# = linethickness# + .1 staff_space#;
+ define_whole_blacker_pixels (radius);
+ define_pixels (height);
+
+ draw_brush ((0, 0), linethickness, (0, height), 2 radius);
+
+ set_char_box (radius#, radius#,
+ blot_diameter# / 2, height# + radius#);
+enddef;
+
+
+fet_beginchar ("staccatissimo/martellato up", "ustaccatissimo");
+ draw_staccatissimo;
+fet_endchar;
+
+
+fet_beginchar ("staccatissimo/martellato down", "dstaccatissimo");
+ draw_staccatissimo;
+ y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("portato/single tenuto", "tenuto");
+ save thick;
+ thick# = 1.6 linethickness#;
+ define_whole_blacker_pixels (thick);
+
+ set_char_box (.6 staff_space#, .6 staff_space#,
+ thick# / 2, thick# / 2);
+
+ draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
+fet_endchar;
+
+
+def draw_portato =
+ save thick, dot_size;
+ thick# = 1.4 linethickness#;
+ dot_size# = 2.4 linethickness# + 0.08 staff_space#;
+ define_whole_blacker_pixels (thick, dot_size);
+
+ set_char_box (.6 staff_space#, .6 staff_space#,
+ thick# / 2, .5 staff_space# + .5 dot_size#);
+
+ draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
+
+ pickup pencircle scaled dot_size;
+ drawdot (0, h);
+enddef;
+
+
+fet_beginchar ("portato/tenuto with staccato", "uportato");
+ draw_portato;
+fet_endchar;
+
+
+fet_beginchar ("portato/tenuto with staccato", "dportato");
+ draw_portato;
+ y_mirror_char
+fet_endchar;
+
+
+def draw_marcato =
+ save fat_factor, thinness;
+ save left_dist, right_dist, ne, se;
+ pair left_dist, right_dist, ne, se;
+
+ set_char_box (staff_space# / 2, staff_space# / 2,
+ 0, 1.1 staff_space#);
+
+ fat_factor = .3;
+ thinness = linethickness;
+
+ 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];
+
+ ne = unitvector (z3 - z5);
+ se = unitvector (z2 - z3);
+
+ left_dist = (ne rotated 90) * 0.5 thinness;
+ right_dist = (se rotated 90) * 0.5 thinness;
+
+ fill bot z5{right}
+ .. (z5 - left_dist){ne}
+ -- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint
+ ((z1 - right_dist) -- (z4 - right_dist)))
+ -- (z1 - right_dist){se}
+ .. bot z1{right}
+ -- bot z2{right}
+ .. (z2 + right_dist){-se}
+ -- (z3 + right_dist){-se}
+ .. top z3
+ .. (z3 + left_dist){-ne}
+ -- (z5 + left_dist){-ne}
+ .. cycle;
+enddef;
+
+
+fet_beginchar ("marcato up", "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");
+ draw_marcato;
+ xy_mirror_char;
+fet_endchar;
+
+
+%
+% used in french horn music todo
+%
+% TODO: too light at 20pt
+%
+
+fet_beginchar ("open (unstopped)", "open");
+ save thin, height, width, thick;
+
+ height# = 5/4 width#;
+ height# = staff_space#;
+ thin = .6 linethickness + 0.06 staff_space;
+
+ set_char_box (width# / 2, width# / 2, height# / 2, height# / 2);
+
+ define_pixels (width, height);
+
+ 2 thick + 0.6 (height - 2 thin) = width;
+
+ penpos1 (thick, 0);
+ penpos2 (thin, 90);
+ penpos3 (thick, 180);
+ penpos4 (thin, 270);
+ z1r = (w, 0);
+ z2r = (0, h);
+ z3r = (-w, 0);
+ z4r = (0, -h);
+
+ penlabels (1, 2, 3, 4);
+
+ penstroke z1e{up}
+ .. z2e{left}
+ .. z3e{down}
+ .. z4e{right}
+ .. cycle;
+fet_endchar;
+
+
+fet_beginchar ("plus (stopped)", "stopped");
+ save hthick, vthick, size, outer_hsize, outer_vsize;
+
+ hthick# = vthick# = 2 linethickness#;
+ size# = 1.1 staff_space#;
+ define_whole_blacker_pixels (vthick);
+ define_whole_vertical_blacker_pixels (hthick);
+
+ set_char_box (size# / 2, size# / 2, size# / 2, size# / 2);
+
+ outer_hsize = hround ((b + w - vthick) / 2);
+ outer_vsize = vround ((h + d - hthick) / 2);
+ w := b := (2 outer_hsize + vthick) / 2;
+ h := d := (2 outer_vsize + hthick) / 2;
+
+ draw_rounded_block ((-b, -d + outer_vsize),
+ (w, -d + outer_vsize + hthick), hthick);
+ draw_rounded_block ((-b + outer_hsize, -d),
+ (-b + outer_hsize + vthick, h), vthick);
+fet_endchar;
+
+
+fet_beginchar ("Upbow", "upbow");
+ save ht, wd, thick;
+
+ thick = 1.4 linethickness;
+ wd# = 1.3 staff_space#;
+ ht# = 1.6 wd#;
+
+ set_char_box (wd# / 2, wd# / 2, 0, ht#);
+
+ draw_accent ((-h, -w), (0, w), thick, 0.9);
+ currentpicture := currentpicture rotated -90;
+fet_endchar;
+
+
+fet_beginchar ("Downbow", "downbow");
+ save stemthick, beamheight, wd;
+ save pat;
+ path pat;
+
+ wd# = 1.5 staff_space#;
+ define_pixels (wd);
+
+ stemthick = hround (1.2 linethickness);
+
+ set_char_box (wd# / 2, wd# / 2, 0, 4/3 staff_space#);
+
+ beamheight = 4/10 h;
+
+ pickup pencircle scaled blot_diameter;
+
+ top y1 = h;
+ lft x1 = -b;
+
+ pat := top z1{left}
+ .. {down}lft z1;
+
+ pickup pencircle scaled stemthick;
+
+ x2 = -b + stemthick;
+ y2 = h - beamheight;
+ lft x3 = -b;
+ bot y3 = -d;
+
+ pat := pat
+ -- lft z3
+ .. bot z3
+ .. rt z3
+ -- z2;
+ pat := pat
+ -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
+
+ fill pat;
+
+ labels (1, 2, 3);
+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 staff_space#;
+ ht# = 18/17 staff_space#;
+ darkness = 0.3 linethickness + 0.09 staff_space;
+
+ 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 shifted (-feta_eps, -feta_eps)
+ .. 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 shifted (-feta_eps, -feta_eps);
+enddef;
+
+
+fet_beginchar ("Reverse turn", "reverseturn");
+ draw_turn;
+ currentpicture := currentpicture yscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("Turn", "turn");
+ draw_turn;
+ penlabels (1, 2, 3, 4, 5, 6, 7);
+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");
+ save start_nib_angle, ascender_extra, ex, hair_thick, fatness;
+ save slant, t_fatness, r_fatness, kerning, t_overshoot;
+ save uitschieter, bulb_size, krul_ang;
+ save u, v;
+
+ ascender_extra# = 1/2 ex#;
+ ascender# = ascender_extra# + ex#;
+ ex# = 1.4 staff_space#;
+ kerning# = 0.6 ex#;
+ start_nib_angle = 20;
+ bulb_size = 0.8;
+ define_pixels (ex, ascender_extra, ascender, kerning);
+
+ t_overshoot = 0.03 ex;
+ fatness = 12/40 ex;
+ t_fatness = 0.78 fatness;
+ t_width = 1.9 t_fatness;
+ r_fatness = 0.78 fatness;
+ uitschieter = 0.48 ex;
+ hair_thick = linethickness;
+ r_flare = .5 hair_thick + 0.25 r_fatness;
+ r_width = 2 r_fatness + 0.25 kerning;
+ slant = .2;
+
+ local_copy (transform)(currenttransform);
+ currenttransform := currenttransform slanted slant
+ shifted (-staff_space, 0);
+
+ set_char_box (.85 staff_space#, .85 staff_space#, 0, ascender#);
+
+ y1 = ascender;
+
+ % try to position in such a way that the center is the visual
+ % center
+
+ x1l = 0.2 staff_space;
+ x1r - x1l = t_fatness;
+ penpos1 (start_nib_wid, start_nib_angle);
+
+ z2 = (x1, 7/18 ex);
+ penpos2 (start_nib_wid, start_nib_angle);
+
+ z3l = (x2l + 0.5 t_width, - t_overshoot);
+
+ z4l = (x2l + t_width, 0.23 ex);
+ penpos4 (whatever, 180); % 200
+ x4l - x4r = hair_thick;
+
+ x3r = 0.5 [x4r, x2r];
+% 1.7 [x3l, x3r] = x4r;
+ y3r - y3l = 0.6 t_fatness;
+
+ save krul_p;
+ path krul_p;
+
+ krul_ang = 32;
+
+ pickup pencircle scaled hair_thick;
+
+ z5 = (x2l + t_fatness / 2, 2/3 ex);
+ lft x6 = x2l - uitschieter;
+ y6 = y5; % - 1/20 ex;
+ z7 = z5 + whatever * dir krul_ang;
+ up_angle = krul_ang; % = angle (z7-z5)
+ x7 = 5/10 kerning + x5;
+
+ krul_p := z4{up}
+ ..tension 0.98.. z5
+ .. z6
+ .. z5{z7 - z5}
+ -- z7;
+
+ z4' = point 0.85 of krul_p;
+ penpos4' (hair_thick, angle (direction 0.85 of krul_p) + 90);
+
+ % the body of the `t' and the bottom loop
+ fill z1r{dir (angle (z1l - z1r) + 30)}
+ .. z1l{-dir (angle (z1r - z1l) - 45)}
+ -- z2l{down}
+ ..tension (1 + .5 slant).. z3l{right}
+ .. z4l{up}
+ .. z4'l{direction 0.85 of krul_p}
+ -- z4'r{-direction 0.85 of krul_p}
+ .. z4r{down}
+ .. z3r{left}
+ ..tension (1.5 + .7 slant).. z2r{up}
+ -- cycle;
+
+ z5' = point 1.1 of krul_p;
+ penpos5' (hair_thick, angle (direction 1.1 of krul_p) + 90);
+ z5'' = point 1.5 of krul_p;
+ penpos5'' (hair_thick, angle (direction 1.5 of krul_p) + 90);
+ z5''' = point 1.8 of krul_p;
+ penpos5''' (hair_thick, angle (direction 1.8 of krul_p) + 90);
+ z6 = point 2 of krul_p;
+ penpos6 (hair_thick, angle (direction 2 of krul_p) + 90);
+ z6' = point 2.3 of krul_p;
+ penpos6' (hair_thick, angle (direction 2.3 of krul_p) + 90);
+ z6'' = point 2.6 of krul_p;
+ penpos6'' (hair_thick, angle (direction 2.6 of krul_p) + 90);
+ z6''' = point 2.9 of krul_p;
+ penpos6''' (hair_thick, angle (direction 2.9 of krul_p) + 90);
+ penpos7 (hair_thick, up_angle + 90);
+ z7' = point 3.2 of krul_p;
+ penpos7' (hair_thick, angle (direction 3.2 of krul_p) + 90);
+
+ % the left loop
+ penstroke z5'e{direction 1.1 of krul_p}
+ .. z5''e{direction 1.5 of krul_p}
+ .. z5'''e{direction 1.8 of krul_p}
+ .. z6e{direction 2 of krul_p}
+ .. z6'e{direction 2.3 of krul_p}
+ .. z6''e{direction 2.6 of krul_p}
+ .. {direction 2.9 of krul_p}z6'''e;
+
+ y9 = 3/4 ex;
+ x9 = x1 + kerning;
+ penpos9 (r_fatness, 0);
+
+ x10 = x9;
+ y10 = -0.3 linethickness;
+ penpos10 (r_fatness, 0);
+
+ penpos11 (hair_thick, -4);
+ z11r = z9r;
+
+ z13l = (x9l + r_width, y11 - linethickness);
+ penpos13 (r_flare, 180);
+
+ z15 = z13r - (bulb_size * r_fatness, 0);
+ z14 = 0.5 [z13l, z15] - (0, bulb_size * r_fatness);
+
+ save before, after;
+ path before, after;
+ before := z13l{up}
+ .. {down}z11l;
+ after := z9r{up}
+ .. z7r{z7' - z7}
+ -- z7'r;
+ (u, v) = before intersectiontimes after;
+
+ save before_bulb, after_bulb;
+ path before_bulb, after_bulb;
+ before_bulb := z9r{up}
+ ..tension 0.94.. z13r{down};
+ after_bulb := z13l{up}
+ ..tension 1.06.. z15{down};
+ (u_bulb, v_bulb) = before_bulb intersectiontimes after_bulb;
+
+ % the connection between `t' and `r', the body of the `r',
+ % and the bulb
+ fill z7'l
+ -- z7l{z7 - z7'}
+ .. z9l{down}
+ -- simple_serif (z10l, z10r, -30)
+ -- z9r{up}
+ .. subpath (0, u_bulb) of before_bulb
+ .. subpath (v_bulb, infinity) of after_bulb
+ .. z14
+ .. z13l{up}
+ .. subpath (0, u) of before
+ .. subpath (v, infinity) of after
+ -- cycle;
+
+ penlabels (range 1 thru 15);
+ penlabels (4', 5', 5'', 5''', 6', 6'', 6''', 7');
+fet_endchar;
+
+
+def draw_heel =
+ save radius, thickness;
+ save pat;
+ path pat;
+
+ radius# := .5 staff_space#;
+
+ set_char_box (radius#, radius#, radius#, 2/3 staff_space#);
+
+ thickness := hround (1.5 linethickness);
+
+ pickup pencircle scaled thickness;
+
+ rt x1 = b;
+ top y1 = h;
+
+ x2 =x1;
+ y2 = 0;
+
+ x3 = 0;
+ bot y3 = -d;
+
+ pat := top z3{right}
+ .. lft z2{up}
+ -- lft z1
+ .. top z1
+ .. rt z1
+ -- rt z2{down}
+ .. bot z3{left};
+ pat := pat
+ -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
+ fill pat;
+enddef;
+
+
+fet_beginchar ("left heel", "upedalheel");
+ draw_heel;
+ labels (1, 2, 3);
+fet_endchar;
+
+
+fet_beginchar ("right heel", "dpedalheel");
+ draw_heel;
+ y_mirror_char;
+fet_endchar;
+
+
+def draw_toe =
+ save ht, wd, thickness;
+
+ thickness := 1.5 linethickness;
+ ht# := 1.5 staff_space#;
+ wd# := 1/3 ht#;
+ define_pixels (ht, wd);
+
+ set_char_box (wd#, wd#, 0, ht#);
+ draw_accent ((-h, -w), (0, w), thickness, 0.9);
+ currentpicture := currentpicture rotated -90;
+enddef;
+
+
+fet_beginchar ("left toe", "upedaltoe");
+ draw_toe;
+fet_endchar;
+
+
+fet_beginchar ("right toe", "dpedaltoe");
+ draw_toe;
+ y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("Flageolet", "flageolet");
+ save height, width, thickness, superness;
+
+ height# = 4/15 staffsize#;
+ width# = height#;
+ thickness# = blot_diameter#;
+ define_pixels (height, width);
+ define_whole_blacker_pixels (thickness);
+
+ set_char_box (width# / 2, width# / 2, height# / 2, height# / 2);
+
+ penpos1 (thickness, 90);
+ penpos2 (thickness, 180);
+ penpos3 (thickness, 270);
+ penpos4 (thickness, 0);
+
+ x1 = 0;
+ y1r = h;
+ x4r = w;
+ x2r = -x4r;
+ y2 = 0;
+ y4 = y2;
+ x3 = x1;
+ y3r = -y1r;
+
+ penlabels (1, 2, 3, 4);
+
+ % mf doesn't handle pixel dropouts in outline objects, so we use
+ % `draw' if not called by mpost
+ if known miterlimit:
+ penstroke z1e
+ .. z2e
+ .. z3e
+ .. z4e
+ .. cycle;
+ else:
+ pickup pencircle scaled thickness;
+ draw z1
+ .. z2
+ .. z3
+ .. z4
+ .. cycle;
+ fi;
+fet_endchar;
+
+
+%
+% TODO: ARGRGHGH code dup.
+%
+
+fet_beginchar ("Segno", "segno");
+ save thin, thick, ball_diam, darkness, pointheight;
+ save wd, ht, thick_nibangle, ball_nib_thick;
+ save turndir;
+ pair turndir;
+
+ ht# = 3 staff_space#;
+ wd# = 2 staff_space#;
+ darkness = .08 staff_space + 0.4 linethickness;
+
+ 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 linethickness;
+
+ 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);
+
+ save swoosh, ploop;
+ path swoosh, ploop;
+
+ swoosh := z1l{curl 0}
+ .. z2l
+ .. z3l{right}
+ .. {down}z4l
+ -- z4r
+ .. z3r{left}
+ .. z2r{down};
+ fill swoosh
+ .. (swoosh scaled -1)
+ .. cycle;
+
+ 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;
+
+ penpos7 (2 thin, 0);
+ z7l = (-b, -d);
+ penpos8 (2 thin, 0);
+ z8r = (w, h);
+
+ penstroke z7e
+ -- z8e;
+
+ pickup pencircle scaled 2 thin;
+ drawdot (-x2r, pointheight);
+ drawdot (x2r, -pointheight);
+
+ penlabels (range 1 thru 8);
+fet_endchar;
+
+
+fet_beginchar ("Coda", "coda");
+ save stickout, thin, thick, codawidth, codaheight;
+
+ stickout# = 0.35 staff_space#;
+ codawidth# = 2/3 staff_space#;
+ codaheight# = staff_space#;
+ define_pixels (codawidth, codaheight);
+
+ set_char_box (codawidth# + stickout#, codawidth# + stickout#,
+ codaheight# + stickout#, codaheight# + stickout#);
+
+ thin = 1.2 linethickness;
+ 0.1 (codaheight - 2 thin) = (codawidth - 2 thick);
+
+ penpos1 (thick, 0);
+ penpos2 (thin, -90);
+ penpos3 (thick, -180);
+ penpos4 (thin, -270);
+
+ x1l = -codawidth;
+ y2l = codaheight;
+ y1 = 0;
+ x2 = 0;
+ z3 = -z1;
+ z4 = -z2;
+
+ penlabels (1, 2, 3, 4);
+
+ fill z1l{up}
+ .. z2l{right}
+ .. z3l{down}
+ .. z4l{left}
+ .. cycle;
+ unfill z1r{up}
+ .. z2r{right}
+ .. z3r{down}
+ .. z4r{left}
+ .. cycle;
+
+ draw_gridline ((0, -h), (0, h), thin);
+ draw_gridline ((-w, 0), (w, 0), thin);
+fet_endchar;
+
+
+fet_beginchar ("Varied Coda", "varcoda");
+ save thin, thick, codawidth, codaheight;
+ thin# = 1.2 linethickness#;
+ thick# = 1.0 linethickness# + 0.25 staff_space#;
+ codawidth# = 2/3 staff_space#;
+ codaheight# = staff_space#;
+ define_pixels (thin, thick, codawidth, codaheight);
+
+ set_char_box (codawidth# + thick#, codawidth# + thick#,
+ codaheight# + thick#, codaheight# + thick#);
+
+ x1 = -codawidth + thick - .5 blot_diameter;
+ y1 = y2 - thin;
+ x2 = codawidth - thick + .5 blot_diameter;
+ y2 = codaheight;
+ draw_square_block (z1, z2);
+
+ x3 = -codawidth;
+ y3 = -codaheight;
+ x4 = x3 + thick;
+ y4 = y2;
+ draw_block (z3, z4);
+
+ labels (1, 2, 3, 4);
+
+ addto currentpicture also currentpicture scaled -1;
+
+ draw_gridline ((0, -h), (0, h), thin);
+ draw_gridline ((-w, 0), (w, 0), thin);
+fet_endchar;
+
+
+def draw_comma =
+ save alpha, thick, thin, ht;
+
+ alpha := 35;
+ thin# = 1.2 linethickness#;
+ thick# = 3 linethickness#;
+ ht# = .6 staff_space#;
+ define_pixels (thin, thick, ht);
+
+ set_char_box (0, .5 staff_space#, ht#, ht#);
+
+ penpos1 (thick, alpha);
+ penpos2 (thick, alpha + 90);
+ penpos3 (thin, 180 - alpha);
+ penpos4 (thin, 90 - alpha);
+
+ x3r = 0;
+ x1l = x3l;
+ y2r = -y4l = h;
+ z1 = z2;
+ z3 = z4;
+
+ fill z1l{dir (alpha + 90)}
+ .. z2r{dir alpha}
+ .. z1r{dir (alpha - 90)}
+ .. z3l{dir (270 - alpha)}
+ .. z4l{dir (180 - alpha)}
+ .. z3r{dir (90-alpha)}
+ .. cycle;
+enddef;
+
+
+fet_beginchar ("Right Comma", "rcomma");
+ draw_comma;
+ penlabels (1, 2, 3, 4);
+fet_endchar;
+
+
+fet_beginchar ("Left Comma", "lcomma");
+ draw_comma;
+ xy_mirror_char;
+fet_endchar;
+
+
+def draw_varcomma =
+ save thick, thin, ht, wd, alpha;
+
+ alpha := 35;
+ thin# = 1.2 linethickness#;
+ thick# = 3 linethickness#;
+ ht# = .6 staff_space#;
+ wd# = .25 staff_space#;
+ define_pixels (thin, thick, ht, alpha);
+
+ set_char_box (wd#, wd#, ht#, ht#);
+
+ z1 = (-b, -d);
+ z2 = (w, h);
+
+ draw_brush (z1, thin, z2, thick);
+enddef;
+
+
+fet_beginchar ("Right Varied Comma", "rvarcomma");
+ draw_varcomma;
+ labels (1, 2);
+fet_endchar;
+
+
+fet_beginchar ("Left Varied Comma", "lvarcomma");
+ draw_varcomma;
+ xy_mirror_char;
+fet_endchar;
+
+
+thick# := 1/24 designsize;
+define_blacker_pixels (thick);
+
+rthin := 0.075 * staff_space + 0.5 linethickness;
+rthick := 2 thick + rthin;
+
+
+def draw_arpeggio =
+ save alpha;
+ save ne, nw, se, sw;
+ save x, y;
+ pair ne, nw, se, sw;
+
+ alpha := -40;
+
+ nw = dir (alpha + 180);
+ ne = dir (alpha + 90);
+ se = dir alpha;
+ sw = dir (alpha - 90);
+
+ penpos1 (rthin, alpha + 90);
+ penpos2 (5/4 rthick, alpha);
+ penpos3 (3/4 rthick, alpha);
+ penpos4 (5/4 rthick, alpha);
+ penpos5 (rthin, alpha + 90);
+
+ z1 = (width / 2, height) - overshoot * se;
+ z2 = 2 [z4, (width / 2, height / 2)];
+ z3 = 1/2 [z2, z4];
+ x4 = 2/8 staff_space;
+ y4 = rthin;
+
+ z5 = 2 [z1, (width / 2, height / 2)];
+ z6 = z2l + 1/2 rthin * sw;
+ z7 = z4l + 1/2 rthin * sw + 1/2 rthin * se;
+ z8 = 2 [z6, (width / 2, height / 2)];
+ z9 = 2 [z7, (width / 2, height / 2)];
+
+ fill z1l{se}
+ -- z6
+ .. z3l
+ .. z7{se}
+ -- z5l
+ .. z5r{nw}
+ -- z8
+ .. z3r
+ .. z9{nw}
+ -- z1r
+ .. cycle;
+enddef;
+
+
+fet_beginchar ("Arpeggio", "arpeggio");
+ save height, overshoot, width;
+ height# = staff_space#;
+ width# = 0.8 height#;
+ overshoot# = 0.25 staff_space#;
+ define_pixels (height, overshoot, width);
+
+ set_char_box (0, width#, 0, height#);
+ draw_arpeggio;
+ penlabels (range 1 thru 9);
+
+ draw_staff (-2, 2, 0.0);
+fet_endchar;
+
+
+%
+% Extendable Trill symbol.
+% Not yet used
+% Rename me to Trill, rename Trill to Tr?
+%
+
+fet_beginchar ("Trill_element", "trill_element");
+ save height, overshoot;
+ height# = staff_space#;
+ width# = 0.8 height#;
+ overshoot# = 0.25 staff_space#;
+ define_pixels (height, overshoot, width);
+
+ set_char_box (0, height#, 0, width#);
+ draw_arpeggio;
+
+ currentpicture := currentpicture shifted -(width / 2, height / 2);
+ currentpicture := currentpicture rotated 90;
+ currentpicture := currentpicture shifted (height / 2, width / 2);
+fet_endchar;
+
+
+%
+% Arpeggio arrow by Chris Jackson <chris@fluffhouse.org.uk>
+%
+
+def draw_arpeggio_arrow =
+ save thinness, height, width, overshoot;
+ save nw, ne, se, sw;
+ save alpha;
+ save before_left, before_right, after_left, after_right;
+ save u_left, v_left, u_right, v_right;
+ pair nw, ne, se, sw;
+ path before_left, before_right, after_left, after_right;
+
+ height# = staff_space#;
+ width# = 0.8 height#;
+ overshoot# = 0.25 staff_space#;
+ define_pixels (height, overshoot, width);
+
+ set_char_box (0, width#, 0, height#);
+
+ alpha := -40;
+ nw = dir (alpha + 180);
+ ne = dir (alpha + 90);
+ se = dir alpha;
+ sw = dir (alpha - 90);
+
+ penpos1 (rthin, alpha + 90);
+ penpos2 (5/4 rthick, alpha);
+ penpos3 (5/4 rthick, 0);
+
+ z1 = (width / 2, height) - overshoot * se; % numbering is consistent
+ % with the arpeggio symbol
+ z2 = 2 [z4, (width / 2, height / 2)];
+ z3 = (0.5 width, 0.5 height);
+ z4 = (0.25 staff_space, rthin);
+ z6 = z2l + 1/2 rthin * sw;
+ z9 = (width / 2, height) + overshoot * se;
+
+ pickup pencircle scaled vround (0.5 rthin);
+
+ bot z10 = (0.5 w, 0);
+ lft z11 = (0.5 w - hround (0.8 w), 0.8 h);
+ rt z12 = (0.5 w + hround (0.8 w), 0.8 h);
+
+ before_left := z1l
+ -- z6{z6 - z1l}
+ .. {down}z3l;
+ after_left := (z3 + (0, -0.25 rthin / cosd (angle (nw))))
+ -- (z11 + 0.25 rthin * ne);
+ (u_left, v_left) = before_left intersectiontimes after_left;
+
+ before_right := (z12 + 0.25 rthin * nw)
+ -- (z3 + (0, -0.25 rthin / cosd (angle (nw))));
+ after_right := z3r{up}
+ .. z9{z1r - z9}
+ -- z1r;
+ (u_right, v_right) = before_right intersectiontimes after_right;
+
+ fill subpath (0, u_left) of before_left
+ .. subpath (v_left, infinity) of after_left
+ .. top z11
+ .. lft z11
+ .. {dir -50}(z11 + 0.25 rthin * sw)
+ .. (z10 + 0.25 rthin * sw){dir -70}
+ .. bot z10
+ .. {dir 70}(z10 + 0.25 rthin * se)
+ .. (z12 + 0.25 rthin * se){dir 50}
+ .. rt z12
+ .. top z12
+ .. subpath (0, u_right) of before_right
+ .. subpath (v_right, infinity) of after_right
+ .. cycle;
+
+ % mf doesn't handle pixel dropouts in outline objects, so we use
+ % `draw' if not called by mpost
+ if not known miterlimit:
+ pickup pencircle scaled 0.7 rthin;
+ draw z1
+ -- (z9 + 0.5 rthin * dir (alpha - 90));
+ fi;
+enddef;
+
+
+fet_beginchar ("Arpeggio arrow down", "arpeggio.arrow.M1");
+ draw_arpeggio_arrow;
+ penlabels (range 1 thru 12);
+fet_endchar;
+
+
+fet_beginchar ("Arpeggio arrow up", "arpeggio.arrow.1");
+ draw_arpeggio_arrow;
+ currentpicture := currentpicture scaled -1
+ shifted (w - feta_eps, h - feta_eps);
+fet_endchar;
+
+
+% Hmm
+input feta-slag;
+
+
+%
+% Railroad tracks. We define two variants of these -- both as slightly
+% tapered, comma-shaped curves and as two straight parallel slashes.
+%
+
+fet_beginchar ("Curved caesura", "caesura.curved");
+ save slant, space_between, clearance;
+ save alpha, pat;
+ save botthick, topthick;
+ save krom;
+ path pat;
+
+ botthick = 1.5 linethickness;
+ topthick = 2.5 linethickness;
+
+ pickup pencircle scaled botthick;
+
+ slant = 3.5;
+ space_between# = 0.6 staff_space#;
+ clearance# = 0.2 staff_space#;
+ height# = 1.2 staff_space#;
+
+ set_char_box (0, 2.0 staff_space#,
+ staff_space# - clearance#, height#);
+ define_pixels (clearance, height);
+ define_whole_pixels (space_between);
+
+ bot y1 = -d;
+ top y2 = h;
+
+ lft x1 = 0;
+ x2 = (y2 - y1) / slant;
+
+ krom = 10;
+
+ alpha = angle (z2 - z1);
+ penpos1 (botthick, alpha - krom);
+ penpos3 (botthick, alpha - krom + 90);
+
+ penpos2 (topthick, alpha + krom);
+ penpos4 (topthick, alpha + krom + 90);
+
+ z3 = z1;
+ z4 = z2;
+
+ penlabels (1, 2, 3, 4);
+
+ pat := z3r{(z1r - z1l)}
+ .. z4r{z2r-z2l}
+ .. z2r{z4l-z4r}
+ .. z4l{z2l-z2r}
+ .. z3l{z1l-z1r}
+ .. z1l{z3r-z3l}
+ .. cycle;
+ fill pat;
+ fill pat shifted (space_between, 0);
+fet_endchar;
+
+
+fet_beginchar ("Straight caesura", "caesura.straight");
+ save slant, space_between, clearance;
+ save thick, ne, pat;
+ path pat;
+ pair ne;
+
+ slant = 2.0;
+ thick = 2.88 linethickness;
+
+ space_between# = 0.56 staff_space#;
+ clearance# = 0.2 staff_space#;
+
+ set_char_box (0, 2.0 staff_space#,
+ staff_space# - clearance#, 1.2 staff_space#);
+ define_whole_pixels (space_between);
+
+ x1 = 0;
+ x2 = x1 + thick;
+ y1 = y2 = -d;
+
+ x3 = x4 + thick;
+ x4 = x1 + (h + d) / slant;
+ y3 = y4 = h;
+
+ ne = unitvector (z4 - z1);
+
+ z1a = z1 + blot_diameter * ne;
+ z1b = z1 + blot_diameter * right;
+ z2a = z2 + blot_diameter * ne;
+ z2b = z2 + blot_diameter * left;
+
+ z3a = z3 - blot_diameter * ne;
+ z3b = z3 + blot_diameter * left;
+ z4a = z4 - blot_diameter * ne;
+ z4b = z4 + blot_diameter * right;
+
+ pat = z1a{-ne}
+ .. {right}z1b
+ -- z2b{right}
+ .. {ne}z2a
+ -- z3a{ne}
+ .. {left}z3b
+ -- z4b{left}
+ .. {-ne}z4a
+ -- cycle;
+
+ fill pat;
+ fill pat shifted (space_between, 0);
+
+ labels(range 1 thru 4);
+ labels(1a, 1b, 2a, 2b, 3a, 3b, 4a, 4b);
+fet_endchar;
+
+fet_endgroup ("scripts");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-slag.mf b/muse2/share/scoreglyphs/feta-original/feta-slag.mf
new file mode 100644
index 00000000..3b054103
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-slag.mf
@@ -0,0 +1,315 @@
+% -*- Fundamental -*- (emacs-20 mf mode sucks)
+% feta-slag.mf -- implement trill symbols
+%
+% source file of the Feta (definitely not an abbreviation for Font-En-Tja)
+% music font
+%
+% (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+%
+
+% this file is included by feta-scripts.mf
+
+trill_thin# = 0.1 staff_space# + 0.6 stafflinethickness#;
+trill_stemwidth# = trill_thin#;
+define_pixels (trill_thin);
+define_whole_blacker_pixels (trill_stemwidth);
+
+trill_thick = 1/2 staff_space;
+trill_overlap = 1/6 staff_space;
+
+trill_width# = 5/6 staff_space#;
+trill_height# = 1/2 staff_space#;
+define_pixels (trill_height);
+define_whole_pixels (trill_width);
+
+pair trill_ne;
+trill_ne := unitvector ((2, 3));
+
+
+%
+% The trill element sticks out on both the left and right side
+% of the normal bbox, so you can glue them together easily.
+%
+% `ending' is either 0 for none, 1 for left, or 2 for right.
+%
+
+def draw_trillelement (expr offset, ending) =
+ clearxy;
+
+begingroup;
+ save nw, pat, nw_dist, ne_dist;
+ pair nw, nw_dist, ne_dist;
+ path pat;
+
+ pickup pencircle scaled trill_thin;
+
+ x1 = -.5 trill_width;
+ y1 = 0;
+ z3 = whatever * trill_ne + z1;
+ top y3 = vround trill_height;
+ z2 = z3 - (trill_thick - trill_thin) * trill_ne;
+
+ bot z3' = (top z3) scaled -1;
+
+ nw = unitvector (z2 - z3');
+ ne_dist = (nw rotated -90) * 0.5 trill_thin;
+ nw_dist = (trill_ne rotated 90) * 0.5 trill_thin;
+
+ z5 = whatever * trill_ne + (z1 - nw_dist);
+ z5 = whatever * nw + (z3' - ne_dist);
+
+ pat := z5
+ -- (z1 - nw_dist){-trill_ne}
+ -- (z1 + nw_dist){trill_ne}
+ -- (z3 + nw_dist){trill_ne}
+ .. top z3{right}
+ .. (z3 + ne_dist){-nw};
+ pat := pat
+ -- pat scaled -1 shifted (-feta_eps, -feta_eps)
+ -- cycle;
+ pat := pat shifted (offset, 0);
+ fill pat;
+
+ z4 = z1 - trill_ne * trill_overlap;
+ x4 := hround (x4 + 0.5 trill_thin) - 0.5 trill_thin;
+
+ pat := (z4 - nw_dist){-trill_ne}
+ .. bot z4{left}
+ .. lft z4{up}
+ .. (z4 + nw_dist){trill_ne}
+ -- (z1 + nw_dist){trill_ne}
+ -- (z1 - nw_dist){-trill_ne}
+ -- cycle;
+
+ if ending = 1:
+ fill pat shifted (offset, 0);
+ elseif ending = 2:
+ pat := pat scaled -1 shifted (-feta_eps, -feta_eps);
+ fill pat shifted (offset, 0);
+ fi;
+endgroup;
+enddef;
+
+
+fet_beginchar ("trilelement", "trilelement");
+ set_char_box (.5 trill_width#, .5 trill_width#,
+ trill_height#, trill_height#);
+
+ draw_trillelement (0, 0);
+ labels (1, 2, 3, 3', 4, 5, 5');
+fet_endchar;
+
+
+fet_beginchar ("prall", "prall");
+ set_char_box (trill_width#, trill_width#,
+ trill_height#, trill_height#);
+
+ draw_trillelement (-hround (.5 trill_width), 1);
+ draw_trillelement (-hround (.5 trill_width) + trill_width, 2);
+fet_endchar;
+
+
+fet_beginchar ("mordent", "mordent");
+ set_char_box (trill_width#, trill_width#,
+ 4/3 trill_height#, 4/3 trill_height#);
+
+ draw_trillelement (-hround (.5 trill_width), 1);
+ draw_trillelement (-hround (.5 trill_width) + trill_width, 2);
+
+ clearxy;
+
+ pickup pencircle scaled trill_stemwidth;
+
+ top y1 = h;
+ bot y2 = -d;
+ x1 = x2;
+ x2 = 0;
+
+ draw_gridline (z2, z1, trill_stemwidth);
+
+ labels (1, 2);
+fet_endchar;
+
+
+fet_beginchar ("prallprall", "prallprall");
+ set_char_box (1.5 trill_width#, 1.5 trill_width#,
+ trill_height#, trill_height#);
+
+ draw_trillelement (-trill_width, 1);
+ draw_trillelement (0, 0);
+ draw_trillelement (trill_width, 2);
+fet_endchar;
+
+
+fet_beginchar ("prallmordent", "prallmordent");
+ set_char_box (1.5 trill_width#, 1.5 trill_width#,
+ 4/3 trill_height#, 4/3 trill_height#);
+
+ draw_trillelement (-trill_width, 1);
+ draw_trillelement (0, 0);
+ draw_trillelement (trill_width, 2);
+
+ clearxy;
+
+ pickup pencircle scaled trill_stemwidth;
+
+ top y1 = h;
+ bot y2 = -d;
+ x1 = x2 ;
+ x2 = good.x (.5 trill_width);
+
+ draw_gridline (z2, z1, trill_stemwidth);
+
+ labels (1, 2);
+fet_endchar;
+
+
+save remember_pic;
+picture remember_pic;
+
+
+fet_beginchar ("upprall", "upprall");
+ set_char_box (1.5 trill_width#, 1.5 trill_width#,
+ trill_height#, trill_height#);
+
+ draw_trillelement (-trill_width, 1);
+ draw_trillelement (0, 0);
+ draw_trillelement (trill_width, 2);
+
+ z11 = z4 shifted (-trill_width, 0);
+ z12 = z11 + (0, -2 trill_height);
+
+ penpos11 (trill_thin, angle (trill_ne) - 90);
+ penpos12 (trill_thin, angle (trill_ne yscaled -1) + 90);
+ penlabels (11, 12);
+
+ pickup pencircle scaled trill_stemwidth;
+
+ fill z11l{-trill_ne}
+ .. z12l{trill_ne yscaled -1}
+ .. bot z12
+ .. rt z12
+ .. z12r{-trill_ne yscaled -1}
+ .. z11r{trill_ne}
+ -- cycle;
+
+ remember_pic := currentpicture;
+fet_endchar;
+
+
+fet_beginchar ("upmordent", "upmordent");
+ set_char_box (1.5 trill_width#, 1.5 trill_width#,
+ 4/3 trill_height#, 4/3 trill_height#);
+
+ currentpicture := remember_pic;
+
+ clearxy;
+
+ pickup pencircle scaled trill_stemwidth;
+
+ top y1 = h;
+ bot y2 = -d;
+ x1 = x2;
+ x2 = good.x (.5 trill_width);
+
+ draw_gridline (z2, z1, trill_stemwidth);
+
+ labels (1, 2);
+fet_endchar;
+
+
+fet_beginchar ("pralldown", "pralldown");
+ set_char_box (1.5 trill_width#, 1.5 trill_width#,
+ trill_height#, trill_height#);
+
+ currentpicture := remember_pic xscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("downprall", "downprall");
+ set_char_box (1.5 trill_width#, 1.5 trill_width#,
+ trill_height#, trill_height#);
+
+ draw_trillelement (-trill_width, 1);
+ draw_trillelement (0, 0);
+ draw_trillelement (trill_width, 2);
+
+ z11 = z4 shifted (-trill_width, 0);
+ z12 = z11 + (0, 2 trill_height);
+
+ penpos11 (trill_thin, angle (trill_ne xscaled -1) - 90);
+ penpos12 (trill_thin, angle (trill_ne) - 90);
+ penlabels (11, 12);
+
+ pickup pencircle scaled trill_stemwidth;
+
+ fill z11l{trill_ne xscaled -1}
+ .. z12l{trill_ne}
+ .. top z12
+ .. rt z12
+ .. z12r{-trill_ne}
+ .. z11r{-trill_ne xscaled -1}
+ -- cycle;
+
+ remember_pic := currentpicture;
+fet_endchar;
+
+
+fet_beginchar ("downmordent", "downmordent");
+ set_char_box (1.5 trill_width#, 1.5 trill_width#,
+ 4/3 trill_height#, 4/3 trill_height#);
+
+ currentpicture := remember_pic;
+
+ clearxy;
+
+ pickup pencircle scaled trill_stemwidth;
+
+ top y1 = h;
+ bot y2 = -d;
+ x1 = x2;
+ x2 = good.x (.5 trill_width);
+
+ draw_gridline (z2, z1, trill_stemwidth);
+
+ labels (1, 2);
+fet_endchar;
+
+
+fet_beginchar ("prallup", "prallup");
+ set_char_box (1.5 trill_width#, 1.5 trill_width#,
+ trill_height#, trill_height#);
+
+ currentpicture := remember_pic xscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("lineprall", "lineprall");
+ set_char_box (1.5 trill_width#, 1.5 trill_width#,
+ trill_height#, 4 trill_height#);
+
+ draw_trillelement (-trill_width, 1);
+
+ labels (1, 2, 3, 3', 4, 5, 5');
+
+ pickup pencircle scaled trill_stemwidth;
+
+ penpos10 (trill_stemwidth, 0);
+ penpos11 (trill_stemwidth, 0);
+
+ x10l = x4 - .5 trill_thin - trill_width;
+ y10 = y4;
+ z11 = z10 + (0, h);
+
+ penlabels (10, 11);
+
+ fill z11l
+ .. top z11
+ .. z11r
+ -- z10r
+ -- z10l
+ -- cycle;
+
+ draw_trillelement (0, 0);
+ draw_trillelement (trill_width, 2);
+fet_endchar;
diff --git a/muse2/share/scoreglyphs/feta-original/feta-test-generic.mf b/muse2/share/scoreglyphs/feta-original/feta-test-generic.mf
new file mode 100644
index 00000000..1ade03f2
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-test-generic.mf
@@ -0,0 +1,20 @@
+%
+% test stuff.
+% in a separate file to avoid tainting non-test font files for testing.
+%
+
+%input feta-eindelijk;
+input feta-toevallig;
+%input feta-puntje;
+%input feta-bolletjes;
+%input feta-arrow;
+%input feta-schrift;
+%input feta-schrift;
+%input feta-banier;
+% input feta-slag;
+%input feta-klef;
+%input feta-haak;
+% input feta-haak;
+%input feta-timesig;
+%input feta-pendaal;
+%input feta-accordion;
diff --git a/muse2/share/scoreglyphs/feta-original/feta-test11.mf b/muse2/share/scoreglyphs/feta-original/feta-test11.mf
new file mode 100644
index 00000000..ad21720a
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-test11.mf
@@ -0,0 +1,15 @@
+% feta-test11.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 11;
+test := 1;
+
+% smoked cheese
+% test := -1;
+
+input feta-generic;
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-test13.mf b/muse2/share/scoreglyphs/feta-original/feta-test13.mf
new file mode 100644
index 00000000..28abf42c
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-test13.mf
@@ -0,0 +1,16 @@
+% feta-test13.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 13;
+test := 1;
+
+% smoked cheese
+% test := -1;
+
+input feta-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-test16.mf b/muse2/share/scoreglyphs/feta-original/feta-test16.mf
new file mode 100644
index 00000000..eaa280aa
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-test16.mf
@@ -0,0 +1,16 @@
+% feta-test16.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 16;
+test := 1;
+
+% smoked cheese
+% test := -1;
+
+input feta-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-test20.mf b/muse2/share/scoreglyphs/feta-original/feta-test20.mf
new file mode 100644
index 00000000..5a58be3d
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-test20.mf
@@ -0,0 +1,16 @@
+% feta-test20.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 20;
+test := 1;
+
+% smoked cheese
+% test := -1;
+
+input feta-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-test23.mf b/muse2/share/scoreglyphs/feta-original/feta-test23.mf
new file mode 100644
index 00000000..5a25b469
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-test23.mf
@@ -0,0 +1,16 @@
+% feta-test23.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 23;
+test := 1;
+
+% smoked cheese
+% test := -1;
+
+input feta-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta-test26.mf b/muse2/share/scoreglyphs/feta-original/feta-test26.mf
new file mode 100644
index 00000000..e9e15218
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-test26.mf
@@ -0,0 +1,15 @@
+% feta-test26.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 26;
+test := 1;
+
+% smoked cheese
+% test := -1;
+
+input feta-generic;
+
+
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta-timesig.mf b/muse2/share/scoreglyphs/feta-original/feta-timesig.mf
new file mode 100644
index 00000000..ffaa1883
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-timesig.mf
@@ -0,0 +1,108 @@
+%
+% feta-timesig.mf -- implement Time Signatures
+%
+% source file of the Feta (not an abbreviation of Font-En-Tja) music font
+%
+% (c) 1998--2009 Mats Bengtsson <matsb@s3.kth.se>,
+% Christian Mondrup <scancm@biobase.dk>
+
+fet_begingroup ("timesig");
+
+
+%
+% Originally by Mats B. nuked by Han-Wen, inspired by
+% Baerenreiter BA320 (Bach Cello Suites, Suite III).
+%
+% Notes:
+%
+% * The inside curve of the C is rather straight.
+% * The outside curve of the C is rather round.
+% * Right tips of the C point slightly outward.
+% * Lower tip protrudes to the right very slightly.
+%
+
+def draw_C =
+ save hair, bulb_rad, left_fatness;
+ save left_width, right_width;
+ save width, lower_offset;
+
+ width# := 1.8 staff_space# - stafflinethickness#;
+
+ left_width := 1.0 staff_space;
+ right_width := 0.8 staff_space;
+
+ hair := stafflinethickness;
+
+ bulb_rad := 0.40 staff_space - .6 stafflinethickness;
+ left_fatness := 0.55 * staff_space;
+ lower_offset := 0.3 stafflinethickness;
+
+ set_char_box (0, width#, staff_space#, staff_space#);
+
+ d := d - feta_shift;
+
+ x1r = w;
+ x3r = 0;
+ y1r = .45 h;
+ y2r = h + vround (.5 stafflinethickness_rounded);
+ y4r = -d - vround (.5 stafflinethickness_rounded);
+ x2 = x4;
+ x2 = x3r + h;
+ y3r = .5 (h - d);
+
+ x5r = x1r + lower_offset;
+ y5r = -0.37 h;
+
+ penpos1 (hair, 10);
+ penpos2 (stafflinethickness_rounded, 90);
+ penpos3 (left_fatness, 180);
+ penpos4 (stafflinethickness_rounded, -90);
+ penpos5 (hair, -13);
+
+ draw_bulb (-1, z1l, z1r, bulb_rad, .8);
+
+ save s;
+ s := 0.735;
+
+ fill z1l{dir (100)}
+ .. z2l{left}
+ ..tension 0.8.. z3l{down}
+ ..tension 0.8.. z4l{right}
+ .. simple_serif (z5l, z5r, -90)
+ .. z4r{left}
+ .. super_curvelet (z4r, z3r, s, -1)
+ .. z3r{up}
+ .. super_curvelet (z3r, z2r, s, 1)
+ .. z2r{right}
+ .. {dir (-80)}z1r
+ -- cycle;
+
+ penlabels (1, 2, 3, 4, 5);
+
+ draw_staff (-2, 2, 0);
+enddef;
+
+
+fet_beginchar ("4/4 meter", "C44");
+ draw_C;
+fet_endchar;
+
+
+fet_beginchar ("2/2 meter", "C22");
+ save eccentricity, top_stemlen, bottom_stemlen, thick, left_pos;
+
+ draw_C;
+
+ eccentricity = -1.75 stafflinethickness - 0.025 staff_space;
+ top_stemlen# = bottom_stemlen# = 1.4 staff_space#;
+ thick# = stafflinethickness# + 0.05 staff_space#;
+ define_whole_pixels (top_stemlen, bottom_stemlen);
+ define_whole_blacker_pixels (thick);
+
+ bottom_stemlen := bottom_stemlen - feta_shift;
+
+ draw_block ((x2 + eccentricity, -bottom_stemlen),
+ (x2 + eccentricity + thick, top_stemlen));
+fet_endchar;
+
+fet_endgroup ("timesig");
diff --git a/muse2/share/scoreglyphs/feta-original/feta-toevallig.mf b/muse2/share/scoreglyphs/feta-original/feta-toevallig.mf
new file mode 100644
index 00000000..48061fcd
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta-toevallig.mf
@@ -0,0 +1,1308 @@
+%
+% feta-toevallig.mf -- implement Accidentals
+%
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+
+
+%
+% also show in other configuration wrt staff lines.
+%
+def draw_shifted_too =
+if test > 0:
+ fet_beginchar ("shifted too", "");
+ set_char_box (0, 0, 0, 0);
+ currentpicture := remember_pic;
+
+ draw_staff (-2, 2, 0.5);
+ fet_endchar;
+fi;
+enddef;
+
+
+%
+% Accidentals from various sources, notably
+%
+% Baerenreiter edition of Schuberts `Auf dem Strom' (sharp, natural)
+% F Hofmeister edition of Muellers `Etueden fuer Horn' (double sharp, flat)
+%
+
+
+%
+% Naming for accidentals (including microtonal variants):
+%
+% SHARPBASE[.SLASHES.STEMS]
+% FLATBASE[.MODIFIER]
+%
+% Examples:
+%
+% sharp.slashslash.stem
+% mirroredflat.flat
+%
+%
+
+
+fet_begingroup ("accidentals");
+
+%
+% Draw an arrow
+%
+% * `stemslant' gives the direction of the stem's left boundary
+% (needed for brushed stems, equals "up" for straight stems)
+% * `extend' is used to make the stem longer or shorter (if negative);
+% different kinds of accidentals need different values here
+%
+def draw_arrow (expr attach, stemwidth, stemslant, extend, pointingdown) =
+begingroup;
+ save htip; % tip height
+ save wwing; % wing `radius'
+ save angle_wing_bot, angle_wing_top, angle_tip;
+ save upshift;
+ clearxy;
+
+ wwing := 0.26 stemwidth;
+ htip := staff_space * 0.85 + stafflinethickness - wwing;
+
+ % `flip' is used to reflect the arrow vertically
+ % if arrow points downward
+ transform flip;
+ if pointingdown:
+ flip = identity reflectedabout (origin, right);
+ else:
+ flip = identity;
+ fi;
+
+ z1 = attach shifted (-stemwidth / 2, 0);
+ upshift := max (0, wwing + 0.1 staff_space + extend);
+ z2 = z1 shifted (((unitvector stemslant)
+ scaled upshift) transformed flip);
+
+ z7 = attach shifted ((stemwidth/2),0);
+ z6 = z7 shifted (((unitvector (-xpart stemslant, ypart stemslant))
+ scaled upshift) transformed flip);
+ z2 - z3 = ( 0.38 staff_space, 0.05 htip) transformed flip;
+ z6 - z5 = (-0.38 staff_space, 0.05 htip) transformed flip;
+
+ z4 = attach shifted ((-0.2 stemwidth, upshift + htip)
+ transformed flip);
+ z4'= attach shifted (( 0.2 stemwidth, upshift + htip)
+ transformed flip);
+
+ % `angle_wing_bot' is the angle at which the arc
+ % from z2 to z3a enters z3a
+ % `angle_wing_top' is the angle at which the arc
+ % from z3b to z4 leaves z3b
+ % `angle_tip' is the angle at which the arc
+ % from z4 to z4' leaves z4
+ angle_wing_bot = 30;
+ angle_wing_top = 55;
+ angle_tip = 68;
+
+ z3a = z3 shifted ((((dir angle_wing_bot) rotated -90)
+ scaled wwing) transformed flip);
+ z3b = z3 shifted ((((dir angle_wing_top) rotated 90)
+ scaled wwing) transformed flip);
+
+ z5a = z5 shifted ((((dir (180 - angle_wing_bot)) rotated 90)
+ scaled wwing) transformed flip);
+ z5b = z5 shifted ((((dir (180 - angle_wing_top)) rotated -90)
+ scaled wwing) transformed flip);
+
+ % Draw the arrow
+ pickup pencircle scaled 1;
+ fill z1
+ -- z2{stemslant transformed flip}
+ .. {(-dir angle_wing_bot) transformed flip}z3a
+ .. z3b{(dir angle_wing_top) transformed flip}
+ .. z4{(dir angle_tip) transformed flip}
+ .. z4'{(dir (-angle_tip)) transformed flip}
+ .. {(dir (-angle_wing_top)) transformed flip}z5b
+ .. z5a{(-dir (-angle_wing_bot)) transformed flip}
+ .. z6{((-stemslant) reflectedabout (origin, up)) transformed flip}
+ -- z7
+ -- cycle;
+
+ labels (range 0 thru 7, 4', 3a, 3b, 5a, 5b);
+endgroup;
+enddef;
+
+save remember_pic;
+picture remember_pic;
+
+save sharp_beamheight;
+sharp_beamheight# := 0.3 staff_space# + stafflinethickness#;
+
+%
+% The beams of most sharps have horizontal endings (as if drawn with
+% a square pen). [Wanske] does not mention this, so we'll just ignore
+% this fact.
+%
+
+def draw_meta_sharp (expr width, offset) =
+ save beamwidth, beamslope;
+ save ne, nw_dist;
+ pair ne, nw_dist;
+
+ beamwidth := width;
+
+ define_whole_vertical_blacker_pixels (sharp_beamheight);
+
+ clearxy;
+
+ beamslope = sharp_beamheight / beamwidth;
+
+ pickup pencircle scaled 2 blot_diameter;
+
+ rt x2 - lft x1 = beamwidth;
+ z2 = z1 + whatever * (beamwidth, sharp_beamheight);
+ .5 [z1, z3] = (.5 w, offset);
+ x3 = x2;
+ top y2 - bot y3 = sharp_beamheight;
+ x4 = x1;
+ top y1 - bot y4 = sharp_beamheight;
+
+ ne = unitvector (z2 - z1);
+ nw_dist = (ne rotated 90) * blot_diameter;
+
+ fill lft z1{up}
+ ... (z1 + nw_dist){ne}
+ -- (z2 + nw_dist){ne}
+ ... rt z2{down}
+ -- rt z3{down}
+ ... (z3 - nw_dist){-ne}
+ -- (z4 - nw_dist){-ne}
+ ... lft z4{up}
+ -- cycle;
+
+ labels (1, 2, 3, 4);
+enddef;
+
+
+def draw_sharp(expr arrowup, arrowdown) =
+ save stem, stemx, stemwidth;
+ save outer_space, interbeam;
+ save stemlength, extendleft, extendright, height, depth;
+
+ stemwidth# := stafflinethickness# + .05 staff_space#;
+ define_whole_blacker_pixels (stemwidth);
+
+ interbeam := 1.05 staff_space_rounded;
+
+ stemlength# := 1.5 staff_space#;
+ define_pixels (stemlength);
+
+ height# = stemlength#;
+ depth# = stemlength#;
+ extendright# = 0;
+ extendleft# = 0;
+ if arrowup:
+ height# := height# + 1.2 staff_space#;
+ extendright# := extendright# + 1.5 stafflinethickness#;
+ fi;
+ if arrowdown:
+ depth# := depth# + 1.2 staff_space#;
+ extendleft# := extendleft# + 1.5 stafflinethickness#;
+ fi;
+ define_pixels (extendleft, extendright);
+ set_char_box (extendleft#, 1.1 staff_space#, depth#, height#);
+
+ stem := 7 / 16 * w;
+ stemx := hround stem;
+ outer_space := hround ((w - stemx - stemwidth) / 2);
+
+ w := 2 outer_space + stemx + stemwidth;
+ d := d - feta_space_shift;
+
+ draw_meta_sharp (w, -.5 interbeam);
+ draw_meta_sharp (w, -.5 interbeam + vround interbeam);
+
+ % expand the charbox so that it encloses the whole arrow;
+ % this must not happen earlier because some commands above
+ % still rely on the old width
+ w := w + extendright;
+
+ pickup pencircle scaled stemwidth;
+
+ lft x5 = lft x6 = outer_space;
+ lft x7 = lft x8 = outer_space + stemx;
+ bot y5 = -stemlength;
+ top y6 = vround (1.5 staff_space - stem * beamslope);
+ bot y7 = -top y6 + feta_space_shift;
+ top y8 = stemlength;
+
+ labels (5, 6, 7, 8);
+
+ draw_gridline (z5, z6, stemwidth);
+ draw_gridline (z7, z8, stemwidth);
+
+ if arrowup:
+ draw_arrow (z8, stemwidth, up,
+ stafflinethickness / 2 + stemwidth / 2, false);
+ fi;
+ if arrowdown:
+ draw_arrow (z5, stemwidth, up,
+ stafflinethickness / 2 + stemwidth / 2, true);
+ fi;
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+enddef;
+
+
+fet_beginchar ("Sharp", "sharp");
+ draw_sharp (false, false);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Sharp (arrow up)", "sharp.arrowup");
+ draw_sharp (true, false);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Sharp (arrow down)", "sharp.arrowdown");
+ draw_sharp (false, true);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Sharp (arrows up and down)", "sharp.arrowboth");
+ draw_sharp (true, true);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("1/2 Sharp", "sharp.slashslash.stem");
+ save stem, stemwidth;
+ save outer_space, interbeam;
+
+ stemwidth# := stafflinethickness# + .05 staff_space#;
+ define_whole_blacker_pixels (stemwidth);
+
+ interbeam := 1.05 staff_space_rounded;
+
+ set_char_box (0, 0.7 staff_space#,
+ 1.5 staff_space#, 1.5 staff_space#);
+
+ stem := 7 / 16 * w;
+ outer_space := hround ((w - stemwidth) / 2);
+
+ w := 2 outer_space + stemwidth;
+ d := d - feta_space_shift;
+
+ draw_meta_sharp (w, -.5 interbeam);
+ draw_meta_sharp (w, -.5 interbeam + vround interbeam);
+
+ pickup pencircle scaled stemwidth;
+
+ lft x5 = lft x6 = outer_space;
+ top y6 = vround (1.5 staff_space - .5 stem);
+ bot y5 = -top y6 + feta_space_shift;
+
+ labels (5, 6);
+
+ draw_gridline (z5, z6, stemwidth);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Sharp (3 beams)", "sharp.slashslashslash.stemstem");
+ save stem, stemx, stemwidth;
+ save outer_space, interbeam;
+ save sharp_beamheight;
+
+ sharp_beamheight# := 0.22 staff_space# + stafflinethickness#;
+
+ stemwidth# := stafflinethickness# + .05 staff_space#;
+ define_whole_blacker_pixels (stemwidth);
+
+ interbeam := 1.2 staff_space_rounded;
+
+ set_char_box (0, 1.1 staff_space#,
+ 1.5 staff_space#, 1.5 staff_space#);
+
+ stem := 7 / 16 * w;
+ stemx := hround stem;
+ outer_space := hround ((w - stemx - stemwidth) / 2);
+
+ w := 2 outer_space + stemx + stemwidth;
+ d := d - feta_space_shift;
+
+ draw_meta_sharp (.88 w, -.5 interbeam);
+ draw_meta_sharp (.88 w, -.5 interbeam + vround interbeam);
+ sharp_beamheight# := 1/.88 sharp_beamheight#;
+ draw_meta_sharp (w, 0);
+
+ pickup pencircle scaled stemwidth;
+
+ lft x5 = lft x6 = outer_space;
+ lft x7 = lft x8 = outer_space + stemx;
+ bot y5 = -d;
+ top y6 = vround (1.5 staff_space - stem * beamslope);
+ bot y7 = -top y6 + feta_space_shift;
+ top y8 = h;
+
+ labels (5, 6, 7, 8);
+
+ draw_gridline (z5, z6, stemwidth);
+ draw_gridline (z7, z8, stemwidth);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("1/2 Sharp (3 beams)", "sharp.slashslashslash.stem");
+ save stem, stemx, stemwidth;
+ save outer_space, interbeam;
+ save sharp_beamheight;
+
+ sharp_beamheight# := 0.22 staff_space# + stafflinethickness#;
+
+ stemwidth# := stafflinethickness# + .05 staff_space#;
+ define_whole_blacker_pixels (stemwidth);
+
+ interbeam := 1.2 staff_space_rounded;
+
+ set_char_box (0, 0.95 staff_space#,
+ 1.3 staff_space#, 1.3 staff_space#);
+
+ stem := 7 / 16 * w;
+ outer_space := hround ((w - stemwidth) / 2);
+
+ w := 2 outer_space + stemwidth;
+ d := d - feta_space_shift;
+
+ draw_meta_sharp (.8 w, -.5 interbeam);
+ draw_meta_sharp (.8 w, -.5 interbeam + vround interbeam);
+ sharp_beamheight# := 1/.8 sharp_beamheight#;
+ draw_meta_sharp (w, 0);
+
+ pickup pencircle scaled stemwidth;
+
+ lft x5 = lft x6 = outer_space;
+ top y6 = vround (1.5 staff_space - .5 stem);
+ bot y5 = -top y6 + feta_space_shift;
+ labels (5, 6);
+
+ draw_gridline (z5, z6, stemwidth);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("3/4 Sharp", "sharp.slashslash.stemstemstem");
+ save stem, stemx, stemwidth;
+ save outer_space, interbeam;
+
+ stemwidth# := stafflinethickness# + .05 staff_space#;
+ define_whole_blacker_pixels (stemwidth);
+
+ interbeam := 1.05 staff_space_rounded;
+
+ set_char_box (0, 1.6 staff_space#,
+ 1.5 staff_space#, 1.5 staff_space#);
+
+ stem := 9 / 32 * w;
+ stemx := hround stem;
+ outer_space := hround ((w - 2 stemx - stemwidth) / 2);
+
+ w := 2 outer_space + 2 stemx + stemwidth;
+ d := d - feta_space_shift;
+
+ draw_meta_sharp (w, -.5 interbeam);
+ draw_meta_sharp (w, -.5 interbeam + vround interbeam);
+
+ pickup pencircle scaled stemwidth;
+
+ lft x5 = lft x6 = outer_space;
+ lft x7 = lft x8 = outer_space + stemx;
+ lft x9 = lft x10 = outer_space + 2 stemx;
+ bot y5 = -d;
+ top y6 = vround (1.5 staff_space - 2 stem * beamslope);
+ bot y9 = -top y6 + feta_space_shift;
+ top y10 = h;
+ y7 = .5 [y5, y9];
+ y8 = .5 [y6, y10];
+
+ labels (5, 6, 7, 8, 9, 10);
+
+ draw_gridline (z5, z6, stemwidth);
+ draw_gridline (z7, z8, stemwidth);
+ draw_gridline (z9, z10, stemwidth);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+%
+% The stems of the natural are brushed (at least, in Barenreiter SCS)
+%
+
+def draw_natural (expr arrowup, arrowdown) =
+ save stemwidth, top_stem_thick;
+ save ne, pat_top, pat_bottom;
+ save depth, height, extendleft, extendright, stemlength;
+ save brush_scale_up, brush_scale_down;
+ pair ne;
+ path pat_top, pat_bottom;
+
+ top_stem_thick# = stafflinethickness# + .10 staff_space#;
+ stemwidth# = 0.09 staff_space# + .5 stafflinethickness#;
+ define_whole_blacker_pixels (top_stem_thick, stemwidth);
+
+ stemlength# = 1.5 staff_space#;
+ define_pixels (stemlength);
+
+ height# = stemlength#;
+ depth# = stemlength#;
+ extendleft# = 0;
+ extendright# = 0;
+ if arrowup:
+ extendleft# := 3 stafflinethickness#;
+ height# := height# + 1.2 staff_space#;
+ fi;
+ if arrowdown:
+ extendright# := 3.15 stafflinethickness#;
+ depth# := depth# + 1.2 staff_space#;
+ fi;
+ define_pixels (extendright);
+
+ set_char_box (extendleft#, 2/3 staff_space#, depth#, height#);
+
+ d := d - feta_space_shift;
+
+ pickup pencircle scaled stemwidth;
+
+ brush_scale_up := 1.0;
+ brush_scale_down := 1.0;
+ % to look nice, arrowed stems must be less brushed
+ if arrowup:
+ brush_scale_up := 0.85;
+ fi;
+ if arrowdown:
+ brush_scale_down := 0.85;
+ fi;
+
+ penpos1 (top_stem_thick, 0);
+ penpos3 (top_stem_thick, 0);
+ penpos2 (stemwidth, 0);
+ penpos4 (stemwidth, 0);
+ % z1' and z3' are needed for the arrowed accidentals
+ penpos1' (top_stem_thick * brush_scale_up, 0);
+ penpos3' (top_stem_thick * brush_scale_down, 0);
+
+ x2r = w;
+ x4l = 0;
+ x3 = x3' = x2;
+ x1 = x1' = x4;
+
+ y1 = y1' = stemlength;
+ y3 = y3' = -stemlength;
+ top y2 = vround (staff_space - 3/2 stafflinethickness);
+ y4 = -y2 + feta_space_shift;
+
+ pat_bottom := z4r{z4r - z1r}
+ .. bot z4
+ .. z4l{z1l - z4l};
+ fill simple_serif (z1'l, z1'r, -30)
+ -- pat_bottom
+ -- cycle;
+
+ pat_top := z2r{z2r - z3r}
+ .. top z2
+ .. z2l{z3l - z2l};
+ fill simple_serif (z3'l, z3'r, 30)
+ -- pat_top
+ -- cycle;
+
+ ne = (x2 - x4, stafflinethickness);
+
+ z11' = z3l + whatever * (z2l - z3l);
+ y11' = vround (.5 (staff_space - stafflinethickness));
+ z11 = z11' + whatever * ne;
+ x11 = x12;
+ z12 = directionpoint -ne of pat_top;
+ z13 = z12 + whatever * ne;
+ x13 = x1;
+ z14 = z11 + whatever * ne;
+ x14 = x1;
+
+ z21' = z4r + whatever * (z1r - z4r);
+ y21' = -y11' + feta_space_shift;
+ z21 = z21' + whatever * ne;
+ x21 = x22;
+ z22 = directionpoint -ne of pat_bottom;
+ z23 = z22 + whatever * ne;
+ x23 = x3;
+ z24 = z21 + whatever * ne;
+ x24 = x3;
+
+ fill z11
+ -- z12
+ -- z13
+ -- z14
+ -- cycle;
+ fill z21
+ -- z22
+ -- z23
+ -- z24
+ -- cycle;
+
+ penlabels (1, 1', 2, 3, 3', 4);
+ labels (11, 11', 12, 13, 14, 21, 21', 22, 23, 24);
+
+ if arrowup:
+ draw_arrow (z1, top_stem_thick * brush_scale_up,
+ z1'l - z4l, stafflinethickness / 2, false);
+ fi;
+ if arrowdown:
+ draw_arrow (z3, top_stem_thick * brush_scale_down,
+ z2r - z3'r, stafflinethickness / 2, true);
+ w := w + extendright;
+ fi;
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+enddef;
+
+
+fet_beginchar ("Natural", "natural");
+ draw_natural (false, false);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Natural (arrow up)", "natural.arrowup");
+ draw_natural (true, false);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Natural (arrow down)", "natural.arrowdown");
+ draw_natural (false, true);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Natural (arrows up and down)", "natural.arrowboth");
+ draw_natural (true, true);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+%
+% Dedicated to my mom. (3/10/97)
+%
+% Mamma, ik hou van je; kom je alsjeblieft terug?
+% -- HW
+%
+%
+% TODO: remove crook_fatness
+% TODO: document, simplify!
+%
+
+def draw_meta_flat (expr xcenter, w, crook_fatness, arrowup, arrowdown) =
+ save crook_thinness;
+ save bottom_overshoot, bot_crook_dir;
+ save top_stem_thick, top_stem_thick_orig;
+ save bottom_stem_thick, hair, smaller_hole;
+ save top_crook_thinness;
+ save zwiep;
+ save center;
+ pair center, bot_crook_dir;
+ save clearing, clearing_orig;
+
+ clearxy;
+
+ % the stem shouldn't reach the top staff line.
+ %% TODO: should take from height.
+ %
+ % TODO: parameterize this
+ %
+ if w >= 0.75 staff_space:
+ smaller_hole = 0.35 stafflinethickness;
+ else:
+ smaller_hole = 0;
+ fi;
+ crook_thinness = .7 stafflinethickness + .06 staff_space;
+ top_crook_thinness = 1 stafflinethickness + .065 staff_space;
+ clearing = 1.7 stafflinethickness;
+ clearing_orig = clearing;
+ if arrowup:
+ clearing := 0.5 staff_space;
+ fi;
+ bottom_overshoot = stafflinethickness;
+
+ bottom_stem_thick# = 0.06 staff_space# + 0.6 stafflinethickness#;
+ top_stem_thick# = 0.1 staff_space# + 1.2 stafflinethickness#;
+ top_stem_thick_orig# = top_stem_thick#;
+ if arrowup:
+ % to look nice, arrowed stems should be less brushed
+ top_stem_thick# := top_stem_thick# * 0.8;
+ fi;
+ define_whole_blacker_pixels (bottom_stem_thick, top_stem_thick,
+ top_stem_thick_orig);
+
+ if odd (top_stem_thick - bottom_stem_thick):
+ top_stem_thick := top_stem_thick - 1;
+ fi;
+ if odd (top_stem_thick_orig - bottom_stem_thick):
+ top_stem_thick_orig := top_stem_thick_orig - 1;
+ fi;
+
+ center = (xcenter, 0);
+
+ x1l = hround (xcenter - .5 top_stem_thick);
+ y1 = vround (2 staff_space - clearing);
+ x2l = hround (xcenter - .5 bottom_stem_thick);
+ y2 = -.5 staff_space - .5 stafflinethickness;
+ % z16 and the `*_orig' variables are needed for arrowed accidentals
+ % because their inner part should be unchanged from plain ones but
+ % the points z3l, z3r, and z10 depend on values that are different
+ % for arrowed accidentals
+ x16l = hround (xcenter -.5 top_stem_thick_orig);
+ y16 = vround (2 staff_space - clearing_orig);
+
+ penpos1 (top_stem_thick, 0);
+ penpos16 (top_stem_thick_orig, 0);
+ penpos2 (bottom_stem_thick, 0);
+
+ y3l = vfloor ((staff_space - stafflinethickness) / 2);
+ z3l = whatever [z2r, z1r];
+ z3r = .3 [z2r,
+ (z16r shifted (0, clearing_orig - 1.7 stafflinethickness))]
+ + (smaller_hole, 0);
+ x3r := hceiling x3r;
+
+ % we insert z3l to get better conversion with mf2pt1
+ fill simple_serif (z1r, z1l, 30)
+ -- z2l
+ -- z2r
+ -- z3l
+ -- cycle;
+
+ z10 = whatever [z2r, z16r] + (smaller_hole, 0);
+ y10 = -1/10 staff_space;
+ x10 := hceiling x10;
+
+ x11 = xcenter + bottom_overshoot / 3;
+ y11 = -vround (.5 (staff_space + stafflinethickness)
+ + bottom_overshoot);
+
+ x2a = 0.2[x2r, x7];
+ y2a = 1.5[y2, y11];
+
+ penpos4 (whatever, 53);
+
+ y4l - y4r = top_crook_thinness;
+ y5r = .15 staff_space;
+ x5l = hround (w + xcenter);
+ y4 = staff_space / 2;
+ x4r = .45 [x5r, x3r];
+ y4l := vround y4l;
+
+ penpos5 (crook_fatness, -175);
+
+ bot_crook_dir = unitvector ((x5l, 0) - z11);
+ z8 = z11 + whatever * bot_crook_dir;
+ y8 = -staff_space / 2;
+
+ z7 = z8
+ + whatever * bot_crook_dir
+ + crook_thinness * (bot_crook_dir rotated 90);
+ x7 = .1 [x3r, x8];
+
+ unfill z3r{z3r - z10}
+ .. z4r{right}
+ .. z5r{down}
+ .. z7{-bot_crook_dir}
+ & z7
+ .. z10{z3r - z10}
+ -- cycle;
+
+ if arrowdown:
+ fill z2l{down}
+ .. z2a{up}
+ .. z8{bot_crook_dir}
+ .. z5l{up}
+ .. z4l{left}
+ .. z3l
+ -- cycle;
+ else:
+ fill z2l{down}
+ .. z11{right}
+ .. z8{bot_crook_dir}
+ .. z5l{up}
+ .. z4l{left}
+ .. z3l
+ -- cycle;
+ fi;
+
+ if arrowup:
+ draw_arrow (z1, top_stem_thick, z1l - z2l,
+ 0.5 stafflinethickness, false);
+ fi;
+ if arrowdown:
+ draw_arrow ((0.5 [x2l, x2a], y2), x2a - x2l, up,
+ staff_space / 2, true);
+ fi;
+enddef;
+
+
+def draw_arrowed_meta_flat (expr xcenter, width, crook_fatness,
+ arrowup, arrowdown) =
+ save depth, height, extendleft;
+
+ depth# = 0.6 staff_space#;
+ height# = 1.9 staff_space#;
+ extendleft# := 1.2 stafflinethickness#;
+ if arrowup:
+ extendleft# := 3.45 stafflinethickness#;
+ height# := height# + 0.8 staff_space#;
+ fi;
+ if arrowdown:
+ extendleft# := 3.45 stafflinethickness#;
+ depth# := depth# + 1.6 staff_space#;
+ fi;
+
+ set_char_box (extendleft#, width, depth#, height#);
+ draw_meta_flat(xcenter, w, crook_fatness, arrowup, arrowdown);
+enddef;
+
+%
+% unfortunately, 600dpi is not enough to show the brush of the stem.
+%
+
+fet_beginchar ("Flat", "flat");
+ draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
+ false, false);
+ penlabels (range 0 thru 11);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Flat (arrow up)", "flat.arrowup");
+ draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
+ true, false);
+ penlabels (range 0 thru 23);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Flat (arrow down)", "flat.arrowdown");
+ draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
+ false, true);
+ penlabels (range 0 thru 23);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Flat (arrow up and down)", "flat.arrowboth");
+ draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
+ true, true);
+ penlabels (range 0 thru 23);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Flat (slashed)", "flat.slash");
+ set_char_box (.4 staff_space#, .8 staff_space#,
+ 0.6 staff_space#, 1.9 staff_space#);
+
+ draw_meta_flat (0, w, 0.31 staff_space, false, false);
+
+ clearxy;
+
+ save slope, slash_width;
+ slope = 0.5;
+ slash_width = w;
+
+ z11 = (0, h / 2);
+ z12 = z11 - (slash_width, slash_width * slope) / 2;
+ z13 = z11 + (slash_width, slash_width * slope) / 2;
+ penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+ penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+
+ z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12);
+ z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12);
+
+ fill z13r
+ .. z15
+ .. z13l
+ -- z12l
+ .. z14
+ .. z12r
+ -- z13r
+ .. cycle;
+
+ penlabels (12, 13);
+ labels (14, 15);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Flat (slashed twice)", "flat.slashslash");
+ set_char_box (.4 staff_space#, .8 staff_space#,
+ 0.6 staff_space#, 1.9 staff_space#);
+
+ draw_meta_flat (0, w, 0.31 staff_space, false, false);
+
+ clearxy;
+
+ save slope, slash_width;
+ slope = 0.5;
+ slash_width = w;
+
+ z11 = (0, 5/12 h);
+ z12 = z11 - (slash_width, slash_width * slope) / 2;
+ z13 = z11 + (slash_width, slash_width * slope) / 2;
+ penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+ penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+
+ z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12);
+ z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12);
+
+ fill z13r
+ .. z15
+ .. z13l
+ -- z12l
+ .. z14
+ .. z12r
+ -- z13r
+ .. cycle;
+
+ penlabels (12, 13);
+ labels (14, 15);
+
+ z21 = (0, 2/3 h);
+ z22 = z21 - (slash_width, slash_width * slope) / 2;
+ z23 = z21 + (slash_width, slash_width * slope) / 2;
+ penpos22 (1.5 stafflinethickness, angle (z23 - z22) - 90);
+ penpos23 (1.5 stafflinethickness, angle (z23 - z22) - 90);
+
+ z24 = z22 - .75 stafflinethickness * unitvector (z23 - z22);
+ z25 = z23 + .75 stafflinethickness * unitvector (z23 - z22);
+
+ fill z23r
+ .. z25
+ .. z23l
+ -- z22l
+ .. z24
+ .. z22r
+ -- z23r
+ .. cycle;
+
+ penlabels (22, 23);
+ labels (24, 25);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Flatflat (mirrored)", "mirroredflat.flat");
+ set_char_box (0, 1.6 staff_space#,
+ 0.6 staff_space#, 1.9 staff_space#);
+
+ % This is a modified version of `draw_meta_flat'.
+
+ save crook_thinness, crook_fatness;
+ save bottom_overshoot, bot_crook_dir;
+ save top_stem_thick, bottom_stem_thick, hair, smaller_hole;
+ save top_crook_thinness;
+ save zwiep;
+ save center;
+ pair center, bot_crook_dir;
+ save clearing, wid;
+ save pat;
+ path pat;
+
+ clearxy;
+
+ wid = w / 2;
+
+ % the stem shouldn't reach the top staff line.
+ %% TODO: should take from height.
+ %
+ % TODO: parameterize this
+ %
+ if wid >= 0.75 staff_space:
+ smaller_hole = 0.35 stafflinethickness;
+ else:
+ smaller_hole = 0;
+ fi;
+ clearing = 1.7 stafflinethickness;
+ crook_thinness = .7 stafflinethickness + .06 staff_space;
+ crook_fatness = 0.31 staff_space;
+ top_crook_thinness = 1 stafflinethickness + .065 staff_space;
+ bottom_overshoot = stafflinethickness;
+
+ bottom_stem_thick# = 0.06 staff_space# + 0.6 stafflinethickness#;
+ top_stem_thick# = 0.1 staff_space# + 1.2 stafflinethickness#;
+ define_whole_blacker_pixels (bottom_stem_thick, top_stem_thick);
+
+ if odd (top_stem_thick - bottom_stem_thick):
+ top_stem_thick := top_stem_thick - 1;
+ fi;
+
+ center = (0, 0);
+
+ x1l = hround (-.5 top_stem_thick);
+ y1 = vround (2 staff_space - clearing);
+ x2l = hround (-.5 bottom_stem_thick);
+ y2 = -.5 staff_space - .5 stafflinethickness;
+
+ penpos1 (top_stem_thick, 0);
+ penpos2 (bottom_stem_thick, 0);
+
+ y3l = vfloor ((staff_space - stafflinethickness) / 2);
+ z3l = whatever [z2r, z1r];
+ z3r = .3 [z2r, z1r] + (smaller_hole, 0);
+ x3r := hceiling x3r;
+
+ z10 = whatever [z2r, z1r] + (smaller_hole, 0);
+ y10 = -1/10 staff_space;
+ x10 := hceiling x10;
+
+ x11 = bottom_overshoot / 3;
+ y11 = -vround (.5 (staff_space + stafflinethickness)
+ + bottom_overshoot);
+
+ penpos4 (whatever, 53);
+
+ y4l - y4r = top_crook_thinness;
+ y5r = .15 staff_space;
+ x5l = hround (wid);
+ y4 = staff_space / 2;
+ x4r = .45 [x5r, x3r];
+ y4l := vround y4l;
+
+ penpos5 (crook_fatness, -175);
+
+ bot_crook_dir = unitvector ((x5l, 0) - z11);
+ z8 = z11 + whatever * bot_crook_dir;
+ y8 = -staff_space / 2;
+
+ z7 = z8
+ + whatever * bot_crook_dir
+ + crook_thinness * (bot_crook_dir rotated 90);
+ x7 = .1 [x3r, x8];
+
+ pat := z3r{z3r - z10}
+ .. z4r{right}
+ .. z5r{down}
+ .. z7{-bot_crook_dir}
+ & z7
+ .. z10{z3r - z10}
+ -- cycle;
+ unfill pat;
+ unfill pat xscaled -1;
+
+ pat := z11{right}
+ .. z8{bot_crook_dir}
+ .. z5l{up}
+ .. z4l{left}
+ .. z3l;
+ fill pat
+ -- simple_serif (z1r, z1l, 30)
+ -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
+
+ currentpicture := currentpicture shifted (w/2, 0);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Semi flat", "mirroredflat");
+ set_char_box (1.2 stafflinethickness#, .8 staff_space#,
+ 0.6 staff_space#, 1.9 staff_space#);
+
+ draw_meta_flat (0, w, 0.31 staff_space, false, false);
+ currentpicture := currentpicture xscaled -1 shifted (w - b, 0);
+fet_endchar;
+
+
+fet_beginchar ("Semi flat", "mirroredflat.backslash");
+ set_char_box (.4 staff_space#, .8 staff_space#,
+ 0.6 staff_space#, 1.9 staff_space#);
+
+ draw_meta_flat (0, w, 0.31 staff_space, false, false);
+
+ clearxy;
+
+ save slope, slash_width;
+ slope = 0.5;
+ slash_width = w;
+
+ z11 = (0, h / 2);
+ z12 = z11 - (slash_width, slash_width * slope) / 2;
+ z13 = z11 + (slash_width, slash_width * slope) / 2;
+ penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+ penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+
+ z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12);
+ z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12);
+
+ fill z13r
+ .. z15
+ .. z13l
+ -- z12l
+ .. z14
+ .. z12r
+ -- z13r
+ .. cycle;
+
+ currentpicture := currentpicture xscaled -1 shifted (w - b, 0);
+
+ labels (1, 2, 3);
+fet_endchar;
+
+
+fet_beginchar ("Double Flat", "flatflat");
+ save left_wid, overlap, right_wid;
+
+ left_wid = .7;
+ right_wid = .8;
+ overlap = .05;
+
+ set_char_box (1.2 stafflinethickness#,
+ (left_wid + right_wid - overlap) * staff_space#,
+ .6 staff_space#, 1.9 staff_space#);
+ draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space,
+ false, false);
+ draw_meta_flat (hround ((left_wid - overlap) * staff_space),
+ right_wid * staff_space, 1/3 staff_space,
+ false, false);
+fet_endchar;
+
+
+fet_beginchar ("3/4 Flat", "flatflat.slash");
+ save left_wid, overlap, right_wid;
+
+ left_wid = .7;
+ right_wid = .8;
+ overlap = .05;
+
+ set_char_box (1.2 stafflinethickness#,
+ (left_wid + right_wid - overlap) * staff_space#,
+ .6 staff_space#, 1.9 staff_space#);
+ draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space,
+ false, false);
+ draw_meta_flat (hround ((left_wid - overlap) * staff_space),
+ right_wid * staff_space, 1/3 staff_space,
+ false, false);
+
+ %% maybe we should clip part of the stems?
+ %% or make the 1st flat smaller?
+ %% or reverse it?
+ pickup pencircle scaled 2 stafflinethickness;
+
+ z12 = round (-.25 w - b, .55 staff_space) + feta_offset;
+ z13 = round (.75 w, 1.45 staff_space) + feta_offset;
+ penpos12 (2 stafflinethickness, angle (z13 - z12) - 90);
+ penpos13 (2 stafflinethickness, angle (z13 - z12) - 90);
+
+ z14 = z12 - stafflinethickness * unitvector (z13 - z12);
+ z15 = z13 + stafflinethickness * unitvector (z13 - z12);
+
+ fill z13r
+ .. z15
+ .. z13l
+ -- z12l
+ .. z14
+ .. z12r
+ -- z13r
+ .. cycle;
+
+ penlabels (12, 13);
+ labels (14, 15);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Double Sharp", "doublesharp");
+ save klaverblad, klaversteel;
+ save pat;
+ path pat;
+
+ klaversteel = 1/15 staff_space;
+ klaverblad = .4 staff_space - .5 stafflinethickness;
+
+ set_char_box (0, staff_space#, .5 staff_space#, .5 staff_space#);
+
+ z1 = (klaversteel, 0);
+ z2 = (w / 2 - klaverblad / 10, h - klaverblad);
+ z3 = (w / 2, h);
+ z4 = z2 reflectedabout ((0, 0), (1, 1));
+ z5 = z1 reflectedabout ((0, 0), (1, 1));
+
+ labels (1, 2, 3, 4, 5);
+
+ pickup pencircle scaled blot_diameter;
+
+ x2 := hfloor (rt x2) - blot_diameter / 2;
+ x3 := hfloor (rt x3) - blot_diameter / 2;
+ y3 := vfloor (top y3) - blot_diameter / 2;
+ y4 := vfloor (top y4) - blot_diameter / 2;
+
+ pat = (rt z1){dir45}
+ .. {right}(bot z2)
+ .. rt z2
+ -- rt z3{z3 - z2}
+ .. top z3{z4 - z3}
+ -- top z4{z4 - z3}
+ .. (lft z4){down}
+ .. {dir 225}(top z5);
+ pat := pat
+ -- reverse pat xscaled -1 shifted (-feta_eps, 0);
+
+ % assure symmetry -- it's more important to center the glyph on the
+ % staff line than centering it between staff lines, so we use
+ % feta_shift, not feta_space_shift.
+ h := h + feta_shift;
+
+ fill pat shifted (0, feta_shift)
+ -- reverse pat yscaled -1 shifted (0, -feta_eps)
+ -- cycle;
+
+ % ugh
+ currentpicture := currentpicture shifted (hround (w / 2), 0);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+def draw_paren =
+ save leftindent;
+
+ leftindent := .2 staff_space;
+
+ set_char_box (0, .5 staff_space# + stafflinethickness#,
+ staff_space#, staff_space#);
+
+ d := d - feta_shift;
+
+ z1 = (leftindent, h);
+ z2 = (w - stafflinethickness, .5 (h - d));
+ z3 = (leftindent, -d);
+
+ penpos1 (stafflinethickness, 35);
+ penpos2 (.1 staff_space + stafflinethickness, 0);
+ penpos3 (stafflinethickness, -35);
+
+ fill z2l{down}
+ .. simple_serif (z3l, z3r, 90)
+ .. z2r{up}
+ .. simple_serif (z1r, z1l, 90)
+ .. z2l{down}
+ -- cycle;
+enddef;
+
+
+fet_beginchar ("Right Parenthesis", "rightparen");
+ draw_paren;
+ penlabels (1, 2, 3);
+
+ remember_pic := currentpicture;
+
+ draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Left Parenthesis", "leftparen");
+ draw_paren;
+
+ currentpicture := currentpicture xscaled -1;
+
+ set_char_box (charwd, charbp, chardp, charht);
+fet_endchar;
+
+fet_endgroup ("accidentals");
diff --git a/muse2/share/scoreglyphs/feta-original/feta11.mf b/muse2/share/scoreglyphs/feta-original/feta11.mf
new file mode 100644
index 00000000..be6a6a7e
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta11.mf
@@ -0,0 +1,13 @@
+% feta11.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 11.22;
+test := 0;
+
+
+input feta-generic;
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta13.mf b/muse2/share/scoreglyphs/feta-original/feta13.mf
new file mode 100644
index 00000000..5014c123
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta13.mf
@@ -0,0 +1,13 @@
+% feta13.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 12.60;
+test := 0;
+
+
+input feta-generic;
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta14.mf b/muse2/share/scoreglyphs/feta-original/feta14.mf
new file mode 100644
index 00000000..23ac8e4d
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta14.mf
@@ -0,0 +1,14 @@
+% feta14.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 14.14;
+test := 0;
+
+
+input feta-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta16.mf b/muse2/share/scoreglyphs/feta-original/feta16.mf
new file mode 100644
index 00000000..174460b7
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta16.mf
@@ -0,0 +1,13 @@
+% feta16.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 15.87;
+test := 0;
+
+
+input feta-generic;
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta18.mf b/muse2/share/scoreglyphs/feta-original/feta18.mf
new file mode 100644
index 00000000..b52f6a3e
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta18.mf
@@ -0,0 +1,14 @@
+% feta18.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+% todo change file name
+design_size := 17.82;
+test := 0;
+
+
+input feta-generic;
+
+
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta20.mf b/muse2/share/scoreglyphs/feta-original/feta20.mf
new file mode 100644
index 00000000..2b561b20
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta20.mf
@@ -0,0 +1,14 @@
+% feta20.mf
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 20;
+
+input feta-autometric;
+
+
+% use feta-test for debugging.
+test := 0;
+input feta-generic;
+
+
+end.
diff --git a/muse2/share/scoreglyphs/feta-original/feta23.mf b/muse2/share/scoreglyphs/feta-original/feta23.mf
new file mode 100644
index 00000000..d2cf0025
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta23.mf
@@ -0,0 +1,15 @@
+% feta23.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+% todo change file name
+design_size := 22.45;
+test := 0;
+
+
+input feta-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/feta26.mf b/muse2/share/scoreglyphs/feta-original/feta26.mf
new file mode 100644
index 00000000..2bfa5366
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/feta26.mf
@@ -0,0 +1,15 @@
+% feta26.mf
+% part of LilyPond's pretty-but-neat music font
+
+input feta-autometric;
+
+design_size := 25.20;
+test := 0;
+
+
+input feta-generic;
+
+
+end.
+
+
diff --git a/muse2/share/scoreglyphs/feta-original/mf2pt1.mp b/muse2/share/scoreglyphs/feta-original/mf2pt1.mp
new file mode 100644
index 00000000..a8b45aad
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/mf2pt1.mp
@@ -0,0 +1,495 @@
+%%%%
+%%%% MF2PT1.MP, by Scott Pakin, scott+mf@pakin.org
+%%%%
+%%%% This file is used to dump a special version of MetaPost with:
+%%%% mpost -progname=mpost -ini mf2pt1 \\dump
+%%%%
+%%%% To pretty-print this file, you'll need LaTeX and the mftinc package
+%%%% (available from CTAN).
+%%%%
+
+%%%% ==================================================================== %%%%
+%%%% mf2pt1 %%%%
+%%%% Copyright (C) 2008 Scott Pakin %%%%
+%%%% %%%%
+%%%% This program may be distributed and/or modified under the conditions %%%%
+%%%% of the LaTeX Project Public License, either version 1.3c of this %%%%
+%%%% license or (at your option) any later version. %%%%
+%%%% %%%%
+%%%% The latest version of this license is in: %%%%
+%%%% %%%%
+%%%% http://www.latex-project.org/lppl.txt %%%%
+%%%% %%%%
+%%%% and version 1.3c or later is part of all distributions of LaTeX %%%%
+%%%% version 2006/05/20 or later. %%%%
+%%%% ==================================================================== %%%%
+
+input mfplain;
+
+%%% addto makepath makepen
+%%% length clockwise counterclockwise
+%%% scaled dashed withcolor
+
+%% \begin{explaincode}
+%% Enable a \MF\ file to determine if it's being built with
+%% \texttt{mf2pt1}.
+%% \end{explaincode}
+
+newinternal ps_output;
+ps_output := 1;
+
+
+%% \begin{explaincode}
+%% The following was taken right out of \texttt{mfplain.mp}. The \mfcomment
+% |def| and the |special|s at the end
+%% are the sole additions. Normally, MetaPost outputs a tight bounding
+%% box around the character in its PostScript output. The purpose of the
+%% first \mfcomment
+% |special|
+%% is to pass \texttt{mf2pt1} a bounding box that includes the proper
+%% surrounding whitespace. The purpose of the second special is to
+%% provide \texttt{mf2pt1} with a default PostScript font name.
+%% \end{explaincode}
+
+def beginchar(expr c,w_sharp,h_sharp,d_sharp) =
+ begingroup
+ charcode:=if known c: byte c else: 0 fi;
+ charwd:=w_sharp; charht:=h_sharp; chardp:=d_sharp;
+ w:=charwd*pt; h:=charht*pt; d:=chardp*pt;
+ charic:=0; clearxy; clearit; clearpen; scantokens extra_beginchar;
+
+ def to_bp (expr num) = decimal (ceiling (num*bp_per_pixel)) enddef;
+ special "% MF2PT1: glyph_dimensions 0 " & to_bp (-d) & " " & to_bp(w) & " " & to_bp(h);
+ special "% MF2PT1: font_size " & decimal designsize;
+ special "% MF2PT1: font_slant " & decimal font_slant_;
+ special "% MF2PT1: charwd " & decimal charwd; % Must come after the |font_size| |special|
+ for fvar = "font_identifier", "font_coding_scheme", "font_version",
+ "font_comment", "font_family", "font_weight", "font_unique_id",
+ "font_name":
+ if known scantokens (fvar & "_"):
+ special "% MF2PT1: " & fvar & " " & scantokens (fvar & "_");
+ fi;
+ endfor;
+ for fvar = "font_underline_position", "font_underline_thickness":
+ if known scantokens (fvar & "_"):
+ special "% MF2PT1: " & fvar & " " &
+ scantokens ("decimal " & fvar & "_");
+ fi;
+ endfor;
+ special "% MF2PT1: font_fixed_pitch " &
+ (if font_fixed_pitch_: "1" else: "0" fi);
+enddef;
+
+
+%% \begin{explaincode}
+%% Enable a character to specify explicitly the PostScript glyph
+%% name associated with it.
+%% \end{explaincode}
+def glyph_name expr name =
+ special "% MF2PT1: glyph_name " & name;
+enddef;
+
+
+%% \begin{explaincode}
+%% Store the value of \mfcomment
+% |font_slant_|, so we can recall it at each |beginchar|.
+%% \end{explaincode}
+
+font_slant_ := 0;
+
+def font_slant expr x =
+ font_slant_ := x;
+ fontdimen 1: x
+enddef;
+
+
+%% \begin{explaincode}
+%% Redefine \mfcomment
+% |bpppix_|, the number of ``big'' points per pixel. \mfcomment
+% This in turn redefines |mm|, |in|, |pt|, and other derived units.
+%% \end{explaincode}
+
+def bpppix expr x =
+ bpppix_ := x;
+ mm := 2.83464 / bpppix_;
+ pt := 0.99626 / bpppix_;
+ dd := 1.06601 / bpppix_;
+ bp := 1 / bpppix_;
+ cm := 28.34645 / bpppix_;
+ pc := 11.95517 / bpppix_;
+ cc := 12.79213 / bpppix_;
+ in := 72 / bpppix_;
+ hppp := pt;
+ vppp := pt;
+enddef;
+
+
+%% \begin{explaincode}
+%% Define a bunch of PostScript font parameters to be used by
+%% \texttt{mf2pt1.pl}. Default values are specified in
+%% \texttt{mf2pt1.pl}, not here.
+%% \end{explaincode}
+
+forsuffixes fvar = font_version, font_comment, font_family, font_weight,
+ font_name, font_unique_id:
+ scantokens ("string " & str fvar & "_;");
+ scantokens ("def " & str fvar & " expr x = " & str fvar & "_ := x enddef;");
+endfor;
+
+forsuffixes fvar = font_underline_position, font_underline_thickness:
+ scantokens ("numeric " & str fvar & "_;");
+ scantokens ("def " & str fvar & " expr x = " & str fvar & "_ := x enddef;");
+endfor;
+
+boolean font_fixed_pitch_;
+font_fixed_pitch_ := false;
+def font_fixed_pitch expr x = font_fixed_pitch_ := x enddef;
+
+
+%% \begin{explaincode}
+%% We'd like to be able to use calligraphic pens. Normally, MetaPost's
+%% output routine does all the work for us of converting these to filled
+%% PostScript paths. The only exception occurs for paths drawn using a
+%% pen that was transformed from \mfcomment
+% |pencircle|. MetaPost outputs these paths as stroked PostScript
+%% paths. The following code tricks MetaPost into using a filled path
+%% for \mfcomment
+% |pencircle| by replacing the primitive |pencircle| pen with a
+%% non-primitive approximation. Note that we use a 20-gon for our circle
+%% instead of a diamond, so we get better results from \mfcomment
+% |draw|.
+%% \end{explaincode}
+
+pen fakepencircle, mfplain_pencircle;
+mfplain_pencircle := pencircle;
+fakepencircle := makepen (for deg=0 step 360/20 until 359:
+ (0.5 cosd deg, 0.5 sind deg)--
+ endfor cycle);
+save pencircle;
+pen pencircle;
+pencircle := fakepencircle;
+
+
+%% \begin{explaincode}
+%% Return \mfcomment
+% |true| if a path is cyclic, |false| otherwise.
+%% \end{explaincode}
+
+def is_cyclic expr cpath =
+ (point 0 of cpath = point (length cpath) of cpath)
+enddef;
+
+
+%% \begin{explaincode}
+%% Determine the direction of a path which doesn't intersect
+%% itself. \mfcomment
+% Returns |true| if the curve is clockwise, |false| if
+%% counterclockwise. For non-cyclic paths the result is not
+%% predictable.
+%% \bigskip
+%%
+%% The \mfcomment
+% |crossproduct|, |makeline|, and |is_clockwise| functions were
+%% provided by Werner Lemberg.
+%% \bigskip
+%%
+%% The algorithm used is quite simple:
+%%
+%% \begin{itemize}
+%% \item Find a point~$P$ on the path which has a non-zero direction,
+%% and which is on a not-too-short path element.
+%%
+%% \item Construct a ray of ``infinite'' length, starting in the
+%% vicinity of~$P$ which intersects the path at this point.
+%%
+%% \item Use \mfcomment
+% |intersectiontimes| to find the intersection. If the direction of
+%% the path at this point is (near) zero, or if we have a grazing
+%% intersection or even a tangent, get a new ray.
+%%
+%% \item Shorten the ray so that it starts right after the
+%% intersection. Repeat the previous step until no intersection is
+%% found. Then go back to the last intersection and compare the path's
+%% direction with the direction of the ray. According to the
+%% \emph{nonzero winding number} rule we have found a clockwise
+%% oriented path if it crosses the ray from left to right.
+%% \end{itemize}
+%%
+%% This method completely avoids any problems with the geometry of
+%% B\'{e}zier curves. If problems arise, a different ray is tried.
+%% Since it isn't necessary to analyze the whole path it runs quite fast
+%% in spite of using \mfcomment
+% |intersectiontimes| which is a slow MetaPost command.
+%% \end{explaincode}
+
+vardef crossproduct (expr u, v) =
+ save u_, v_;
+ pair u_, v_;
+
+ u_ := unitvector u;
+ v_ := unitvector v;
+
+ abs (xpart u_ * ypart v_ - ypart u_ * xpart v_)
+enddef;
+
+vardef makeline primary p =
+ save start, bad_n, loop, distance, d, i, n;
+ pair start, d;
+
+ loop := 0;
+ bad_n := -1;
+ for i := 0 step 1 until length p - 1:
+ distance := length (point i of p - point (i + 1) of p);
+ if distance <> 0:
+ if distance < 1:
+ % In case we don't find something better.
+ bad_n := i;
+ else:
+ n := i;
+ loop := 1;
+ fi;
+ fi;
+ exitif loop = 1;
+ endfor;
+
+ if loop = 0:
+ if bad_n <> -1:
+ n := bad_n;
+ loop = 1;
+ fi;
+ fi;
+
+ % Add some randomness to get different lines for each function call.
+ n := n + uniformdeviate 0.8 + 0.1;
+ start := point n of p;
+
+ if loop = 0:
+ % Construct a line which misses the degenerated path.
+ start + (1, 0)
+ -- start + (1, 1)
+ else:
+ d := direction n of p;
+
+ % Again, some added randomness.
+ n := uniformdeviate 150 + 15;
+ d := unitvector (d rotated n);
+
+ % Construct a line which intersects the path at least once.
+ start - eps * d
+ -- infinity * d
+ fi
+enddef;
+
+vardef is_clockwise primary p =
+ save line, cut, cut_new, res, line_dir, tangent_dir;
+ path line;
+ pair cut, cut_new, line_dir, tangent_dir;
+
+ line := makeline p;
+ line_dir := direction 0 of line;
+
+ % Find the outermost intersection.
+ cut := (0, 0);
+ forever:
+ cut_new := line intersectiontimes p;
+ exitif cut_new = (-1, -1);
+
+ % Compute a new line if we have a strange intersection.
+ tangent_dir := direction (ypart cut_new) of p;
+ if abs tangent_dir < eps:
+ % The vector is zero or too small.
+ line := makeline p;
+ line_dir := direction 0 of line;
+
+ elseif abs (ypart cut_new - floor (ypart cut_new + 0.5)) < eps:
+ % Avoid possible tangent touching in a corner or cusp.
+ line := makeline p;
+ line_dir := direction 0 of line;
+
+ elseif crossproduct (tangent_dir, line_dir) < 0.2:
+ % Grazing intersection (arcsin 0.2 ~= 11.5 degrees).
+ line := makeline p;
+ line_dir := direction 0 of line;
+
+ else:
+ % Go ahead.
+ cut := cut_new;
+ line := subpath (xpart cut + eps, infinity) of line;
+ fi;
+ endfor;
+
+ tangent_dir := direction (ypart cut) of p;
+ if tangent_dir <> (0, 0):
+ res := (angle tangent_dir - angle line_dir + 180) mod 360 - 180;
+ res < 0
+ else:
+ false
+ fi
+enddef;
+
+
+%% \begin{explaincode}
+%% Make a given path run clockwise or counterclockwise. \mfcomment
+% (|counterclockwise| is defined by \texttt{mfplain} but we override
+%% it here.)
+%% \end{explaincode}
+
+vardef counterclockwise primary c =
+ (if is_clockwise c: (reverse c) else: c fi)
+enddef;
+
+vardef clockwise primary c =
+ (if is_clockwise c: c else: (reverse c) fi)
+enddef;
+
+
+%% \begin{explaincode}
+%% Redefine \mfcomment
+% |fill| and |unfill| to ensure that filled paths run
+%% counterclockwise and unfilled paths run clockwise, as is required
+%% by PostScript Type~1 fonts.
+%% \end{explaincode}
+
+def fill expr c =
+ addto currentpicture contour counterclockwise c t_ pc_
+enddef;
+
+def unfill expr c =
+ addto currentpicture contour clockwise c t_ pc_ withcolor background
+enddef;
+
+
+%% \begin{explaincode}
+%% Convert \mfcomment
+% |filldraw| and |unfilldraw| to |fill| and |unfill|.
+%% \end{explaincode}
+
+let mfplain_filldraw := filldraw;
+def filldraw expr c =
+ begingroup
+ message "! Warning: Replacing filldraw with fill.";
+ fill c
+ endgroup
+enddef;
+
+let mfplain_unfilldraw := unfilldraw;
+def unfilldraw expr c =
+ begingroup
+ message "! Warning: Replacing unfilldraw with unfill.";
+ unfill c
+ endgroup
+enddef;
+
+
+%% \begin{explaincode}
+%% Return \mfcomment
+% |true| if |currentpen| looks like a |pencircle|.
+%% \end{explaincode}
+
+def using_pencircle =
+ begingroup
+ path qpath, circlepath;
+ qpath = makepath currentpen;
+ numeric circlediv;
+ circlepath = makepath pencircle;
+ circlediv = xpart (lrcorner circlepath);
+
+ (length qpath = length circlepath) and (pen_rt <> 0) and (pen_top <> 0)
+ for pp = 0 upto (length qpath)-1:
+ and ((xpart (point pp of qpath) / pen_rt,
+ ypart (point pp of qpath) / pen_top) =
+ point pp of circlepath / circlediv)
+ endfor
+ endgroup
+enddef;
+
+
+%% \begin{explaincode}
+%% If the pen looks like a circular pen, draw a nice circle. Otherwise,
+%% draw the pen as is.
+%% \end{explaincode}
+
+def drawdot expr z =
+ if using_pencircle:
+ begingroup
+ path cpath;
+ numeric clength;
+ cpath = makepath currentpen;
+ clength = length cpath;
+ fill ((point 0 of cpath)
+ ..(point clength/4 of cpath)
+ ..(point clength/2 of cpath)
+ ..(point 3*clength/4 of cpath)
+ ..cycle) shifted z t_
+ endgroup
+ else:
+ addto currentpicture contour makepath currentpen shifted z
+ t_ pc_
+ fi
+enddef;
+
+
+%% \begin{explaincode}
+%% Do the same as the above, but unfill the current pen.
+%% \end{explaincode}
+
+def undrawdot expr z =
+ if using_pencircle:
+ begingroup
+ path cpath;
+ numeric clength;
+ cpath = makepath currentpen;
+ clength = length cpath;
+ unfill ((point 0 of cpath)
+ ..(point clength/4 of cpath)
+ ..(point clength/2 of cpath)
+ ..(point 3*clength/4 of cpath)
+ ..cycle) shifted z t_
+ endgroup
+ else:
+ unfill makepath currentpen shifted z t_
+ fi
+enddef;
+
+
+%% \begin{explaincode}
+%% MetaPost renders \mfcomment
+% |draw| with a filled curve.
+%% Hence, we need to ensure the orientation is correct (i.e.,
+%% counterclockwise). Unfortunately, we have no way to check for
+%% overlap, and it's fairly common for MetaPost to output
+%% self-overlapping curve outlines, even if the curve itself has no
+%% overlap.
+%% \end{explaincode}
+
+def draw expr p =
+ addto currentpicture
+ if picture p:
+ also p
+ elseif is_cyclic p:
+ doublepath counterclockwise p t_ withpen currentpen
+ else:
+ if is_clockwise (p--cycle):
+ doublepath (reverse p) t_ withpen currentpen
+ else:
+ doublepath p t_ withpen currentpen
+ fi
+ fi
+ pc_
+enddef;
+
+def undraw expr p =
+ addto currentpicture
+ if picture p:
+ also p
+ elseif is_cyclic p:
+ doublepath clockwise p t_ withpen currentpen
+ else:
+ if is_clockwise (p--cycle):
+ doublepath p t_ withpen currentpen
+ else:
+ doublepath (reverse p) t_ withpen currentpen
+ fi
+ fi
+ pc_ withcolor background
+enddef;
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan-accidentals.mf b/muse2/share/scoreglyphs/feta-original/parmesan-accidentals.mf
new file mode 100644
index 00000000..b5fe6630
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan-accidentals.mf
@@ -0,0 +1,385 @@
+% -%-Fundamental-%- -*-Metafont-*-
+% parmesan-accidentals.mf -- implement ancient accidentals
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+
+fet_begingroup ("accidentals");
+
+
+%%%%%%%%
+%
+%
+%
+% EDITIO MEDICAEA
+%
+%
+%
+fet_beginchar ("Ed. Med. Flat" , "medicaeaM1");
+ set_char_box (0.1 staff_space#, 0.6 staff_space#,
+ 0.6 staff_space#, 1.0 staff_space#);
+
+ save ellipse, pat, outline, T;
+ path ellipse, pat, outline;
+ transform T;
+
+ T := identity xscaled 0.50 linethickness
+ yscaled 0.22 staff_space;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ x1 = x2 = 0;
+ top y1 = h;
+ bot y2 = -d;
+
+ fill get_subpath (ellipse, up, down, z1)
+ -- get_subpath (ellipse, down, up, z2)
+ -- cycle;
+
+ T := identity xscaled 0.50 linethickness
+ yscaled 0.22 staff_space
+ rotated -63;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ z3 = (0.10 staff_space, -0.50 staff_space);
+ z4 = (0.40 staff_space, +0.40 staff_space);
+ z5 = (0.10 staff_space, +0.40 staff_space);
+
+ pat := z3{(1, 2)}
+ .. z4
+ .. z5{(-1, -1)};
+
+ % the original envelope curve created with `draw' contains
+ % cusps which we avoid
+ outline := get_subpath (ellipse, -direction 0 of pat,
+ direction 0 of pat, z3)
+ .. get_subpoint (ellipse, direction 1 of pat, z4)
+ .. get_subpath (ellipse, direction 2 of pat,
+ -direction 1.8 of pat, z5)
+ .. get_subpoint (ellipse, -direction 1 of pat, z4)
+ {-direction 1 of pat}
+ .. cycle;
+
+ save shift;
+ pair shift;
+
+ % make the outline touch the bounding box
+ shift = find_tangent_shift (((w, -d) -- (w, h)), outline,
+ (b, 0), (-b, 0));
+ outline := outline shifted shift;
+
+ fill outline;
+
+ labels (1, 2, 3, 4, 5);
+fet_endchar;
+
+
+%%%%%%%%
+%
+%
+%
+% EDITIO VATICANA
+%
+%
+%
+fet_beginchar ("Ed. Vat. Flat" , "vaticanaM1");
+ z1 = (0.00 staff_space, +0.80 staff_space);
+ z2 = (0.00 staff_space, -0.08 staff_space);
+ z3 = (0.25 staff_space, -0.23 staff_space);
+ z4 = (0.50 staff_space, -0.24 staff_space);
+ z5 = (0.50 staff_space, +0.03 staff_space);
+ z6 = (0.25 staff_space, +0.20 staff_space);
+ z7 = (0.15 staff_space, +0.26 staff_space);
+
+ save pat, ellipse, T;
+ path pat, ellipse;
+ transform T;
+
+ T := identity xscaled 0.50 linethickness
+ yscaled 0.22 staff_space;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ pat := z1
+ -- z2{down}
+ ... z3
+ ... {up}z4
+ -- z5{up}
+ .. z6
+ .. z7;
+
+ % the original envelope curve created with `draw' contains
+ % cusps which we avoid
+ fill get_subpath (ellipse, up, down, z1)
+ -- get_subpath (ellipse, down, direction 1.1 of pat, z2)
+ ... bot z3
+ ... get_subpath (ellipse, direction 2.9 of pat, up, z4)
+ -- get_subpath (ellipse, up, direction 4.1 of pat, z5)
+ .. top z6
+ .. get_subpath (ellipse,
+ direction 6 of pat, -direction 6 of pat, z7)
+ .. bot z6
+ .. {down}bot lft z5
+ -- top lft z4{down}
+ ... top z3
+ ... top rt z2{up}
+ -- cycle;
+
+ set_char_box (0.00 staff_space# + 0.25 linethickness#,
+ 0.50 staff_space# + 0.25 linethickness#,
+ 0.23 staff_space# + 0.11 staff_space#,
+ 0.80 staff_space# + 0.11 staff_space#);
+
+ labels (1, 2, 3, 4, 5, 6, 7);
+fet_endchar;
+
+
+fet_beginchar ("Ed. Vat. Natural" , "vaticana0");
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled 0.80 linethickness
+ yscaled 0.22 staff_space;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ z1 = (0.00 staff_space, +0.65 staff_space);
+ z2 = (0.00 staff_space, -0.35 staff_space);
+
+ fill get_subpath (ellipse, up, down, z1)
+ -- get_subpath (ellipse, down, up, z2)
+ -- cycle;
+
+ pickup penrazor scaled 0.22 staff_space
+ rotated 90;
+
+ z3 = (0.00 staff_space, -0.30 staff_space);
+ z4 = (0.40 staff_space, -0.08 staff_space);
+
+ draw z3
+ -- z4;
+
+ addto currentpicture also currentpicture
+ xscaled -1
+ yscaled -1
+ shifted (0.40 staff_space, 0.0 staff_space);
+
+ set_char_box (0.00 staff_space# + 0.40 linethickness#,
+ 0.40 staff_space# + 0.40 linethickness#,
+ 0.65 staff_space# + 0.11 staff_space#,
+ 0.65 staff_space# + 0.11 staff_space#);
+
+ labels (1, 2, 3, 4);
+fet_endchar;
+
+
+%%%%%%%%
+%
+%
+%
+% MENSURAL NOTATION
+%
+%
+%
+fet_beginchar ("Mensural Sharp" , "mensural1");
+ save stemthick;
+
+ define_pixels (stemthick);
+
+ stemthick# = linethickness#;
+
+ save circle, pat, T;
+ path circle, pat;
+ transform T;
+
+ T := identity scaled 0.8 stemthick;
+ pickup pencircle transformed T;
+ circle := fullcircle transformed T;
+
+ z1 = 0.4 staff_space * (0.8, 1);
+ z1 = -z2;
+
+ pat := get_subpath (circle, z1 - z2, z2 - z1, z1)
+ -- get_subpath (circle, z2 - z1, z1 - z2, z2)
+ -- cycle;
+
+ fill pat;
+ fill pat xscaled -1;
+ fill pat shifted (0.20 staff_space, 0);
+ fill pat xscaled -1 shifted (0.20 staff_space, 0);
+
+ set_char_box (0.8 * 0.4 staff_space# + 0.4 stemthick#,
+ (0.8 * 0.4 + 0.2) * staff_space# + 0.4 stemthick#,
+ 0.4 staff_space# + 0.4 stemthick#,
+ 0.4 staff_space# + 0.4 stemthick#);
+
+ labels (1, 2);
+fet_endchar;
+
+
+fet_beginchar ("Mensural Flat" , "mensuralM1");
+ save stemthick;
+
+ define_pixels (stemthick);
+
+ stemthick# = linethickness#;
+
+ save ellipse, pat, outline, T;
+ path ellipse, pat, outline;
+ transform T;
+
+ T := identity xscaled 1.4 stemthick
+ yscaled 0.6 stemthick
+ rotated 45;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ z1 = (0.00 staff_space, +1.80 staff_space);
+ z2 = (0.00 staff_space, -0.25 staff_space);
+ z3 = (0.35 staff_space, -0.25 staff_space);
+ z4 = (0.35 staff_space, +0.25 staff_space);
+ z5 = (0.00 staff_space, +0.25 staff_space);
+
+ pat := z2
+ .. z3
+ .. z4
+ .. z5;
+
+ save dirs, s;
+ pair dirs[];
+
+ s := 1/4;
+
+ % we approximate `draw pat'
+ for i = 2 step s until (length pat + 2):
+ dirs[i] := direction (i - 2) of pat;
+ endfor;
+
+ outline := get_subpath (ellipse, up, down, z1)
+ -- get_subpath (ellipse, down, dirs2, z2)
+ for i = (2 + s) step s until (length pat + 2 - s):
+ .. get_subpoint (ellipse, dirs[i],
+ point (i - 2) of pat)
+ endfor
+ .. top z5
+ -- bot z5
+ for i = (length pat + 2 - s) step -s until 2:
+ .. get_subpoint (ellipse, -dirs[i],
+ point (i - 2) of pat)
+ endfor
+ -- get_subpoint (ellipse, up, z2)
+ -- cycle;
+
+ fill outline;
+
+ set_char_box (0.00 staff_space# + 0.75 stemthick#,
+ 0.40 staff_space# + 0.75 stemthick#,
+ 0.25 staff_space# + 0.75 stemthick#,
+ 1.80 staff_space# + 0.75 stemthick#);
+
+ labels (1, 2, 3, 4, 5);
+fet_endchar;
+
+
+fet_beginchar ("Hufnagel Flat" , "hufnagelM1");
+ save stemthick;
+
+ define_pixels (stemthick);
+
+ stemthick# = linethickness#;
+
+ save ellipse, pat, T;
+ path ellipse, pat;
+ transform T;
+
+ T := identity xscaled 2.4 stemthick
+ yscaled 0.4 stemthick
+ rotated 45;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ z1 = (0.00 staff_space, +1.80 staff_space);
+ z2 = (0.00 staff_space, -0.15 staff_space);
+ z3 = (0.25 staff_space, -0.30 staff_space);
+ z4 = (0.50 staff_space, +0.00 staff_space);
+ z5 = (0.30 staff_space, +0.30 staff_space);
+ z6 = (0.00 staff_space, +0.15 staff_space);
+
+ pat := z3
+ .. z4
+ .. z5;
+
+ save t;
+ numeric t[];
+
+ % we have to find the envelope intersections (if any)
+ t1 = find_envelope_cusp (reverse ellipse, pat, 1/256) + 3;
+ if t1 < 3:
+ t1 := 3;
+ fi;
+ t2 = find_envelope_cusp (ellipse, reverse pat, 1/256);
+ if t2 < 0:
+ t2 := 3;
+ else:
+ t2 := length pat - t2 + 3;
+ fi;
+
+ save dirs, s;
+ pair dirs[];
+
+ s := 1/8;
+
+ % we approximate `draw pat'
+ for i = 3 step s until 5:
+ dirs[i] := direction (i - 3) of pat;
+ endfor;
+
+ fill get_subpath (ellipse, up, down, z1)
+ -- get_subpath (ellipse, down, z3 - z2, z2)
+ -- get_subpoint (ellipse, z3 - z2, z3)
+ for i = 3 step s until 5:
+ .. get_subpoint (ellipse, dirs[i],
+ point (i - 3) of pat)
+ endfor
+ .. get_subpoint (ellipse, z6 - z5, z5)
+ -- get_subpoint (ellipse, z6 - z5, z6)
+ -- get_subpoint (ellipse, z5 - z6, z6)
+ -- get_subpoint (ellipse, z5 - z6, z5)
+ -- get_subpoint (ellipse, -dirs[5], z5)
+ for i = (5 - s) step -s until t2:
+ .. get_subpoint (ellipse, -dirs[i],
+ point (i - 3) of pat)
+ endfor
+ .. get_subpoint (ellipse, -direction (t2 - 3) of pat,
+ point (t2 - 3) of pat)
+ -- get_subpoint (ellipse, -direction (t1 - 3) of pat,
+ point (t1 - 3) of pat)
+ for i = (floor ((t1 - 3) / s) * s + 3) step -s until (3 + s):
+ .. get_subpoint (ellipse, -dirs[i],
+ point (i - 3) of pat)
+ endfor
+ .. get_subpoint (ellipse, -dirs[3], z3)
+ -- get_subpoint (ellipse, z2 - z3, z3)
+ -- get_subpoint (ellipse, z2 - z3, z2)
+ -- get_subpoint (ellipse, up, z2)
+ -- cycle;
+
+% draw z1
+% -- z2
+% -- pat
+% -- z6;
+
+ set_char_box (0.00 staff_space# + 1.0 stemthick#,
+ 0.50 staff_space# + 1.0 stemthick#,
+ 0.30 staff_space# + 0.5 stemthick#,
+ 1.80 staff_space# + 0.5 stemthick#);
+
+ labels (1, 2, 3, 4, 5, 6);
+fet_endchar;
+
+
+fet_endgroup ("accidentals");
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan-clefs.mf b/muse2/share/scoreglyphs/feta-original/parmesan-clefs.mf
new file mode 100644
index 00000000..afd5058e
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan-clefs.mf
@@ -0,0 +1,1693 @@
+% -%-Fundamental-%- -*-Metafont-*-
+% parmesan-clefs.mf -- implement ancient clefs
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+
+fet_begingroup ("clefs");
+
+%
+% character aligment:
+%
+% Each clef is associated with a particular pitch: the treble clef
+% with the `g', the alto clef with the `c', the bass clef with the
+% `f', etc. The shape of each clef character defines a vertical
+% position that is assumed to represent this pitch. For the treble
+% clef, it is the vertical position of the center of the spiral
+% ending that represents the `g' pitch. For the bass clef, it is
+% the center between the two fat dots that define the vertical
+% position of the `f' pitch. For the alto clef, it is the vertical
+% center of the clef that is aligned with the `c' pitch. For each
+% clef character, this center should be vertically aligned with the
+% point (0, 0). The horizontal alignment of each clef character
+% should be such that the vertical line through the point (0, 0)
+% touches the left-most edge of the clef.
+%
+% TODO: document exact_center
+%
+% set_char_box() conventions:
+%
+% * breapth: Ignored (as far as I know). Should be set to 0.
+%
+% * width: Should match the clef's width.
+%
+% * depth: Should match the bottom edge of the clef. Affects vertical
+% collision handling.
+%
+% * height: Should match the top edge of the clef. Affects vertical
+% collision handling.
+%
+
+
+%%%%%%%%
+%
+%
+%
+% Editio Vaticana
+%
+%
+%
+def draw_vaticana_do_clef (expr exact_center, reduction) =
+ save reduced_il;
+
+ reduced_il# = staff_space# * reduction;
+
+ set_char_box (0 - xpart exact_center,
+ 0.5 reduced_il# + xpart exact_center,
+ 0.8 reduced_il# - ypart exact_center,
+ 0.8 reduced_il# + ypart exact_center);
+
+ define_pixels (reduced_il);
+
+ save pat, ellipse, clef, T;
+ path pat, ellipse, clef;
+ transform T;
+
+ T := identity xscaled 0.6 linethickness
+ yscaled 0.6 reduced_il;
+ pickup pencircle transformed T;
+ ellipse := reverse fullcircle transformed T;
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ rt z11 = (xoffs + 0.50 reduced_il, yoffs - .45 reduced_il);
+ z12 = (xoffs + 0.25 reduced_il, yoffs - .50 reduced_il);
+ lft z13 = (xoffs + 0.00 reduced_il, yoffs - .28 reduced_il);
+ lft z14 = (xoffs, yoffs);
+
+ pat := z11
+ .. z12
+ .. z13
+ -- z14;
+
+ save shift;
+ pair shift;
+
+ % adjust vertically to fit into bounding box
+ shift = find_tangent_shift (((0, -d + 0.3 reduced_il)
+ -- (w, -d + 0.3 reduced_il)), pat,
+ (0, -d / 2), (0, d / 2));
+ pat := pat shifted shift;
+
+ clef := rt z14{down}
+ .. top (point 1 of pat)
+ .. get_subpath (ellipse,
+ -direction 0 of pat, direction 0 of pat,
+ point 0 of pat)
+ .. bot (point 1 of pat)
+ .. get_subpath (ellipse,
+ direction 2 of pat, up,
+ point 2 of pat);
+
+ fill clef
+ -- reverse clef yscaled -1
+ -- cycle;
+
+ labels (11, 12, 13, 14);
+enddef;
+
+
+fet_beginchar ("Ed. Vat. do clef", "vaticana.do");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_vaticana_do_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("Ed. Vat. do clef", "vaticana.do_change");
+ draw_vaticana_do_clef ((0, 0), 1.0); % no reduction
+fet_endchar;
+
+
+def draw_vaticana_fa_clef (expr exact_center, reduction) =
+ save reduced_il, xoffs, yoffs;
+
+ reduced_il# = staff_space# * reduction;
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (reduced_il, xoffs, yoffs);
+
+ % left-handed punctum
+ save ellipse, pat, T;
+ path ellipse, pat;
+ transform T;
+
+ T := identity xscaled 0.6 linethickness
+ yscaled 0.5 reduced_il;
+ pickup pencircle transformed T;
+ ellipse := reverse fullcircle transformed T;
+
+ lft z21 = (xoffs + 0.00 reduced_il, yoffs + 0.00 reduced_il);
+ z22 = (xoffs + 0.25 reduced_il, yoffs + 0.05 reduced_il);
+ rt z23 = (xoffs + 0.50 reduced_il, yoffs - 0.05 reduced_il);
+
+ pat := z21
+ .. z22
+ .. z23;
+
+ fill get_subpath (ellipse,
+ -direction 0 of pat, direction 0 of pat, z21)
+ .. top z22
+ .. get_subpath (ellipse,
+ direction 2 of pat, -direction 2 of pat, z23)
+ .. bot z22
+ .. cycle;
+
+ % stem
+ pickup pencircle scaled 0.6 linethickness;
+
+ x23 = x24;
+ yoffs = bot y24 + 1.5 reduced_il;
+
+ draw_rounded_block (bot lft z24, top rt z23, 0.6 linethickness);
+
+ labels (21, 22, 23, 24);
+
+ % right-handed puncta as in do clef
+ draw_vaticana_do_clef (exact_center + (0.55 reduced_il#, 0),
+ reduction);
+
+ set_char_box (0 - xpart exact_center,
+ 1.05 reduced_il# + xpart exact_center,
+ 1.5 reduced_il# - ypart exact_center,
+ 0.8 reduced_il# + ypart exact_center);
+enddef;
+
+
+fet_beginchar ("Ed. Vat. fa clef", "vaticana.fa");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_vaticana_fa_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("Ed. Vat. fa clef", "vaticana.fa_change");
+ draw_vaticana_fa_clef ((0, 0), 1.0); % no reduction
+fet_endchar;
+
+
+%%%%%%%%
+%
+%
+%
+% Editio Medicaea
+%
+%
+%
+def draw_medicaea_do_clef (expr exact_center, reduction) =
+ save reduced_il, reduced_slt;
+
+ reduced_il# = staff_space# * reduction;
+ reduced_slt# = linethickness# * reduction;
+
+ define_pixels (reduced_il);
+ define_pixels (reduced_slt);
+
+ set_char_box (0 - xpart exact_center,
+ 1.0 reduced_il# + xpart exact_center,
+ 1.5 reduced_il# - ypart exact_center,
+ 1.5 reduced_il# + ypart exact_center);
+
+ save flag_height;
+
+ flag_height# = 0.5 reduced_il#;
+
+ define_pixels (flag_height);
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ % flags
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled reduced_slt
+ yscaled flag_height;
+ pickup pencircle transformed T;
+ ellipse := reverse fullcircle transformed T;
+
+ xoffs = lft x1 = rt x2 - reduced_il;
+ y1 = yoffs + 0.5 (reduced_il - flag_height - staff_space);
+ y2 = y1 - reduced_il + flag_height;
+
+ fill top z1
+ -- get_subpath (ellipse, z2 - z1, z1 - z2, z2)
+ -- bot z1
+ -- cycle;
+
+ xoffs = lft x3 = rt x4 - reduced_il;
+ y3 = yoffs + 0.5 (reduced_il - flag_height + staff_space);
+ y4 = y3 - reduced_il + flag_height;
+
+ fill top z3
+ -- get_subpath (ellipse, z4 - z3, z3 - z4, z4)
+ -- bot z3
+ -- cycle;
+
+ % stem
+ pickup pencircle scaled reduced_slt;
+
+ lft x5 = lft x6 = xoffs;
+ yoffs = top y6 - 1.5 reduced_il = bot y5 + 1.5 reduced_il;
+
+ draw_rounded_block (bot lft z5, top rt z6, reduced_slt);
+
+ labels (1, 2, 3, 4, 5, 6);
+enddef;
+
+
+fet_beginchar ("Ed. Med. do clef", "medicaea.do");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_medicaea_do_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("Ed. Med. do clef", "medicaea.do_change");
+ draw_medicaea_do_clef ((0, 0), .8);
+fet_endchar;
+
+
+def draw_medicaea_fa_clef (expr exact_center, reduction) =
+ % inspired by Regensburger Edition of Medicaea (1885/86), in:
+ % MGG, volume 2, col. 1327 ("Choralreform"), fig. 2.
+
+ save reduced_il, reduced_slt;
+
+ reduced_il# = staff_space# * reduction;
+ reduced_slt# = linethickness# * reduction;
+
+ define_pixels (reduced_il);
+ define_pixels (reduced_slt);
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ % stem
+ pickup pencircle scaled reduced_slt;
+
+ x11 = x12 = xoffs + 0.4 reduced_il;
+ y11 = yoffs = bot y12 + 1.5 reduced_il;
+
+ draw_rounded_block (bot lft z12, top rt z11, reduced_slt);
+
+ % left-handed punctum
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled reduced_slt
+ yscaled reduced_il;
+ pickup pencircle transformed T;
+ ellipse := reverse fullcircle transformed T;
+
+ lft z13 = (xoffs, yoffs);
+ rt z14 = z11 + (reduced_slt / 2, 0);
+
+ fill get_subpath (ellipse, left, right, z13)
+ -- get_subpath (ellipse, right, left, z14)
+ -- cycle;
+
+ labels (11, 12, 13, 14);
+
+ % right-handed puncta as in do clef
+ draw_medicaea_do_clef (exact_center + (0.7 reduced_il#, 0),
+ reduction);
+
+ set_char_box (0 - xpart exact_center,
+ 1.7 reduced_il# + xpart exact_center,
+ 1.5 reduced_il# - ypart exact_center,
+ 1.5 reduced_il# + ypart exact_center);
+enddef;
+
+
+fet_beginchar ("Ed. Med. fa clef", "medicaea.fa");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_medicaea_fa_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("Ed. Med. fa clef", "medicaea.fa_change");
+ draw_medicaea_fa_clef ((0, 0), .8);
+fet_endchar;
+
+
+%%%%%%%%
+%
+%
+%
+% Mensural Notation
+%
+%
+%
+
+%
+% width: interval from left end to right end
+% height: interval from bottom of lower beam to top of upper beam
+% exact_center: the coordinates of the vertical center point of the
+% left edge.
+%
+def draw_brevis (expr exact_center, bwidth, bheight, blinethickness) =
+ save brevis_width, brevis_height, linethickness;
+
+ brevis_width# = bwidth;
+ brevis_height# = bheight;
+ linethickness# = blinethickness;
+
+ save beam_width, beam_height;
+ save serif_size, serif_protrude, hole_height;
+
+ beam_width# = 1.4 linethickness#;
+ hole_height# = 3 linethickness#;
+ 2 beam_height# + hole_height# = brevis_height#;
+ serif_size# = (hole_height# - linethickness#) / 2;
+ serif_protrude# = 1.5 serif_size#;
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+ define_pixels (brevis_width, brevis_height, linethickness);
+ define_pixels (beam_width, beam_height, serif_size, serif_protrude);
+
+ z1l = (xoffs, yoffs - linethickness);
+ z2r = z1r + serif_size * (1, -1);
+ z3l = z2l + (-serif_size, -serif_protrude);
+
+ penpos1 (beam_width, 0);
+ penpos2 (beam_height, 90);
+ penpos3 (beam_width, 180);
+
+ save pat_in, pat_out;
+ path pat_in, pat_out;
+
+ pat_out := z3r{down}
+ .. z3l{up}
+ .. z2l{right};
+ pat_out := pat_out
+ -- reverse pat_out xscaled -1
+ shifted (2 xoffs + brevis_width, 0);
+ pat_out := pat_out
+ -- reverse pat_out yscaled -1
+ shifted (0, 2 yoffs)
+ -- cycle;
+
+ pat_in := z1r{down}
+ .. z2r{right};
+ pat_in := pat_in
+ -- reverse pat_in xscaled -1
+ shifted (2 xoffs + brevis_width, 0);
+ pat_in := pat_in
+ -- reverse pat_in yscaled -1
+ shifted (0, 2 yoffs)
+ -- cycle;
+
+ fill pat_out;
+ unfill pat_in;
+
+ penlabels (1, 2, 3);
+enddef;
+
+%
+% Draw two brevis notes; the second one shifted down by `shift'.
+% The other parameters are the same as with `draw_brevis'.
+%
+def draw_double_brevis (expr exact_center, bwidth, bheight,
+ blinethickness, shift) =
+ save brevis_width, brevis_height, linethickness;
+
+ brevis_width# = bwidth;
+ brevis_height# = bheight;
+ linethickness# = blinethickness;
+
+ save beam_width, beam_height;
+ save serif_size, serif_protrude, hole_height;
+
+ beam_width# = 1.4 linethickness#;
+ hole_height# = 3 linethickness#;
+ 2 beam_height# + hole_height# = brevis_height#;
+ serif_size# = (hole_height# - linethickness#) / 2;
+ serif_protrude# = 1.5 serif_size#;
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+ define_pixels (brevis_width, brevis_height, linethickness);
+ define_pixels (beam_width, beam_height, serif_size, serif_protrude);
+
+ z1l = (xoffs, yoffs - linethickness);
+ z2r = z1r + serif_size * (1, -1);
+ z3l = z2l + (-serif_size, -serif_protrude);
+
+ penpos1 (beam_width, 0);
+ penpos2 (beam_height, 90);
+ penpos3 (beam_width, 180);
+
+ z4 = z1 shifted (0, -shift);
+ z5 = z2 shifted (0, -shift);
+ z6 = z3 shifted (0, -shift);
+
+ penpos4 (beam_width, 0);
+ penpos5 (beam_height, 90);
+ penpos6 (beam_width, 180);
+
+ save pat_in, pat_out;
+ path pat_in, pat_out;
+
+ pat_out := z6r{down}
+ .. z6l{up}
+ .. z5l{right};
+ pat_out := pat_out
+ -- reverse pat_out xscaled -1
+ shifted (2 xoffs + brevis_width, 0);
+ pat_out := pat_out
+ -- reverse pat_out yscaled -1
+ shifted (0, shift - 2 yoffs)
+ -- cycle;
+
+ fill pat_out;
+
+ pat_in := z1r{down}
+ .. z2r{right};
+ pat_in := pat_in
+ -- reverse pat_in xscaled -1
+ shifted (2 xoffs + brevis_width, 0);
+ pat_in := pat_in
+ -- reverse pat_in yscaled -1
+ shifted (0, 2 yoffs)
+ -- cycle;
+
+ unfill pat_in;
+ unfill pat_in shifted (0, -shift);
+
+ penlabels (1, 2, 3, 4, 5, 6);
+enddef;
+
+
+%
+% Draw three brevis notes; the second one shifted down by `shift',
+% the third one by `2 shift'.
+% The other parameters are the same as with `draw_brevis'.
+%
+def draw_triple_brevis (expr exact_center, bwidth, bheight,
+ blinethickness, shift) =
+ save brevis_width, brevis_height, linethickness;
+
+ brevis_width# = bwidth;
+ brevis_height# = bheight;
+ linethickness# = blinethickness;
+
+ save beam_width, beam_height;
+ save serif_size, serif_protrude, hole_height;
+
+ beam_width# = 1.4 linethickness#;
+ hole_height# = 3 linethickness#;
+ 2 beam_height# + hole_height# = brevis_height#;
+ serif_size# = (hole_height# - linethickness#) / 2;
+ serif_protrude# = 1.5 serif_size#;
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+ define_pixels (brevis_width, brevis_height, linethickness);
+ define_pixels (beam_width, beam_height, serif_size, serif_protrude);
+
+ z1l = (xoffs, yoffs - linethickness);
+ z2r = z1r + serif_size * (1, -1);
+ z3l = z2l + (-serif_size, -serif_protrude);
+
+ penpos1 (beam_width, 0);
+ penpos2 (beam_height, 90);
+ penpos3 (beam_width, 180);
+
+ z7 = z1 shifted (0, -2 shift);
+ z8 = z2 shifted (0, -2 shift);
+ z9 = z3 shifted (0, -2 shift);
+
+ penpos7 (beam_width, 0);
+ penpos8 (beam_height, 90);
+ penpos9 (beam_width, 180);
+
+ save pat_in, pat_out;
+ path pat_in, pat_out;
+
+ pat_out := z9r{down}
+ .. z9l{up}
+ .. z8l{right};
+ pat_out := pat_out
+ -- reverse pat_out xscaled -1
+ shifted (2 xoffs + brevis_width, 0);
+ pat_out := pat_out
+ -- reverse pat_out yscaled -1
+ shifted (0, -2 yoffs)
+ -- cycle;
+
+ fill pat_out;
+
+ pat_in := z1r{down}
+ .. z2r{right};
+ pat_in := pat_in
+ -- reverse pat_in xscaled -1
+ shifted (2 xoffs + brevis_width, 0);
+ pat_in := pat_in
+ -- reverse pat_in yscaled -1
+ shifted (0, 2 yoffs)
+ -- cycle;
+
+ unfill pat_in;
+ unfill pat_in shifted (0, -shift);
+ unfill pat_in shifted (0, -2 shift);
+
+ penlabels (1, 2, 3, 7, 8, 9);
+enddef;
+
+
+def draw_neomensural_c_clef (expr exact_center, reduction) =
+ save reduced_il, reduced_slt, stem_width;
+
+ reduced_il# = staff_space# * reduction;
+ reduced_slt# = linethickness# * reduction;
+ stem_width# = 1.4 reduced_slt#;
+
+ define_pixels (reduced_il, reduced_slt, stem_width);
+
+ set_char_box (0 - xpart exact_center,
+ 2 reduced_il# + 6 reduced_slt# + xpart exact_center,
+ 2 reduced_il# - ypart exact_center,
+ 2 reduced_il# + ypart exact_center);
+
+ draw_brevis (exact_center + (3 reduced_slt#, 0),
+ 2 reduced_il#, reduced_il#, reduced_slt#);
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ save ellipse, pat, T;
+ path ellipse, pat;
+ transform T;
+
+ T := identity xscaled stem_width
+ yscaled blot_diameter;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ lft x11 = lft x12 = xoffs;
+ top y12 - bot y11 = 4 reduced_il;
+ top y12 + bot y11 = 2 yoffs;
+ x13 = x3;
+ y13 = y11;
+ rt x14 = rt x15 = w;
+ y14 = y11;
+ y15 = y12;
+
+ pat := get_subpath (ellipse, down, up, z13)
+ -- z3l
+ -- z3r
+ -- cycle;
+
+ fill get_subpath (ellipse, down, up, z11)
+ -- get_subpath (ellipse, up, down, z12)
+ -- cycle;
+ fill get_subpath (ellipse, down, up, z14)
+ -- get_subpath (ellipse, up, down, z15)
+ -- cycle;
+
+ fill pat;
+ fill pat xscaled -1
+ shifted (w, 0);
+ fill pat yscaled -1
+ shifted (0, 2 yoffs);
+ fill pat scaled -1
+ shifted (w, 2 yoffs);
+
+ labels (11, 12, 13, 14, 15);
+enddef;
+
+
+fet_beginchar ("neo-mensural c clef", "neomensural.c");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_neomensural_c_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("neo-mensural c clef", "neomensural.c_change");
+ draw_neomensural_c_clef ((0, 0), .8);
+fet_endchar;
+
+
+def draw_petrucci_c_clef (expr exact_center, flare_align, reduction) =
+ % inspired by Josquin Desprez, "Stabat Mater", Libro tertio,
+ % 1519, printed by Petrucci, in: MGG, volume 7, Table 11.
+ % Also by Petrucci's Canti C, Venedig 1503. In: MGG, volume
+ % 9, p. 1681/1682.
+
+ save reduced_il, reduced_slt;
+
+ reduced_il# = staff_space# * reduction;
+ reduced_slt# = linethickness# * reduction;
+
+ define_pixels (reduced_il);
+
+ draw_double_brevis (exact_center + (0, 0.5 staff_space#),
+ reduced_il#, reduced_il#, reduced_slt#,
+ staff_space);
+
+ save half_reduced_il, left_depth, left_height;
+
+ half_reduced_il# = staff_space# * sqrt (reduction);
+ left_height# = half_reduced_il# * min (3.2, 3.2 + 0.2 + flare_align);
+ left_depth# = half_reduced_il# * min (3.2, 3.2 + 0.2 - flare_align);
+
+ define_pixels (half_reduced_il);
+ define_pixels (left_depth, left_height);
+
+ set_char_box (0 - xpart exact_center,
+ reduced_il# + xpart exact_center,
+ left_depth# - ypart exact_center,
+ left_height# + ypart exact_center);
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled 1.4 linethickness
+ yscaled blot_diameter;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ lft x11 = lft x13 = xoffs;
+ top y11 = yoffs + left_height;
+ bot y13 = yoffs - left_depth;
+ rt x15 = rt x17 = xoffs + brevis_width;
+ y15 = min (y11 - 0.2 half_reduced_il, yoffs + 2.2 half_reduced_il);
+ y17 = max (y13 + 0.2 half_reduced_il, yoffs - 2.2 half_reduced_il);
+
+ z12 = z14 yscaled -1;
+ z14 = z6;
+ z16 = z18 yscaled -1;
+ rt z18 = lft z14 shifted (brevis_width, 0);
+
+ penpos12 (1.4 linethickness, 0);
+ penpos14 (1.4 linethickness, 0);
+ penpos16 (1.4 linethickness, 0);
+ penpos18 (1.4 linethickness, 0);
+
+ if top y11 > -y6 + 0.7 linethickness:
+ fill get_subpath (ellipse, up, down, z11)
+ -- z12l
+ -- z12r
+ -- cycle;
+ fi;
+ if bot y13 < y6 - 0.7 linethickness:
+ fill get_subpath (ellipse, down, up, z13)
+ -- z14r
+ -- z14l
+ -- cycle;
+ fi;
+ if top y15 > -y6 + 0.7 linethickness:
+ fill get_subpath (ellipse, up, down, z15)
+ -- z16l
+ -- z16r
+ -- cycle;
+ fi;
+ if bot y17 < y6 - 0.7 linethickness:
+ fill get_subpath (ellipse, down, up, z17)
+ -- z18r
+ -- z18l
+ -- cycle;
+ fi;
+
+ labels (11, 13, 15, 17);
+ penlabels (12, 14, 16, 18);
+enddef;
+
+
+fet_beginchar ("petrucci c1 clef", "petrucci.c1");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_petrucci_c_clef ((0, 0), +2, 1.0);
+fet_endchar;
+
+
+fet_beginchar ("petrucci c1 clef", "petrucci.c1_change");
+ draw_petrucci_c_clef ((0, 0), +2, .8);
+fet_endchar;
+
+
+fet_beginchar ("petrucci c2 clef", "petrucci.c2");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_petrucci_c_clef ((0, 0), +1, 1.0);
+fet_endchar;
+
+
+fet_beginchar ("petrucci c2 clef", "petrucci.c2_change");
+ draw_petrucci_c_clef ((0, 0), +1, .8);
+fet_endchar;
+
+
+fet_beginchar ("petrucci c3 clef", "petrucci.c3");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_petrucci_c_clef ((0, 0), 0, 1.0);
+fet_endchar;
+
+
+fet_beginchar ("petrucci c3 clef", "petrucci.c3_change");
+ draw_petrucci_c_clef ((0, 0), 0, .8);
+fet_endchar;
+
+
+fet_beginchar ("petrucci c4 clef", "petrucci.c4");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_petrucci_c_clef ((0, 0), -1, 1.0);
+fet_endchar;
+
+
+fet_beginchar ("petrucci c4 clef", "petrucci.c4_change");
+ draw_petrucci_c_clef ((0, 0), -1, .8);
+fet_endchar;
+
+
+fet_beginchar ("petrucci c5 clef", "petrucci.c5");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_petrucci_c_clef ((0, 0), -2, 1.0);
+fet_endchar;
+
+
+fet_beginchar ("petrucci c5 clef", "petrucci.c5_change");
+ draw_petrucci_c_clef ((0, 0), -2, .8);
+fet_endchar;
+
+
+def draw_mensural_c_clef (expr exact_center, reduction) =
+ % inspired by Ockeghem, "Missa Prolationum", in: MGG, volume
+ % 9, table 94.
+
+ save reduced_il;
+
+ reduced_il# = staff_space# * reduction;
+
+ define_pixels (reduced_il);
+
+ draw_triple_brevis (exact_center + (0, 0.5 staff_space#),
+ 2 reduced_il#, 0.8 staff_space#,
+ 0.8 linethickness#, staff_space);
+
+ save half_reduced_il;
+
+ half_reduced_il# = staff_space# * sqrt (reduction);
+
+ define_pixels (half_reduced_il);
+
+ set_char_box (0 - xpart exact_center,
+ 2 reduced_il# + xpart exact_center,
+ 2.2 half_reduced_il# + staff_space# -
+ 2 ypart exact_center,
+ 2.2 half_reduced_il# + 2 ypart exact_center);
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled 1.4 linethickness
+ yscaled blot_diameter;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ lft x11 = lft x13 = xoffs;
+ top y11 = yoffs + 2.2 half_reduced_il;
+ bot y13 = yoffs - 2.2 half_reduced_il - staff_space;
+ rt x15 = rt x17 = xoffs + brevis_width;
+ y15 = yoffs + 1.4 half_reduced_il;
+ y17 = yoffs - 1.4 half_reduced_il - staff_space;
+
+ z12 = z14 yscaled -1 shifted (0, -staff_space);
+ z14 = z9;
+ z16 = z18 yscaled -1 shifted (0, -staff_space);
+ rt z18 = lft z14 shifted (brevis_width, 0);
+
+ penpos12 (1.4 linethickness, 0);
+ penpos14 (1.4 linethickness, 0);
+ penpos16 (1.4 linethickness, 0);
+ penpos18 (1.4 linethickness, 0);
+
+ fill get_subpath (ellipse, up, down, z11)
+ -- z12l
+ -- z12r
+ -- cycle;
+ fill get_subpath (ellipse, down, up, z13)
+ -- z14r
+ -- z14l
+ -- cycle;
+ fill get_subpath (ellipse, up, down, z15)
+ -- z16l
+ -- z16r
+ -- cycle;
+ fill get_subpath (ellipse, down, up, z17)
+ -- z18r
+ -- z18l
+ -- cycle;
+
+ labels (11, 13, 15, 17);
+ penlabels (12, 14, 16, 18);
+enddef;
+
+
+fet_beginchar ("mensural c clef", "mensural.c");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_mensural_c_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("mensural c clef", "mensural.c_change");
+ draw_mensural_c_clef ((0, 0), .8);
+fet_endchar;
+
+
+def draw_diamond (expr exact_center, reduction) =
+ save stem_width, reduced_nht, holeheight, beamheight;
+ save rh_height, rh_width;
+
+ stem_width# = 1.4 reduced_slt#;
+ reduced_nht# = noteheight# * reduction;
+ holeheight# = 3 reduced_slt#;
+ beamheight# = 0.4 (reduced_nht# - holeheight#);
+
+ rh_height# = 1.2 staff_space# * reduction;
+ rh_width# / rh_height# = tand (30);
+
+ define_pixels (beamheight, stem_width);
+ define_pixels (rh_height, rh_width);
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled beamheight
+ yscaled stem_width
+ rotated 45;
+ pickup pencircle transformed T;
+ ellipse := reverse fullcircle transformed T;
+
+ x21 := xoffs - rh_width / 2;
+ y21 := yoffs;
+ x22 := xoffs;
+ y22 := yoffs + rh_height / 2;
+ x23 := xoffs + rh_width / 2;
+ y23 := yoffs;
+ x24 := xoffs;
+ y24 := yoffs - rh_height / 2;
+
+ fill get_subpath (ellipse, z21 - z24, z22 - z21, z21)
+ -- get_subpath (ellipse, z22 - z21, z23 - z22, z22)
+ -- get_subpath (ellipse, z23 - z22, z24 - z23, z23)
+ -- get_subpath (ellipse, z24 - z23, z21 - z24, z24)
+ -- cycle;
+
+ save l;
+ path l[];
+
+ l2122 := (directionpoint (z21 - z22) of ellipse) shifted z21
+ -- (directionpoint (z21 - z22) of ellipse) shifted z22;
+ l2223 := (directionpoint (z22 - z23) of ellipse) shifted z22
+ -- (directionpoint (z22 - z23) of ellipse) shifted z23;
+ l2324 := (directionpoint (z23 - z24) of ellipse) shifted z23
+ -- (directionpoint (z23 - z24) of ellipse) shifted z24;
+ l2421 := (directionpoint (z24 - z21) of ellipse) shifted z24
+ -- (directionpoint (z24 - z21) of ellipse) shifted z21;
+
+ unfill l2122 intersectionpoint l2223
+ -- l2223 intersectionpoint l2324
+ -- l2324 intersectionpoint l2421
+ -- l2421 intersectionpoint l2122
+ -- cycle;
+
+ labels (21, 22, 23, 24);
+enddef;
+
+
+def draw_petrucci_f_clef (expr exact_center, reduction) =
+ % inspired by L'homme arme super voces musicales in Misse
+ % Josquin, 1502, Petrucci, in: MGG, volume 7, col. 200; also
+ % inspired by Gaspar van Weerbeke, "Virgo Maria" (1502), in:
+ % MGG, volume 9, col. 653 ("Motette"), fig. 3.; also by Andr'e
+ % Campra, "Entr'ee des s'er'enades" (1710), in: MGG, volume 2,
+ % col. 1649 ("Contredanse"), fig. 2.
+
+ save interline, reduced_il, reduced_slt;
+
+ interline# = staff_space#;
+ reduced_il# = staff_space# * reduction;
+ reduced_slt# = linethickness# * reduction;
+
+ draw_brevis (exact_center, reduced_il#, reduced_il#, reduced_slt#);
+ draw_diamond (exact_center +
+ (1.6 interline# * reduction, interline# / 2),
+ reduction);
+ draw_diamond (exact_center +
+ (1.6 interline# * reduction, -interline# / 2),
+ reduction);
+
+ define_pixels (interline, reduced_il, reduced_slt);
+
+ save stem_width;
+
+ stem_width# = 1.4 reduced_slt#;
+
+ define_pixels (stem_width);
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ % brevis stem
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled stem_width
+ yscaled blot_diameter;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ rt x8 = xoffs + reduced_il;
+ y8 = y3;
+ rt z9 = (xoffs + reduced_il, yoffs - 4 reduced_il);
+
+ penpos8 (stem_width, 0);
+
+ fill get_subpath (ellipse, down, up, z9)
+ -- z8r
+ -- z8l
+ -- cycle;
+
+ % upper diamond's stem
+ z10 = (xoffs + 1.6 interline * reduction + stem_width / 2,
+ yoffs + interline * reduction);
+ top z11 = z10 + (0, 1.5 interline * reduction);
+
+ penpos10 (stem_width, 0);
+
+ fill get_subpath (ellipse, up, down, z11)
+ -- z10l
+ -- z10r
+ -- cycle;
+
+ % lower diamond's stem
+ z12 = (xoffs + 1.6 interline * reduction - stem_width / 2,
+ yoffs - interline * reduction);
+ bot z13 = z12 + (0, -3.5 interline * reduction);
+
+ penpos12 (stem_width, 0);
+
+ fill get_subpath (ellipse, down, up, z13)
+ -- z12r
+ -- z12l
+ -- cycle;
+
+ save reduced_il, rh_height, rh_width;
+
+ reduced_il# = staff_space# * reduction;
+ rh_height# = 1.2 reduced_il#;
+ rh_width# / rh_height# = tand (30);
+
+ set_char_box (0 - xpart exact_center,
+ 1.6 interline# * reduction + 0.5 rh_width# +
+ xpart exact_center,
+ 4.5 interline# * reduction - ypart exact_center,
+ 2.5 interline# * reduction + ypart exact_center);
+
+ labels (9, 11, 13);
+ penlabels (8, 10, 12);
+enddef;
+
+
+fet_beginchar ("petrucci f clef", "petrucci.f");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_petrucci_f_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("petrucci f clef", "petrucci.f_change");
+ draw_petrucci_f_clef ((0, 0), .8);
+fet_endchar;
+
+
+def draw_mensural_f_clef (expr exact_center, reduction) =
+ % inspired by Philippe le Duc, "Dite Signori" (1590), in: MGG,
+ % volume 3, col. 848 ("Duc"); also by John Dowland, "The First
+ % Booke of Songes" (1597), in: MGG, volume 3, col. 721
+ % ("Dowland"), fig. 3.
+
+ save width, reduced_slt, stem_width, dot_diameter;
+
+ width# = 1.2 staff_space# * reduction;
+ reduced_slt# = linethickness# * reduction;
+ stem_width# = 1.4 reduced_slt#;
+ dot_diameter# = 0.1 reduction * staff_space#;
+
+ define_pixels (width, stem_width, staff_space, dot_diameter);
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled 0.2 width
+ yscaled stem_width
+ rotated 45;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ % half circle
+ lft z10 = (0, 0);
+
+ save pat;
+ path pat;
+
+ pat := halfcircle scaled width
+ rotated -90
+ shifted (z10 - (xoffs, yoffs));
+
+ z5 = point 0 of pat;
+ z6 = point 1 of pat;
+ z7 = point 2 of pat;
+ z8 = point 3 of pat;
+ z9 = point 4 of pat;
+
+ save dirs;
+ pair dirs[];
+
+ dirs5 := direction 0 of pat;
+ dirs6 := direction 1 of pat;
+ dirs7 := direction 2 of pat;
+ dirs8 := direction 3 of pat;
+ dirs9 := direction 4 of pat;
+
+ % we approximate `draw pat'
+ fill get_subpath (ellipse, -dirs5, dirs5, z5)
+ .. get_subpoint (ellipse, dirs6, z6)
+ .. get_subpoint (ellipse, dirs7, z7)
+ .. get_subpoint (ellipse, dirs8, z8)
+ .. get_subpath (ellipse, dirs9, -dirs9, z9)
+ .. get_subpoint (ellipse, -dirs8, z8)
+ .. get_subpoint (ellipse, -dirs7, z7)
+ .. get_subpoint (ellipse, -dirs6, z6)
+ .. cycle;
+
+ % upper dot
+ rt x2 = xoffs + width;
+ top y1 = yoffs + 0.5 width;
+ z2 - z1 = (dot_diameter, -dot_diameter);
+
+ fill get_subpath (ellipse, z1 - z2, z2 - z1, z1)
+ -- get_subpath (ellipse, z2 - z1, z1 - z2, z2)
+ -- cycle;
+
+ % lower dot
+ x3 = x1;
+ top y1 - bot y4 = width;
+ z4 - z3 = (dot_diameter, -dot_diameter);
+
+ fill get_subpath (ellipse, z3 - z4, z4 - z3, z3)
+ -- get_subpath (ellipse, z4 - z3, z3 - z4, z4)
+ -- cycle;
+
+ set_char_box (0 - xpart exact_center,
+ width# + xpart exact_center,
+ 0.5 width# - ypart exact_center,
+ 0.5 width# + ypart exact_center);
+
+ labels (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+enddef;
+
+
+fet_beginchar ("mensural f clef", "mensural.f");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_mensural_f_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("mensural f clef", "mensural.f_change");
+ draw_mensural_f_clef ((0, 0), .8);
+fet_endchar;
+
+
+def draw_petrucci_g_clef (expr exact_center, reduction) =
+ % inspired by Josquin Desprez, "Stabat Mater", Libro tertio,
+ % 1519, printed by Petrucci, in: MGG, volume 7, Table 11.
+
+ save reduced_il, reduced_slt;
+
+ reduced_il# = staff_space# * reduction;
+ reduced_slt# = linethickness# * reduction;
+ define_pixels (reduced_il, reduced_slt);
+
+ set_char_box (0 - xpart exact_center,
+ 1.25 reduced_il# + xpart exact_center,
+ 0.65 reduced_il# - ypart exact_center,
+ 3.80 reduced_il# + ypart exact_center);
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ save ellipse, paths, sub_path, outlines, sub_outlines, T;
+ path ellipse, paths[], sub_path, outlines[], sub_outlines[];
+ transform T;
+
+ T := identity xscaled 0.5 reduced_slt
+ yscaled 0.22 reduced_il
+ rotated -35;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ lft z1 = (xoffs + 0.80 reduced_il, yoffs + 0.00 reduced_il);
+ lft z2 = (xoffs + 1.00 reduced_il, yoffs + 1.20 reduced_il);
+ lft z3 = (xoffs + 0.70 reduced_il, yoffs + 2.00 reduced_il);
+ lft z4 = (xoffs + 0.30 reduced_il, yoffs + 3.00 reduced_il);
+ lft z5 = (xoffs + 0.80 reduced_il, yoffs + 3.70 reduced_il);
+ lft z6 = (xoffs + 1.00 reduced_il, yoffs + 3.00 reduced_il);
+ lft z7 = (xoffs + 0.60 reduced_il, yoffs + 2.00 reduced_il);
+ lft z8 = (xoffs + 0.30 reduced_il, yoffs + 1.70 reduced_il);
+ lft z9 = (xoffs + 0.00 reduced_il, yoffs + 0.75 reduced_il);
+ lft z10 = (xoffs + 0.20 reduced_il, yoffs + 0.60 reduced_il);
+
+ paths1 := z1{-1, 2}
+ .. z2
+ .. z3
+ .. z4
+ .. z5
+ .. z6
+ .. z7
+ .. z8
+ .. z9
+ .. z10;
+
+ save dirs, s;
+ pair dirs[];
+
+ s := 1/4;
+
+ % we approximate `draw paths1'
+ for i = 1 step s until (length paths1 + 1):
+ dirs[i] := direction (i - 1) of paths1;
+ endfor;
+
+ outlines1 := get_subpath (ellipse, -dirs1, dirs1, z1)
+ for i = (1 + s) step s until (length paths1 + 1 - s):
+ .. get_subpoint (ellipse, dirs[i],
+ point (i - 1) of paths1)
+ endfor
+ .. get_subpath (ellipse, dirs10, -dirs10, z10)
+ for i = (length paths1 + 1 - s) step -s until (1 + s):
+ .. get_subpoint (ellipse, -dirs[i],
+ point (i - 1) of paths1)
+ endfor
+ .. cycle;
+
+ save len;
+
+ len := length outlines1;
+
+ sub_outlines1 := subpath (0,
+ floor (1/4 len)) of outlines1;
+ sub_outlines2 := subpath (floor (1/4 len),
+ floor (2/4 len)) of outlines1;
+ sub_outlines3 := subpath (floor (2/4 len),
+ floor (3/4 len)) of outlines1;
+ sub_outlines4 := subpath (floor (3/4 len),
+ len) of outlines1;
+
+ save times;
+ numeric times[];
+
+ (times12, times21) = sub_outlines1 intersectiontimes sub_outlines2;
+ (times13, times31) = sub_outlines1 intersectiontimes sub_outlines3;
+ (times42, times24) = sub_outlines4 intersectiontimes sub_outlines2;
+ (times43, times34) = sub_outlines4 intersectiontimes sub_outlines3;
+
+ T := identity xscaled 0.75 reduced_slt
+ yscaled 0.33 reduced_il
+ rotated -35;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ lft z21 = (xoffs + 1.05 reduced_il, yoffs + 0.45 reduced_il);
+ lft z22 = (xoffs + 0.55 reduced_il, yoffs + 0.45 reduced_il);
+ lft z23 = (xoffs + 0.55 reduced_il, yoffs - 0.45 reduced_il);
+ lft z24 = (xoffs + 1.05 reduced_il, yoffs - 0.45 reduced_il);
+ lft z25 = (xoffs + 1.10 reduced_il, yoffs + 0.00 reduced_il);
+ lft z26 = (xoffs + 0.80 reduced_il, yoffs + 0.00 reduced_il);
+
+ paths2 := z21
+ .. z22
+ .. z23
+ .. z24
+ .. {up}z25
+ -- z26;
+
+ sub_path := subpath (0, 1) of paths2;
+
+ times1 = xpart (sub_outlines1 intersectiontimes sub_path);
+ times4 = xpart (sub_outlines4 intersectiontimes sub_path);
+
+ % we have to find the envelope intersections (if any)
+ save t;
+ numeric t[];
+
+ t1 = find_envelope_cusp (reverse ellipse,
+ subpath (1, 2) of paths2,
+ 1/256) + 1;
+ if t1 < 1:
+ t1 := 1;
+ t2 := 1;
+ else:
+ t2 = find_envelope_cusp (ellipse,
+ subpath (3, 4) of reverse paths2,
+ 1/256) + 3;
+ t2 := length paths2 - t2;
+ fi;
+
+ t3 = find_envelope_cusp (reverse ellipse,
+ subpath (2, 4 - epsilon) of paths2,
+ 1/256) + 2;
+ if t3 < 2:
+ t3 := 3;
+ t4 := 3;
+ else:
+ t4 = find_envelope_cusp (ellipse,
+ subpath (1 + epsilon, 3)
+ of reverse paths2,
+ 1/256) + 1;
+ t4 := length paths2 - t4;
+ fi;
+
+ fill subpath (times1 + s / 4, times13) of sub_outlines1
+ -- subpath (times31, infinity) of sub_outlines3
+ & subpath (0, times42) of sub_outlines4
+ -- subpath (times24, infinity) of sub_outlines2
+ & subpath (0, times34) of sub_outlines3
+ -- subpath (times43, times4 - s / 4) of sub_outlines4
+ -- cycle;
+ unfill subpath (times12, infinity) of sub_outlines1
+ & subpath (0, times21) of sub_outlines2
+ -- cycle;
+ fill subpath (times4 + s / 4, infinity) of sub_outlines4
+ & subpath (0, times1 - s / 4) of sub_outlines1
+ -- cycle;
+
+
+ % we approximate `draw paths2'
+ for i = 1 step s until (length paths2 - s):
+ dirs[i + 20] := direction (i - 1) of paths2;
+ endfor;
+
+ sub_outlines21 := get_subpath (ellipse, -dirs21, dirs21, z21)
+ for i = (1 + s) step s until (length paths2 - s):
+ .. get_subpoint (ellipse, dirs[i + 20],
+ point (i - 1) of paths2)
+ endfor
+ .. get_subpath (ellipse, up, z26 - z25, z25);
+ sub_outlines22 := get_subpath (ellipse, z26 - z25, z25 - z26, z26)
+ -- get_subpoint (ellipse, z25 - z26, z25);
+ sub_outlines23 := get_subpoint (ellipse, down, z25)
+ for i = (length paths2 - s) step -s until (t4 + 1):
+ .. get_subpoint (ellipse, -dirs[i + 20],
+ point (i - 1) of paths2)
+ endfor
+ .. get_subpoint (ellipse, -direction t4 of paths2,
+ point t4 of paths2);
+ sub_outlines24 := get_subpoint (ellipse, -direction t3 of paths2,
+ point t3 of paths2)
+ for i = (floor (t3 / s) * s + 1) step -s until (t2 + 1):
+ .. get_subpoint (ellipse, -dirs[i + 20],
+ point (i - 1) of paths2)
+ endfor
+ .. get_subpoint (ellipse, -direction t2 of paths2,
+ point t2 of paths2);
+ sub_outlines25 := get_subpoint (ellipse, -direction t1 of paths2,
+ point t1 of paths2)
+ for i = (floor (t1 / s) * s + 1) step -s until (1 + s):
+ .. get_subpoint (ellipse, -dirs[i + 20],
+ point (i - 1) of paths2)
+ endfor;
+
+ (times2223, times2322) = sub_outlines22 intersectiontimes sub_outlines23;
+ (times2324, times2423) = sub_outlines23 intersectiontimes sub_outlines24;
+ (times2425, times2524) = sub_outlines24 intersectiontimes sub_outlines25;
+
+ fill sub_outlines21
+ -- subpath (0, times2223) of sub_outlines22
+ -- subpath (times2322, times2324) of sub_outlines23
+ -- subpath (times2423, times2425) of sub_outlines24
+ -- subpath (times2524, infinity) of sub_outlines25
+ .. cycle;
+
+ labels (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+ labels (21, 22, 23, 24, 25, 26);
+enddef;
+
+
+fet_beginchar ("petrucci g clef", "petrucci.g");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_petrucci_g_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("petrucci g clef", "petrucci.g_change");
+ draw_petrucci_g_clef ((0, 0), .8);
+fet_endchar;
+
+
+def draw_mensural_g_clef (expr exact_center, reduction) =
+ % TODO: Rewrite me. The former mensural g clef looked ugly, and the
+ % code was removed when it broke for small font sizes after some
+ % global changes in the font. Currently, the character is mapped to
+ % a copy of the petrucci g clef (which, after all, *is* a mensural g
+ % clef, but not the one that we have in mind here). -- jr
+ %
+ % Possible sources of inspiration for this clef include: Francisco
+ % Guerrero, "Lib. 1. Missarum" (1566), in: MGG, volume 3, col. 858
+ % ("Ducis"); Stefano Fabri, "Quam speciosa veteranis" (1611), in:
+ % MGG, volume 3, col. 1698 ("Fabri"); Philippus Dulichius,
+ % "Fasciculus novus ..." (1598), in: MGG, volume 3, col. 919
+ % ("Dulichius"), fig. 1; Noe Faignient, "Ic sal de Heer myn God
+ % gebenedye" (1568), in: MGG, volume 3, col. 1735 ("Faignient").
+enddef;
+
+
+%
+% FIXME: This clef is preliminarily mapped to the petrucci g clef
+% until the code for the mensural g clef will be rewritten.
+%
+fet_beginchar ("mensural g clef", "mensural.g");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_petrucci_g_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("mensural g clef", "mensural.g_change");
+ draw_petrucci_g_clef ((0, 0), .8);
+fet_endchar;
+
+
+
+%%%%%%%%
+%
+%
+%
+% Hufnagel
+%
+%
+%
+def draw_hufnagel_do_clef (expr exact_center, reduction) =
+ % inspired by Graduale of Friedrich Zollner (1442), in: MGG,
+ % volume 9, col. 1413 ("Neustift"), fig. 1.
+
+ save reduced_il;
+
+ reduced_il# = staff_space# * reduction;
+
+ define_pixels (reduced_il);
+
+ set_char_box (0 - xpart exact_center,
+ 1.10 reduced_il# + xpart exact_center,
+ 0.70 reduced_il# - ypart exact_center,
+ 0.75 reduced_il# + ypart exact_center);
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ save ellipse, pat, T;
+ path ellipse, pat;
+ transform T;
+
+ T := identity xscaled 0.6 reduced_il
+ yscaled 0.1 reduced_il
+ rotated 40;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ z1 = (xoffs + 0.90 reduced_il, yoffs + .45 reduced_il);
+ z2 = (xoffs + 0.80 reduced_il, yoffs + .45 reduced_il);
+ z3 = (xoffs + 0.50 reduced_il, yoffs + .60 reduced_il);
+ z4 = (xoffs + 0.20 reduced_il, yoffs + .45 reduced_il);
+ z5 = (xoffs + 0.20 reduced_il, yoffs - .45 reduced_il);
+ z6 = (xoffs + 0.40 reduced_il, yoffs - .55 reduced_il);
+
+ pat := z1
+ .. z2
+ .. z3
+ -- z4
+ -- z5
+ -- z6;
+
+ fill get_subpath (ellipse,
+ -direction 0 of pat, direction 0 of pat, z1)
+ .. get_subpoint (ellipse, direction 1 of pat, z2)
+ .. get_subpath (ellipse,
+ direction (2 - epsilon) of pat, z4 - z3, z3)
+ -- get_subpath (ellipse,
+ z4 - z3, z5 - z4, z4)
+ -- get_subpath (ellipse,
+ z5 - z4, z6 - z5, z5)
+ -- get_subpath (ellipse,
+ z6 - z5, z5 - z6, z6)
+ -- get_subpoint (ellipse, z5 - z6, z5)
+ -- get_subpoint (ellipse, z4 - z5, z5)
+ -- get_subpoint (ellipse, z4 - z5, z4)
+ -- get_subpoint (ellipse, -direction (2 - epsilon) of pat, z3)
+ .. get_subpath (ellipse,
+ -direction 1 of pat, -direction 1 of pat, z2)
+ .. cycle;
+
+ labels (1, 2, 3, 4, 5, 6);
+enddef;
+
+
+fet_beginchar ("Hufnagel do clef", "hufnagel.do");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_hufnagel_do_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("Hufnagel do clef", "hufnagel.do_change");
+ draw_hufnagel_do_clef ((0, 0), .8);
+fet_endchar;
+
+
+def draw_hufnagel_fa_clef (expr exact_center, reduction) =
+ % inspired by Bamberger Manuscript (15th century), in:
+ % MGG, volume 2, table 59.
+
+ save reduced_il;
+
+ reduced_il# = staff_space# * reduction;
+
+ define_pixels (reduced_il);
+
+ set_char_box (0 - xpart exact_center,
+ 1.20 reduced_il# + xpart exact_center,
+ 1.15 reduced_il# - ypart exact_center,
+ 1.00 reduced_il# + ypart exact_center);
+
+ save xoffs, yoffs;
+
+ xoffs# = xpart exact_center;
+ yoffs# = ypart exact_center;
+
+ define_pixels (xoffs, yoffs);
+
+ save ellipse, pat, T;
+ path ellipse, pat;
+ transform T;
+
+ T := identity xscaled 0.6 reduced_il
+ yscaled 0.1 reduced_il
+ rotated 40;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ z11 = (xoffs + 0.90 reduced_il, yoffs + 0.70 reduced_il);
+ z12 = (xoffs + 0.80 reduced_il, yoffs + 0.70 reduced_il);
+ z13 = (xoffs + 0.50 reduced_il, yoffs + 0.85 reduced_il);
+ z14 = (xoffs + 0.20 reduced_il, yoffs + 0.70 reduced_il);
+ z15 = (xoffs + 0.20 reduced_il, yoffs - 1.10 reduced_il);
+
+ pat := z11
+ .. z12
+ .. z13
+ -- z14
+ -- z15;
+
+ fill get_subpath (ellipse,
+ -direction 0 of pat, direction 0 of pat, z11)
+ .. get_subpoint (ellipse, direction 1 of pat, z12)
+ .. get_subpath (ellipse,
+ direction (2 - epsilon) of pat, z14 - z13, z13)
+ -- get_subpath (ellipse,
+ z14 - z13, z15 - z14, z14)
+ -- get_subpath (ellipse,
+ z15 - z14, z14 - z15, z15)
+ -- get_subpoint (ellipse, z14 - z15, z14)
+ -- get_subpoint (ellipse, -direction (2 - epsilon) of pat, z13)
+ .. get_subpath (ellipse,
+ -direction 1 of pat, -direction 1 of pat, z12)
+ .. cycle;
+
+ z16 = (xoffs + 0.90 reduced_il, yoffs - 0.05 reduced_il);
+ z17 = (xoffs + 0.80 reduced_il, yoffs - 0.05 reduced_il);
+ z18 = (xoffs + 0.50 reduced_il, yoffs + 0.10 reduced_il);
+ z19 = (xoffs + 0.20 reduced_il, yoffs - 0.05 reduced_il);
+
+ pat := z16
+ .. z17
+ .. z18
+ -- z19;
+
+ fill get_subpath (ellipse,
+ -direction 0 of pat, direction 0 of pat, z16)
+ .. get_subpoint (ellipse, direction 1 of pat, z17)
+ .. get_subpath (ellipse,
+ direction (2 - epsilon) of pat, z19 - z18, z18)
+ -- get_subpoint (ellipse, z19 - z18, z19)
+ -- get_subpoint (ellipse, -direction (2 - epsilon) of pat, z18)
+ .. get_subpoint (ellipse, -direction 1 of pat, z17)
+ .. cycle;
+
+ labels (11, 12, 13, 14, 15, 16, 17, 18, 19);
+enddef;
+
+
+fet_beginchar ("Hufnagel fa clef", "hufnagel.fa");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_hufnagel_fa_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("Hufnagel fa clef", "hufnagel.fa_change");
+ draw_hufnagel_fa_clef ((0, 0), .8);
+fet_endchar;
+
+
+def draw_hufnagel_do_fa_clef (expr exact_center, reduction) =
+ draw_hufnagel_do_clef (exact_center, reduction);
+ draw_hufnagel_fa_clef (exact_center + (0, -2 staff_space#), reduction);
+
+ set_char_box (0 - xpart exact_center,
+ 1.20 reduced_il# + xpart exact_center,
+ 1.15 reduced_il# + 2 staff_space# - ypart exact_center,
+ 0.75 reduced_il# + ypart exact_center);
+enddef;
+
+
+fet_beginchar ("Hufnagel do/fa clef", "hufnagel.do.fa");
+ if test = 1:
+ draw_staff (-1, 3, 0.0);
+ fi;
+ draw_hufnagel_do_fa_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("Hufnagel do/fa clef", "hufnagel.do.fa_change");
+ draw_hufnagel_do_fa_clef ((0, 0), .8);
+fet_endchar;
+
+
+fet_endgroup ("clefs");
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan-custodes.mf b/muse2/share/scoreglyphs/feta-original/parmesan-custodes.mf
new file mode 100644
index 00000000..d1a2d6c7
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan-custodes.mf
@@ -0,0 +1,500 @@
+% -%-Fundamental-%- -*-Metafont-*-
+% parmesan-custodes.mf -- implement ancient custodes
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 2000--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+
+save black_notehead_width;
+numeric black_notehead_width;
+
+fet_begingroup ("custodes");
+
+%
+% character aligment:
+%
+% The custos is assumed to be vertically centered around (0, 0).
+% The left-most edge of the custos should touch the vertical line
+% that goes though the point (0, 0).
+%
+% set_char_box() conventions:
+%
+% * breapth: Ignored (as far as I know). Should be set to 0.
+%
+% * width: Should cover the horizontal range of the custos that is to
+% be printed in the staff. If the custos has an appendage that is
+% supposed to reach beyond the right end of the staff, the width
+% should be set such that the appendage is outside of the char box.
+%
+% * depth: Should match the bottom edge of the custos. Affects
+% vertical collision handling.
+%
+% * height: Should match the top edge of the custos. Affects vertical
+% collision handling.
+%
+
+save between_staff_lines, on_staff_line, anywhere;
+
+between_staff_lines := 0;
+on_staff_line := 1;
+anywhere := 2;
+
+save dir_up, dir_down;
+
+dir_up := 1;
+dir_down := -1;
+
+
+%%%%%%%%
+%
+%
+% Hufnagel style
+%
+%
+
+% parameterized hufnagel custos
+def custos_hufnagel (expr verbose_name, internal_name,
+ direction, staffline_adjustment) =
+
+ fet_beginchar (verbose_name, internal_name);
+ save alpha, dalpha, ht, wd, stem_ht, pen_size;
+
+ ht# = noteheight#;
+ wd# / ht# = 0.6;
+ alpha = 35;
+ dalpha = direction * alpha;
+
+ if staffline_adjustment = between_staff_lines:
+ stem_ht# = 1.00 staff_space#;
+ elseif staffline_adjustment = on_staff_line:
+ stem_ht# = 1.50 staff_space#;
+ else: % staffline_adjustment = anywhere
+ stem_ht# = 1.25 staff_space#;
+ fi;
+
+ pen_size# = 0.5 (wd# ++ ht#);
+
+ define_pixels (ht, wd, pen_size, stem_ht);
+
+ save ellipse, pat, T;
+ path ellipse, pat;
+ transform T;
+
+ T := identity xscaled linethickness
+ yscaled pen_size
+ rotated -dalpha;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ if direction = dir_up:
+ top y1 = ht / 2;
+ bot y2 = -ht / 2;
+ else:
+ bot y1 = -ht / 2;
+ top y2 = ht / 2;
+ fi;
+
+ lft x1 = 0;
+ rt x2 = wd;
+ y3 - y2 = direction * stem_ht;
+ (y3 - y2) = (x3 - x2) * tand (90 - dalpha);
+
+ fill get_subpath (ellipse, z1 - z2, z2 - z1, z1)
+ if direction > 0:
+ -- get_subpath (ellipse, z2 - z1, z3 - z2, z2)
+ else:
+ -- get_subpoint (ellipse, z2 - z1, z2)
+ -- get_subpoint (ellipse, z3 - z2, z2)
+ fi
+ -- get_subpath (ellipse, z3 - z2, z2 - z3, z3)
+ if direction > 0:
+ -- get_subpoint (ellipse, z2 - z3, z2)
+ -- get_subpoint (ellipse, z1 - z2, z2)
+ else:
+ -- get_subpath (ellipse, z2 - z3, z1 - z2, z2)
+ fi
+ -- cycle;
+
+ % The stem is intentionally outside of the char box.
+ if direction > 0:
+ set_char_box (0, wd#, ht# / 2, stem_ht#);
+ else:
+ set_char_box (0, wd#, stem_ht#, ht# / 2);
+ fi;
+
+ labels (1, 2, 3);
+ fet_endchar;
+enddef;
+
+
+% custos hufnagel, stem up, between staff lines
+custos_hufnagel ("Custos Hufnagel", "hufnagel.u0",
+ dir_up, between_staff_lines);
+
+
+% custos hufnagel, stem up, on staff line
+custos_hufnagel ("Custos Hufnagel", "hufnagel.u1",
+ dir_up, on_staff_line);
+
+
+% custos hufnagel, stem up, anywhere
+custos_hufnagel ("Custos Hufnagel", "hufnagel.u2",
+ dir_up, anywhere);
+
+
+% custos hufnagel, stem down, between staff lines
+custos_hufnagel ("Reverse Custos Hufnagel", "hufnagel.d0",
+ dir_down, between_staff_lines);
+
+
+% custos hufnagel, stem down, on staff line
+custos_hufnagel ("Reverse Custos Hufnagel", "hufnagel.d1",
+ dir_down, on_staff_line);
+
+
+% custos hufnagel, stem down, anywhere
+custos_hufnagel ("Reverse Custos Hufnagel", "hufnagel.d2",
+ dir_down, anywhere);
+
+
+%%%%%%%%
+%
+%
+% Medicaea style
+%
+%
+
+def custos_medicaea (expr verbose_name, internal_name,
+ direction, staffline_adjustment) =
+ fet_beginchar (verbose_name, internal_name);
+ save ht, wd, stem_ht;
+
+ ht# = noteheight#;
+ wd# / ht# = 0.25;
+
+ if staffline_adjustment = between_staff_lines:
+ stem_ht# = 1.00 staff_space#;
+ elseif staffline_adjustment = on_staff_line:
+ stem_ht# = 1.50 staff_space#;
+ else: % staffline_adjustment = anywhere
+ stem_ht# = 1.25 staff_space#;
+ fi;
+
+ define_pixels (ht, wd, stem_ht);
+
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled 0.6 linethickness
+ yscaled ht;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ lft x1 = 0;
+ y1 = 0;
+ rt x2 = wd;
+ y2 = y1;
+
+ fill get_subpath (ellipse, left, right, z1)
+ -- get_subpath (ellipse, right, left, z2)
+ -- cycle;
+
+ pickup pencircle scaled 0.6 linethickness;
+
+ rt x3 = wd;
+ y3 = 0;
+ x4 = x3;
+ if direction > 0:
+ top y4 = stem_ht;
+ draw_rounded_block (bot lft z3, top rt z4,
+ 0.6 linethickness);
+ else:
+ bot y4 = -stem_ht;
+ draw_rounded_block (bot lft z4, top rt z3,
+ 0.6 linethickness);
+ fi;
+
+
+ if direction > 0:
+ set_char_box (0, wd#, ht# / 2, stem_ht#);
+ else:
+ set_char_box (0, wd#, stem_ht#, ht# / 2);
+ fi;
+
+ labels (1, 2, 3, 4);
+ fet_endchar;
+enddef;
+
+
+% custos medicaea, stem up, between staff lines
+custos_medicaea ("Custos Med.", "medicaea.u0",
+ dir_up, between_staff_lines);
+
+
+% custos medicaea, stem up, on staff line
+custos_medicaea ("Custos Med.", "medicaea.u1",
+ dir_up, on_staff_line);
+
+
+% custos medicaea, stem up, anywhere
+custos_medicaea ("Custos Med.", "medicaea.u2",
+ dir_up, anywhere);
+
+
+% custos medicaea, stem down, between staff lines
+custos_medicaea ("Reverse Custos Med.", "medicaea.d0",
+ dir_down, between_staff_lines);
+
+
+% custos medicaea, stem down, on staff line
+custos_medicaea ("Reverse Custos Med.", "medicaea.d1",
+ dir_down, on_staff_line);
+
+
+% custos medicaea, stem down, anywhere
+custos_medicaea ("Reverse Custos Med.", "medicaea.d2",
+ dir_down, anywhere);
+
+
+%%%%%%%%
+%
+%
+% Editio Vaticana style
+%
+%
+
+def custos_vaticana (expr verbose_name, internal_name,
+ direction, staffline_adjustment) =
+ fet_beginchar (verbose_name, internal_name);
+ save ht, wd, u_offs, l_offs, stem_size, stem_end;
+ save pen_ht, l_shift, curve_ht, bend_ht;
+
+ ht# = noteheight#;
+ wd# = 0.24 ht#;
+
+ if staffline_adjustment = between_staff_lines:
+ stem_size# = 1.00;
+ elseif staffline_adjustment = on_staff_line:
+ stem_size# = 1.50;
+ else: % staffline_adjustment = anywhere
+ stem_size# = 1.25;
+ fi;
+
+ curve_ht# = 0.6 ht#;
+ bend_ht# = 0.10 ht#;
+ l_shift# = 0.04 ht#;
+ u_offs# = +direction * 0.5 * (bend_ht# + l_shift#);
+ l_offs# = -direction * 0.5 * (bend_ht# - l_shift#);
+ stem_end# = direction * stem_size# * staff_space#;
+ pen_ht# = curve_ht# - l_shift#;
+
+ define_pixels (u_offs, l_offs, stem_end, ht, wd, pen_ht);
+
+ pickup pencircle scaled 0.6 linethickness;
+
+ z1 = (0, u_offs);
+ z2 = (0.7 wd, l_offs);
+ z3 = (wd, l_offs);
+
+ penpos1 (pen_ht, 90);
+ penpos2 (pen_ht, 90);
+ penpos3 (pen_ht, 90);
+
+ penstroke z1e{z2 - z1}
+ .. {right}z2e
+ .. z3e;
+
+ rt x4 = wd;
+ x5 = x4;
+
+ if direction > 0:
+ y4 = y3r;
+ top y5 = stem_end;
+ draw_rounded_block (bot lft z4, top rt z5,
+ 0.6 linethickness);
+ else:
+ y4 = y3l;
+ bot y5 = stem_end;
+ draw_rounded_block (bot lft z5, top rt z4,
+ 0.6 linethickness);
+ fi;
+
+ if direction > 0:
+ set_char_box (0, wd#,
+ -l_offs# + 0.5 pen_ht#, stem_end#);
+ else:
+ set_char_box (0, wd#,
+ -stem_end#, +l_offs# + 0.5 pen_ht#);
+ fi;
+
+ penlabels (1, 2, 3);
+ labels (4, 5);
+ fet_endchar;
+enddef;
+
+
+% custos vaticana, stem up, between staff lines
+custos_vaticana ("Custos Ed. Vat.", "vaticana.u0",
+ dir_up, between_staff_lines);
+
+
+% custos vaticana, stem up, on staff line
+custos_vaticana ("Custos Ed. Vat.", "vaticana.u1",
+ dir_up, on_staff_line);
+
+
+% custos vaticana, stem up, anywhere
+custos_vaticana ("Custos Ed. Vat.", "vaticana.u2",
+ dir_up, anywhere);
+
+
+% custos vaticana, stem down, between staff lines
+custos_vaticana ("Reverse Custos Ed. Vat.", "vaticana.d0",
+ dir_down, between_staff_lines);
+
+
+% custos vaticana, stem down, on_staff_line
+custos_vaticana ("Reverse Custos Ed. Vat.", "vaticana.d1",
+ dir_down, on_staff_line);
+
+
+% custos vaticana, stem down, anywhere
+custos_vaticana ("Reverse Custos Ed. Vat.", "vaticana.d2",
+ dir_down, anywhere);
+
+
+%%%%%%%%
+%
+%
+% Mensural style
+%
+%
+
+def custos_mensural (expr verbose_name, internal_name,
+ direction, staffline_adjustment) =
+ fet_beginchar (verbose_name, internal_name);
+ save alpha, dalpha, ht, wd, stem_ht;
+
+ ht# = noteheight#;
+ wd# / ht# = 1.2;
+ alpha = 35;
+ dalpha = direction * alpha;
+
+ if staffline_adjustment = between_staff_lines:
+ stem_ht# = 1.00 staff_space#;
+ elseif staffline_adjustment = on_staff_line:
+ stem_ht# = 1.50 staff_space#;
+ else: % staffline_adjustment = anywhere
+ stem_ht# = 1.25 staff_space#;
+ fi;
+
+ define_pixels (ht, wd, stem_ht);
+
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled linethickness
+ yscaled 0.4 ht
+ rotated -dalpha;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ if direction > 0:
+ bot y1 = bot y3 = bot y5 = -direction * 0.33 ht;
+ top y2 = top y4 = +direction * 0.33 ht;
+ else:
+ top y1 = top y3 = top y5 = -direction * 0.33 ht;
+ bot y2 = bot y4 = +direction * 0.33 ht;
+ fi;
+
+ lft x1 = 0.0 wd;
+ lft x2 = 0.2 wd;
+ lft x3 = 0.4 wd;
+ lft x4 = 0.6 wd;
+ lft x5 = 0.8 wd;
+
+ y6 - y5 = direction * stem_ht;
+ y6 - y5 = (x6 - x5) * tand (90 - dalpha);
+
+ if direction > 0:
+ fill get_subpath (ellipse, z1 - z2, z2 - z1, z1)
+ -- get_subpoint (ellipse, z2 - z1, z2)
+ -- get_subpoint (ellipse, z3 - z2, z2)
+ -- get_subpath (ellipse, z3 - z2, z4 - z3, z3)
+ -- get_subpoint (ellipse, z4 - z3, z4)
+ -- get_subpoint (ellipse, z5 - z4, z4)
+ -- get_subpath (ellipse, z5 - z4, z6 - z5, z5)
+ -- get_subpath (ellipse, z6 - z5, z5 - z6, z6)
+ -- get_subpoint (ellipse, z5 - z6, z5)
+ -- get_subpoint (ellipse, z4 - z5, z5)
+ -- get_subpath (ellipse, z4 - z5, z3 - z4, z4)
+ -- get_subpoint (ellipse, z3 - z4, z3)
+ -- get_subpoint (ellipse, z2 - z3, z3)
+ -- get_subpath (ellipse, z2 - z3, z1 - z2, z2)
+ -- cycle;
+ else:
+ fill get_subpath (ellipse, z1 - z2, z2 - z1, z1)
+ -- get_subpath (ellipse, z2 -z1, z3 - z2, z2)
+ -- get_subpoint (ellipse, z3 - z2, z3)
+ -- get_subpoint (ellipse, z4 - z3, z3)
+ -- get_subpath (ellipse, z4 -z3, z5 - z4, z4)
+ -- get_subpoint (ellipse, z5 - z4, z5)
+ -- get_subpoint (ellipse, z6 - z5, z5)
+ -- get_subpath (ellipse, z6 - z5, z5 - z6, z6)
+ -- get_subpath (ellipse, z5 - z6, z4 - z5, z5)
+ -- get_subpoint (ellipse, z4 - z5, z4)
+ -- get_subpoint (ellipse, z3 - z4, z4)
+ -- get_subpath (ellipse, z3 - z4, z2 - z3, z3)
+ -- get_subpoint (ellipse, z2 - z3, z2)
+ -- get_subpoint (ellipse, z1 - z2, z2)
+ -- cycle;
+ fi;
+
+ % The stem is intentionally outside of the char box.
+ if direction > 0:
+ set_char_box (0, wd#,
+ +direction * 0.33 ht#, stem_ht#);
+ else:
+ set_char_box (0, wd#,
+ stem_ht#, -direction * 0.33 ht#);
+ fi;
+
+ labels (1, 2, 3, 4, 5, 6);
+ fet_endchar;
+enddef;
+
+
+% custos mensural, stem up, between staff lines
+custos_mensural ("Custos Mensural", "mensural.u0",
+ dir_up, between_staff_lines);
+
+
+% custos mensural, stem up, on staff line
+custos_mensural ("Custos Mensural", "mensural.u1",
+ dir_up, on_staff_line);
+
+
+% custos mensural, stem up, anywhere
+custos_mensural ("Custos Mensural", "mensural.u2",
+ dir_up, anywhere);
+
+
+% custos mensural, stem down, between staff lines
+custos_mensural ("Reverse Custos Mensural", "mensural.d0",
+ dir_down, between_staff_lines);
+
+
+% custos mensural, stem down, on staff line
+custos_mensural ("Reverse Custos Mensural", "mensural.d1",
+ dir_down, on_staff_line);
+
+
+% custos mensural, stem down, anywhere
+custos_mensural ("Reverse Custos Mensural", "mensural.d2",
+ dir_down, anywhere);
+
+
+fet_endgroup ("custodes");
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan-dots.mf b/muse2/share/scoreglyphs/feta-original/parmesan-dots.mf
new file mode 100644
index 00000000..826dabe2
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan-dots.mf
@@ -0,0 +1,27 @@
+% -%-Fundamental-%- -*-Metafont-*-
+% parmesan-dots.mf -- dot vaticana
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 2006--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+
+fet_begingroup ("dots");
+
+save dot_diam;
+
+3 dot_diam# = staff_space# - stafflinethickness#;
+define_whole_blacker_pixels (dot_diam);
+
+fet_beginchar ("duration dot", "dotvaticana");
+ pickup pencircle scaled dot_diam;
+
+ lft x0 = 0;
+ top y0 = vround (.5 dot_diam);
+
+ drawdot z0;
+
+ set_char_box (0, dot_diam#, .5 dot_diam#, .5 dot_diam#);
+fet_endchar;
+
+fet_endgroup ("dots");
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan-flags.mf b/muse2/share/scoreglyphs/feta-original/parmesan-flags.mf
new file mode 100644
index 00000000..32a55df0
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan-flags.mf
@@ -0,0 +1,326 @@
+% -%-Fundamental-%- -*-Metafont-*-
+% parmesan-flags.mf -- implement ancient flags
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+
+fet_begingroup ("flags");
+
+save between_staff_lines, on_staff_line, anywhere;
+
+between_staff_lines := 0;
+on_staff_line := 1;
+anywhere := 2;
+
+save dir_up, dir_down;
+
+dir_up := 1;
+dir_down := -1;
+
+
+%%%%%%%%
+%
+%
+%
+% Mensural Notation
+%
+%
+%
+
+def draw_mensural_outermost_flare (expr staffline_adjustment, d_) =
+ define_pixels (linethickness, staff_space);
+
+ save ellipse, pat, T;
+ path ellipse, pat;
+ transform T;
+
+ T := identity xscaled 1.00 linethickness
+ yscaled 0.22 staff_space
+ rotated -35;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ z11 = (+0.00 staff_space, -0.00 staff_space);
+ z12 = (+0.15 staff_space, -0.00 staff_space);
+
+ if staffline_adjustment = between_staff_lines:
+ z13 = (+0.45 staff_space, -0.35 staff_space);
+ z14 = (+0.45 staff_space, -0.85 staff_space);
+ z15 = (+0.00 staff_space, -2.00 staff_space);
+ elseif staffline_adjustment = on_staff_line:
+ z13 = (+0.20 staff_space, -0.05 staff_space);
+ z14 = (+0.20 staff_space, -1.15 staff_space);
+ z15 = (+0.00 staff_space, -1.40 staff_space);
+ else: % staffline_adjustment = anywhere
+ z13 = (+0.33 staff_space, -0.20 staff_space);
+ z14 = (+0.33 staff_space, -1.00 staff_space);
+ z15 = (+0.00 staff_space, -1.70 staff_space);
+ fi;
+
+ pat := z13{z13 - z12}
+ .. {z15 - z14}z14;
+
+ fill get_subpath (ellipse, z11 - z12, z12 - z11, z11)
+ -- get_subpoint (ellipse, z12 - z11, z12)
+ -- get_subpoint (ellipse, z13 - z12, z12)
+ -- get_subpoint (ellipse, direction 0 of pat, z13)
+ {direction 0 of pat}
+ .. {direction 1 of pat}
+ get_subpoint (ellipse, direction 1 of pat, z14)
+ -- get_subpath (ellipse, z15 - z14, z14 - z15, z15)
+ -- get_subpoint (ellipse, -direction 1 of pat, z14)
+ {-direction 1 of pat}
+ .. {-direction 0 of pat}
+ get_subpoint (ellipse, -direction 0 of pat, z13)
+ -- get_subpath (ellipse, z12 - z13, z11 - z12, z12)
+ -- cycle;
+
+ if d_ = dir_up:
+ labels (11, 12, 13, 14, 15);
+ fi;
+enddef;
+
+
+def draw_mensural_inner_flare (expr il_shift, idx, d_) =
+ define_pixels (linethickness, staff_space);
+
+ save ellipse, pat, T;
+ path ellipse, pat;
+ transform T;
+
+ T := identity xscaled 1.00 linethickness
+ yscaled 0.22 staff_space
+ rotated -35;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ save i;
+ numeric i[];
+
+ i0 := idx * 10;
+ i1 := idx * 10 + 1;
+ i2 := idx * 10 + 2;
+ i3 := idx * 10 + 3;
+ i4 := idx * 10 + 4;
+
+ z[i0] = (0, -il_shift * staff_space);
+ z[i1] = z[i0] + (+0.00 staff_space, -0.10 staff_space);
+ z[i2] = z[i0] + (+0.33 staff_space, -0.30 staff_space);
+ z[i3] = z[i0] + (+0.33 staff_space, -0.70 staff_space);
+ z[i4] = z[i0] + (+0.00 staff_space, -0.90 staff_space);
+
+ pat := z[i1]{2, 1}
+ .. z[i2]
+ .. z[i3]
+ .. {-2, -1}z[i4];
+
+ % we avoid cusps originally present in `draw pat'
+ fill get_subpath (ellipse,
+ -direction 0 of pat, direction 0 of pat, z[i1])
+ .. get_subpoint (ellipse, direction 1 of pat, z[i2])
+ {direction 1 of pat}
+ .. get_subpoint (ellipse, direction 2 of pat, z[i3])
+ {direction 2 of pat}
+ .. get_subpath (ellipse,
+ direction 3 of pat, -direction 3 of pat, z[i4])
+ .. get_subpoint (ellipse, -direction 2 of pat, z[i3])
+ {-direction 2 of pat}
+ .. get_subpoint (ellipse, -direction 1 of pat, z[i2])
+ {-direction 1 of pat}
+ .. cycle;
+
+ if d_ = dir_up:
+ labels ([i0], [i1], [i2], [i3], [i4]);
+ fi;
+enddef;
+
+
+def draw_mensural_flag (expr staffline_adjustment, flares, d_) =
+ save char_box_adjust, flare_shift;
+
+ if staffline_adjustment = between_staff_lines:
+ flare_shift := 0.5;
+ elseif staffline_adjustment = on_staff_line:
+ flare_shift := 0.0;
+ else: % staffline_adjustment = anywhere
+ flare_shift := 0.25;
+ fi;
+
+ char_box_adjust := flare_shift + 0.5;
+
+ if d_ = dir_up:
+ set_char_box (0,
+ 0.60 staff_space#,
+ (flares + char_box_adjust) * staff_space#,
+ 0.10 staff_space#);
+ else: % d_ = dir_down
+ set_char_box (0.60 staff_space#,
+ 0,
+ 0.10 staff_space#,
+ (flares + char_box_adjust) * staff_space#);
+ fi;
+
+ draw_mensural_outermost_flare (staffline_adjustment, d_);
+
+ for flare_count := 2 step 1 until 4:
+ if flares >= flare_count:
+ draw_mensural_inner_flare (flare_shift
+ + flare_count - 0.5,
+ flare_count, d_);
+ fi;
+ endfor;
+
+ if d_ = dir_down:
+ currentpicture := currentpicture xscaled -1
+ yscaled -1;
+ fi;
+enddef;
+
+
+% 8th mensural flag, upwards, between staff lines
+fet_beginchar ("8th Mensural Flag (up)", "mensuralu03");
+ draw_mensural_flag (between_staff_lines, 1, dir_up);
+fet_endchar;
+
+
+% 8th mensural flag, upwards, on staff line
+fet_beginchar ("8th Mensural Flag (up)", "mensuralu13");
+ draw_mensural_flag (on_staff_line, 1, dir_up);
+fet_endchar;
+
+
+% 8th mensural flag, upwards, anywhere
+fet_beginchar ("8th Mensural Flag (up)", "mensuralu23");
+ draw_mensural_flag (anywhere, 1, dir_up);
+fet_endchar;
+
+
+% 8th mensural flag, downwards, between staff lines
+fet_beginchar ("8th Mensural Flag (down)", "mensurald03");
+ draw_mensural_flag (between_staff_lines, 1, dir_down);
+fet_endchar;
+
+
+% 8th mensural flag, downwards, on staff line
+fet_beginchar ("8th Mensural Flag (down)", "mensurald13");
+ draw_mensural_flag (on_staff_line, 1, dir_down);
+fet_endchar;
+
+
+% 8th mensural flag, downwards, anywhere
+fet_beginchar ("8th Mensural Flag (down)", "mensurald23");
+ draw_mensural_flag (anywhere, 1, dir_down);
+fet_endchar;
+
+
+% 16th mensural flag, upwards, between staff lines
+fet_beginchar ("16th Mensural Flag (up)", "mensuralu04");
+ draw_mensural_flag (between_staff_lines, 2, dir_up);
+fet_endchar;
+
+
+% 16th mensural flag, upwards, on staff line
+fet_beginchar ("16th Mensural Flag (up)", "mensuralu14");
+ draw_mensural_flag (on_staff_line, 2, dir_up);
+fet_endchar;
+
+
+% 16th mensural flag, upwards, anywhere
+fet_beginchar ("16th Mensural Flag (up)", "mensuralu24");
+ draw_mensural_flag (anywhere, 2, dir_up);
+fet_endchar;
+
+
+% 16th mensural flag, downwards, between staff lines
+fet_beginchar ("16th Mensural Flag (down)", "mensurald04");
+ draw_mensural_flag (between_staff_lines, 2, dir_down);
+fet_endchar;
+
+
+% 16th mensural flag, downwards, on staff line
+fet_beginchar ("16th Mensural Flag (down)", "mensurald14");
+ draw_mensural_flag (on_staff_line, 2, dir_down);
+fet_endchar;
+
+
+% 16th mensural flag, downwards, anywhere
+fet_beginchar ("16th Mensural Flag (down)", "mensurald24");
+ draw_mensural_flag (anywhere, 2, dir_down);
+fet_endchar;
+
+
+% 32th mensural flag, upwards, between staff lines
+fet_beginchar ("32th Mensural Flag (up)", "mensuralu05");
+ draw_mensural_flag (between_staff_lines, 3, dir_up);
+fet_endchar;
+
+
+% 32th mensural flag, upwards, on staff line
+fet_beginchar ("32th Mensural Flag (up)", "mensuralu15");
+ draw_mensural_flag (on_staff_line, 3, dir_up);
+fet_endchar;
+
+
+% 32th mensural flag, upwards, anywhere
+fet_beginchar ("32th Mensural Flag (up)", "mensuralu25");
+ draw_mensural_flag (anywhere, 3, dir_up);
+fet_endchar;
+
+
+% 32th mensural flag, downwards, between staff lines
+fet_beginchar ("32th Mensural Flag (down)", "mensurald05");
+ draw_mensural_flag (between_staff_lines, 3, dir_down);
+fet_endchar;
+
+
+% 32th mensural flag, downwards, on staff line
+fet_beginchar ("32th Mensural Flag (down)", "mensurald15");
+ draw_mensural_flag (on_staff_line, 3, dir_down);
+fet_endchar;
+
+
+% 32th mensural flag, downwards, anywhere
+fet_beginchar ("32th Mensural Flag (down)", "mensurald25");
+ draw_mensural_flag (anywhere, 3, dir_down);
+fet_endchar;
+
+
+% 64th mensural flag, upwards, between staff lines
+fet_beginchar ("64th Mensural Flag (up)", "mensuralu06");
+ draw_mensural_flag (between_staff_lines, 4, dir_up);
+fet_endchar;
+
+
+% 64th mensural flag, upwards, on staff line
+fet_beginchar ("64th Mensural Flag (up)", "mensuralu16");
+ draw_mensural_flag (on_staff_line, 4, dir_up);
+fet_endchar;
+
+
+% 64th mensural flag, upwards, anywhere
+fet_beginchar ("64th Mensural Flag (up)", "mensuralu26");
+ draw_mensural_flag (anywhere, 4, dir_up);
+fet_endchar;
+
+
+% 64th mensural flag, downwards, between staff lines
+fet_beginchar ("64th Mensural Flag (down)", "mensurald06");
+ draw_mensural_flag (between_staff_lines, 4, dir_down);
+fet_endchar;
+
+
+% 64th mensural flag, downwards, on staff line
+fet_beginchar ("64th Mensural Flag (down)", "mensurald16");
+ draw_mensural_flag (on_staff_line, 4, dir_down);
+fet_endchar;
+
+
+% 64th mensural flag, downwards, anywhere
+fet_beginchar ("64th Mensural Flag (down)", "mensurald26");
+ draw_mensural_flag (anywhere, 4, dir_down);
+fet_endchar;
+
+
+fet_endgroup ("flags");
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan-generic.mf b/muse2/share/scoreglyphs/feta-original/parmesan-generic.mf
new file mode 100644
index 00000000..6ffb53aa
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan-generic.mf
@@ -0,0 +1,42 @@
+% -%-Fundamental-%- -*-Metafont-*-
+% parmesan-generic.mf -- implement generic stuff: include lots of files,
+% but don't set dimensions.
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+
+
+if test = -1:
+ mode := smoke;
+fi;
+
+mode_setup;
+
+staffsize# := design_size * pt#;
+
+input feta-macros;
+input feta-params;
+
+input parmesan-macros;
+
+
+font_x_height staff_space#;
+
+
+fet_beginfont ("parmesan", design_size, "parmesanMusic");
+ if test = 0:
+ input parmesan-rests;
+ input parmesan-heads;
+ input parmesan-clefs;
+ input parmesan-custodes
+ input parmesan-accidentals;
+ input parmesan-flags;
+ input parmesan-timesig;
+ input parmesan-scripts;
+ input parmesan-dots;
+ else:
+
+ fi;
+fet_endfont;
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan-heads.mf b/muse2/share/scoreglyphs/feta-original/parmesan-heads.mf
new file mode 100644
index 00000000..b897554d
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan-heads.mf
@@ -0,0 +1,1492 @@
+% -%-Fundamental-%- -*-Metafont-*-
+% parmesan-heads.mf -- implement ancient note heads
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+% Neo-mensural heads originally by
+% Christian Mondrup and Mats Bengtsson
+%
+
+save black_notehead_width;
+numeric black_notehead_width;
+
+fet_begingroup ("noteheads");
+
+%
+% character aligment:
+%
+% The head is assumed to be vertically centered around (0, 0).
+% The left-most edge of the head should touch the vertical line
+% that goes though the point (0, 0).
+%
+% set_char_box() conventions:
+%
+% * breapth: Ignored (as far as I know). Should be set to 0.
+%
+% * width: Should match the head's width.
+%
+% * depth: Should match the bottom edge of the head. Affects vertical
+% collision handling.
+%
+% * height: Should match the top edge of the head. Affects vertical
+% collision handling.
+%
+% TODO: should depth/height include appendages/stems?
+
+overdone_heads = 0;
+noteheight# := staff_space# + (1 + overdone_heads) * stafflinethickness#;
+define_pixels (noteheight);
+
+
+%%%%%%%%
+%
+%
+%
+% MENSURAL NOTATION
+%
+%
+%
+
+def draw_neomensural_brevis (expr brevwid) =
+ save beamheight, head_width;
+ save holeheight, stem_width;
+ save serif_size, serif_protrude;
+
+ head_width# = brevwid;
+ holeheight = 3 stafflinethickness;
+ stem_width = 1.4 stafflinethickness;
+
+ define_pixels (head_width);
+
+ set_char_box (0, head_width#,
+ noteheight# / 2, noteheight# / 2);
+
+ 2 beamheight + holeheight = noteheight;
+ serif_size = (holeheight - stafflinethickness) / 2;
+ serif_protrude = 1.5 serif_size;
+
+ z1l = (0, 0);
+ z2l = (0, -stafflinethickness / 2);
+ z3r = z2r + serif_size * (1, -1);
+ y4r = y3r;
+ x4r = head_width / 2;
+ z5l = z3l + (-serif_size, -serif_protrude);
+
+ penpos1 (stem_width, 0);
+ penpos2 (stem_width, 0);
+ penpos3 (beamheight, 90);
+ penpos4 (beamheight, 90);
+ penpos5 (stem_width, 180);
+
+ save pat_in, pat_out;
+ path pat_in, pat_out;
+
+ pat_out := z4l
+ -- z3l{left}
+ .. z5l{down}
+ .. z5r{up}
+ -- z1l;
+ pat_out := pat_out
+ -- reverse pat_out yscaled -1;
+ pat_out := pat_out
+ -- reverse pat_out shifted (-x4r, 0)
+ xscaled -1
+ shifted (x4l, 0)
+ -- 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;
+
+ 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);
+
+ save theta;
+
+ x7r = head_width;
+ y7 = y5;
+ z6 - z7 = (stem_width / 2, -staff_space);
+ theta = angle (z6 - z7) + 90;
+
+ penpos7 (stem_width, 0);
+ penpos6 (1.2 stem_width, theta);
+
+ z7' = find_tangent (z6l, pat_out,
+ (x7l + 0.5 stem_width, y7l),
+ (x7l - 0.5 stem_width, y7l));
+
+ fill z7r
+ .. z6r{z6 - z7}
+ .. {z7 - z6}z6l
+ -- z7'
+ -- cycle;
+
+ penlabels (6, 7);
+ labels (7');
+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;
+ save ne, nw, ne_dist, nw_dist;
+ pair ne, nw, ne_dist, nw_dist;
+
+ head_width# = wid;
+
+ set_char_box (0, head_width#,
+ height / 2, height / 2);
+
+ charwx := head_width# / 2;
+ charwy := height / 2;
+
+ y3 = y1 = 0;
+ x2 = x4 = (x1 + x3) / 2;
+
+ pickup pencircle scaled blot_diameter;
+
+ top y2 = h;
+ bot y4 = -d;
+ lft x1 = 0;
+ rt x3 = w;
+
+ ne := unitvector (z2 - z1);
+ nw_dist := (ne rotated 90) * 0.5 blot_diameter;
+ 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}
+ .. cycle;
+
+ labels (1, 2, 3, 4);
+enddef;
+
+
+def draw_neomensural_open_head (expr wid, height)=
+ draw_neomensural_black_head (wid, height);
+
+ save diamNW, diamSW;
+
+ diamNW = length (z2 - z1) + blot_diameter;
+ diamSW = length (z4 - z1) + blot_diameter;
+
+ 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;
+
+ labels (5, 6, 7, 8);
+enddef;
+
+
+%
+% WL says the thin lines should be thinner.
+%
+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;
+
+
+fet_beginchar ("Neo-mensural semibrevis head", "s0neomensural");
+ draw_neomensural_open_head (staff_space#, noteheight#);
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural minima head", "s1neomensural");
+ draw_neomensural_open_head (staff_space#, noteheight#);
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural semiminima head", "s2neomensural");
+ draw_neomensural_black_head (staff_space#, noteheight#);
+fet_endchar;
+
+
+def draw_mensural_brevis (expr wid) =
+ % TODO. For the moment, fall back to draw_neomensural_brevis.
+ draw_neomensural_brevis (wid);
+enddef;
+
+
+%%% This head does not seem to be used anywhere. Junk me? -- jr
+def draw_mensural_left_stemmed_head (expr wid) =
+ draw_mensural_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;
+
+
+def draw_mensural_longa (expr wid) =
+ draw_mensural_brevis (wid);
+
+ x6 = x7 = head_width - 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 ("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;
+ path ellipse, ellipse_r, diamond_shape;
+
+ head_height# = head_h;
+ head_width# / head_height# = tand (angle);
+
+ set_char_box (0, head_width#,
+ head_height# / 2, head_height# / 2);
+
+ charwx := head_width# / 2;
+ charwy := head_height# / 2 - linethickness#;
+
+ define_pixels (head_width, head_height);
+
+ ellipse := reverse fullcircle
+ xscaled (max (blot_diameter, pen_w * head_width))
+ yscaled (max (blot_diameter, pen_h * head_width))
+ rotated -angle;
+
+ z1 = find_tangent_shift (((0, h) -- (0, -h)), ellipse,
+ (0, 0), (w / 2, 0));
+ z2 = find_tangent_shift (((0, h) -- (w, h)), ellipse,
+ (w / 2, h), (w / 2, 0));
+ z3 = find_tangent_shift (((w, h) -- (w, -h)), ellipse,
+ (w, 0), (w / 2, 0));
+ z4 = find_tangent_shift (((0, -h) -- (w, -h)), ellipse,
+ (w / 2, -h), (w / 2, 0));
+
+ diamond_shape := get_subpath (ellipse, z1 - z4, z2 - z1, z1)
+ -- get_subpath (ellipse, z2 - z1, z3 - z2, z2)
+ -- get_subpath (ellipse, z3 - z2, z4 - z3, z3)
+ -- get_subpath (ellipse, z4 - z3, z1 - z4, z4)
+ -- cycle;
+ fill diamond_shape;
+
+ if open:
+ save l;
+ path l[];
+
+ l12 := (directionpoint (z1 - z2) of ellipse) shifted z1
+ -- (directionpoint (z1 - z2) of ellipse) shifted z2;
+ l23 := (directionpoint (z2 - z3) of ellipse) shifted z2
+ -- (directionpoint (z2 - z3) of ellipse) shifted z3;
+ l34 := (directionpoint (z3 - z4) of ellipse) shifted z3
+ -- (directionpoint (z3 - z4) of ellipse) shifted z4;
+ l41 := (directionpoint (z4 - z1) of ellipse) shifted z4
+ -- (directionpoint (z4 - z1) of ellipse) shifted z1;
+
+ unfill l12 intersectionpoint l23
+ -- l23 intersectionpoint l34
+ -- l34 intersectionpoint l41
+ -- l41 intersectionpoint l12
+ -- cycle;
+ fi;
+
+ labels (1, 2, 3, 4);
+enddef;
+
+
+fet_beginchar ("Mensural semibrevis head", "s0mensural");
+ draw_diamond_head (staff_space#, 0.15, 0.30, 30, true);
+fet_endchar;
+
+
+fet_beginchar ("Mensural minima head", "s1mensural");
+ draw_diamond_head (staff_space#, 0.15, 0.30, 30, true);
+fet_endchar;
+
+
+fet_beginchar ("Mensural semiminima head", "s2mensural");
+ draw_diamond_head (staff_space#, 0.15, 0.30, 30, false);
+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#);
+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#);
+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#);
+fet_endchar;
+
+
+%%%%%%%%
+%
+%
+%
+% EDITIO VATICANA (including solesmes extensions)
+%
+%
+%
+
+def vat_punctum_char (expr verbose_name, internal_name,
+ linea, cavum, straight, auctum,
+ d_up, up_shift, down_shift, mag) =
+ fet_beginchar (verbose_name, "s" & internal_name);
+ save a_b, b_h, a_w;
+
+ a_b := 1.54; % b_h * a_b / a_w = wd / ht
+ b_h := 0.85;
+ a_w := 1.09;
+
+ save a, beta, ht, wd;
+
+ ht# = noteheight# * mag;
+ 2 beta = ht# * b_h;
+ a = beta * a_b;
+ wd# = 2 a / a_w;
+ black_notehead_width# := wd#;
+
+ % direction
+ save d_, d_sign;
+ pair d_;
+
+ if d_up:
+ d_ := up;
+ d_sign := 1;
+ else:
+ d_ := down;
+ d_sign := -1;
+ fi;
+
+ % convexity and eccentricity
+ save u_convexity, u_eccentricity;
+
+ if straight:
+ u_convexity# := -0.01 ht#;
+ u_eccentricity# := 0.0 ht#; % dummy
+ elseif auctum:
+ u_convexity# := -0.03 ht#;
+ u_eccentricity# := +0.25 ht#;
+ else:
+ u_convexity# := -0.05 ht#;
+ u_eccentricity# := 0.0 ht#; % dummy
+ fi;
+
+ save convexity, eccentricity;
+
+ convexity# := d_sign * u_convexity#;
+ eccentricity# := d_sign * u_eccentricity#;
+
+ % y shift offset
+ save yoffs;
+
+ if up_shift:
+ yoffs# := 0.08 ht#;
+ elseif down_shift:
+ yoffs# := -0.11 ht#;
+ else:
+ yoffs# := 0.00 ht#;
+ fi;
+
+ define_pixels (convexity, eccentricity, yoffs, ht, wd);
+
+ pickup pencircle scaled linethickness;
+
+ save height, yoffs_bt, p, circle, circle_r;
+ path p, circle, circle_r;
+
+ height# = 0.47 ht#;
+ yoffs_bt# = yoffs# - 0.5 height# - 0.25 convexity#;
+
+ define_pixels (height, yoffs_bt);
+
+ circle := fullcircle scaled linethickness;
+
+ x1 = x6;
+ x2 = x5;
+ x3 = x4;
+ y1 + height = y6;
+ y2 + height = y5;
+ y3 + height = y4;
+
+ save box_top, box_bt;
+
+ if auctum:
+ z1 = (0.00 wd + linethickness / 2, yoffs_bt);
+ z2 = (0.21 wd, yoffs_bt + convexity);
+ z3 = (0.42 wd - linethickness/ 2,
+ yoffs_bt + eccentricity);
+ box_top# = height# + yoffs_bt# +
+ max (0, convexity#, eccentricity#);
+ box_bt# = yoffs_bt# +
+ min (0, convexity#, eccentricity#);
+ p = z1
+ .. {right}z2
+ .. {d_}z3
+ -- z4{-d_}
+ .. z5{left}
+ .. z6
+ -- cycle;
+ else:
+ z1 = (0.00 wd + linethickness / 2, yoffs_bt);
+ z2 = (0.21 wd, yoffs_bt + convexity);
+ z3 = (0.42 wd - linethickness / 2, yoffs_bt);
+ box_top# = height# + yoffs_bt# + max (0, convexity#);
+ box_bt# = yoffs_bt# + min (0, convexity#);
+ p = z1
+ .. z2
+ .. z3
+ -- z4
+ .. z5
+ .. z6
+ -- cycle;
+ fi;
+
+ labels (1, 2, 3, 4, 5, 6);
+
+ save dirs;
+ pair dirs[];
+
+ dirs12 := direction (0 + epsilon) of p;
+ dirs2 := direction 1 of p;
+ dirs32 := direction (2 - epsilon) of p;
+ dirs45 := direction (3 + epsilon) of p;
+ dirs5 := direction 4 of p;
+ dirs65 := direction (5 - epsilon) of p;
+
+ fill get_subpath (circle, down, dirs12, z1)
+ .. (bot z2){dirs2}
+ .. get_subpath (circle, dirs32, up, z3)
+ -- get_subpath (circle, up, dirs45, z4)
+ .. (top z5){dirs5}
+ .. get_subpath (circle, dirs65, down, z6)
+ -- cycle;
+
+ if cavum:
+ save pat, t;
+ path pat[];
+ numeric t[];
+
+ pat123 := ((directionpoint -dirs12 of circle)
+ shifted z1){dirs12}
+ .. (top z2){dirs2}
+ .. {dirs32}((directionpoint -dirs32 of circle)
+ shifted z3);
+ pat34 := lft z3
+ -- lft z4;
+ pat456 := ((directionpoint -dirs45 of circle)
+ shifted z4){dirs45}
+ .. (bot z5){dirs5}
+ .. {dirs65}((directionpoint -dirs65 of circle)
+ shifted z6);
+ pat61 := rt z6
+ -- rt z1;
+
+ t61 := ypart (pat61 intersectiontimes pat123);
+ t12 := xpart (pat123 intersectiontimes pat34);
+ t34 := ypart (pat34 intersectiontimes pat456);
+ t45 := xpart (pat456 intersectiontimes pat61);
+
+ unfill subpath (t61, t12) of pat123
+ -- subpath (t34, t45) of pat456
+ -- cycle;
+ fi;
+
+ set_char_box (0.00 wd#, 0.42 wd#,
+ max (0, -box_bt#) + linethickness# / 2,
+ max (0, box_top#) + linethickness# / 2);
+
+ if linea:
+ save linea_width, linea_height;
+
+ linea_width# = 0.6 linethickness#;
+ linea_height# = 0.7 ht#;
+
+ define_pixels (linea_width, linea_height);
+
+ pickup pencircle scaled 0.6 linethickness;
+
+ draw_rounded_block ((-0.10 wd - linea_width / 2,
+ -linea_height / 2),
+ (-0.10 wd + linea_width / 2,
+ +linea_height / 2),
+ 0.6 linethickness);
+ draw_rounded_block ((+0.52 wd - linea_width / 2,
+ -linea_height / 2),
+ (+0.52 wd + linea_width / 2,
+ +linea_height / 2),
+ 0.6 linethickness);
+
+ set_char_box (0, 0.62 wd# + linea_width#,
+ linea_height# / 2,
+ linea_height# / 2);
+
+ currentpicture := currentpicture
+ shifted (0.10 wd + linea_width / 2, 0);
+ fi;
+ fet_endchar;
+enddef;
+
+
+def plica_char (expr verbose_name, internal_name,
+ d_up, mag) =
+ fet_beginchar (verbose_name, "s" & internal_name);
+ save a_b, b_h, a_w;
+
+ a_b := 1.54; % b_h * a_b / a_w = wd / ht
+ b_h := 0.85;
+ a_w := 1.09;
+
+ save a, beta, ht, wd;
+
+ ht# = noteheight# * mag;
+ 2 beta = ht# * b_h;
+ a = beta * a_b;
+ wd# = 2 a / a_w;
+ black_notehead_width# := wd#;
+
+ % direction
+ save d_, d_sign;
+ pair d_;
+
+ if d_up:
+ d_ := up;
+ d_sign := 1;
+ else:
+ d_ := down;
+ d_sign := -1;
+ fi;
+
+ % convexity and eccentricity
+ save convexity, eccentricity;
+
+ convexity# := d_sign * -0.10 ht#;
+ eccentricity# := d_sign * -0.12 ht#;
+
+ % y shift offset
+ save yoffs;
+
+ yoffs# := -0.11 ht#;
+
+ define_pixels (convexity, eccentricity, yoffs, ht, wd);
+
+ pickup pencircle scaled linethickness;
+
+ save height, yoffs_bt, p, circle, circle_r;
+ path p, circle, circle_r;
+
+ height# = 0.47 ht#;
+ yoffs_bt# = yoffs# - 0.5 height# - 0.25 convexity#;
+
+ define_pixels (height, yoffs_bt);
+
+ circle := fullcircle scaled linethickness;
+
+ x1 = x6;
+ x2 = x5;
+ x3 = x4;
+ y1 + height = y6;
+ y2 + height = y5;
+ y3 + height = y4;
+
+ save box_top, box_bt;
+
+ z1 = (0.00 wd + linethickness / 2, yoffs_bt);
+ z2 = (0.21 wd, yoffs_bt + convexity);
+ z3 = (0.42 wd - linethickness/ 2, yoffs_bt + eccentricity);
+ box_top# = height# + yoffs_bt# +
+ max (0, convexity#, eccentricity#);
+ box_bt# = yoffs_bt# +
+ min (0, convexity#, eccentricity#);
+ p = z1
+ .. z2{right}
+ .. z3
+ -- z4
+ .. z5{left}
+ .. z6
+ -- cycle;
+
+ labels (1, 2, 3, 4, 5, 6);
+
+ save dirs;
+ pair dirs[];
+
+ dirs12 := direction (0 + epsilon) of p;
+ dirs2 := direction 1 of p;
+ dirs32 := direction (2 - epsilon) of p;
+ dirs45 := direction (3 + epsilon) of p;
+ dirs5 := direction 4 of p;
+ dirs65 := direction (5 - epsilon) of p;
+
+ fill get_subpath (circle, down, dirs12, z1)
+ .. (bot z2){dirs2}
+ .. get_subpath (circle, dirs32, up, z3)
+ -- get_subpath (circle, up, dirs45, z4)
+ .. (top z5){dirs5}
+ .. get_subpath (circle, dirs65, down, z6)
+ -- cycle;
+
+ pickup pencircle scaled 0.6 linethickness;
+
+ save stem_bt;
+
+ set_char_box (0.00 wd#, 0.42 wd#,
+ max (0, -box_bt#) + linethickness# / 2,
+ max (0, box_top#) + linethickness# / 2);
+
+ fet_endchar;
+enddef;
+
+
+def epiphonus_char (expr verbose_name, internal_name,
+ left_stem, d_up, down_shift, mag) =
+ fet_beginchar (verbose_name, "s" & internal_name);
+ save a_b, b_h, a_w;
+
+ a_b := 1.54; % b_h * a_b / a_w = wd / ht
+ b_h := 0.85;
+ a_w := 1.09;
+
+ save a, beta, ht, wd;
+
+ ht# = noteheight# * mag;
+ 2 beta = ht# * b_h;
+ a = beta * a_b;
+ wd# = 2 a / a_w;
+ black_notehead_width# := wd#;
+
+ % direction
+ save d_, d_sign;
+ pair d_;
+
+ if d_up:
+ d_ := up;
+ d_sign := 1;
+ else:
+ d_ := down;
+ d_sign := -1;
+ fi;
+
+ % convexity and eccentricity
+ save convexity;
+
+ convexity# := d_sign * -0.05ht#;
+
+ % y shift offset
+ save yoffs;
+
+ if down_shift:
+ yoffs# := -0.11 ht#;
+ else:
+ yoffs# := 0.00 ht#;
+ fi;
+
+ define_pixels (convexity, yoffs, ht, wd);
+
+ pickup pencircle scaled linethickness;
+
+ save height, yoffs_bt, p, circle, circle_r;
+ path p, circle, circle_r;
+
+ height# = 0.47 ht#;
+ yoffs_bt# = yoffs# - 0.5 height# - 0.25 convexity#;
+
+ define_pixels (height, yoffs_bt);
+
+ circle := fullcircle scaled linethickness;
+
+ x1 = x6;
+ x2 = x5;
+ x3 = x4;
+ y1 + height = y6;
+ y2 + height = y5;
+ y3 + height = y4;
+
+ save box_top, box_bt;
+
+ z1 = (0.00 wd + linethickness / 2, yoffs_bt - 2.5 convexity);
+ z2 = (0.06 wd, yoffs_bt + 1.4 convexity);
+ z3 = (0.42 wd - linethickness / 2, yoffs_bt - 1.0 convexity);
+ box_top# = height# + yoffs_bt# +
+ max (-1.0 convexity#, 1.4 convexity#, 0);
+ box_bt# = yoffs_bt# +
+ min (-1.0 convexity#, 1.4 convexity#, 0);
+ p = z1{-d_}
+ .. {curl 1}z2{right}
+ .. z3
+ -- z4
+ .. {left}z5{curl 1}
+ .. {d_}z6
+ -- cycle;
+
+ labels (1, 2, 3, 4, 5, 6);
+
+ save dirs;
+ pair dirs[];
+
+ dirs12 := direction (0 + epsilon) of p;
+ dirs21 := direction (1 - epsilon) of p;
+ dirs23 := direction (1 + epsilon) of p;
+ dirs32 := direction (2 - epsilon) of p;
+ dirs45 := direction (3 + epsilon) of p;
+ dirs54 := direction (4 - epsilon) of p;
+ dirs56 := direction (4 + epsilon) of p;
+ dirs65 := direction (5 - epsilon) of p;
+
+ fill get_subpath (circle, down, dirs12, z1)
+ .. get_subpath (circle, dirs21, dirs23, z2)
+ .. get_subpath (circle, dirs32, up, z3)
+ -- get_subpath (circle, up, dirs45, z4)
+ .. get_subpath (circle, dirs54, dirs56, z5)
+ .. get_subpath (circle, dirs65, down, z6)
+ -- cycle;
+
+ save stem_bt;
+
+ if left_stem:
+ pickup pencircle scaled 0.6 linethickness;
+
+ lft x11 = x1 - linethickness / 2;
+ bot y11 = yoffs - 1.1 ht - linethickness / 2;
+ x12 = x11;
+ y12 = y1;
+
+ draw_rounded_block (bot lft z11, top rt z12,
+ 0.6 linethickness);
+ stem_bt# = yoffs# - 1.1 ht#;
+
+ labels (11, 12);
+ else:
+ stem_bt# = 0;
+ fi;
+
+ set_char_box (0.00 wd#, 0.42 wd#,
+ max (0, -box_bt#, -stem_bt#) + linethickness# / 2,
+ max (0, box_top#) + linethickness# / 2);
+ fet_endchar;
+enddef;
+
+
+def inclinatum_char (expr verbose_name, internal_name,
+ small, stropha, auctum) =
+ fet_beginchar (verbose_name, "s" & internal_name);
+ save ht, alpha;
+
+ alpha := 35;
+
+ if small:
+ ht# = 0.50 noteheight#;
+ else:
+ ht# = 0.80 noteheight#;
+ fi;
+
+ draw_diamond_head (ht#, 0, 0, alpha, false);
+
+ save off_angle;
+
+ off_angle := alpha + 15;
+
+ save stropha_ellipse, auctum_hook, circle;
+ path stropha_ellipse, auctum_hook, circle;
+
+ circle := reverse fullcircle scaled linethickness;
+
+ stropha_ellipse := fullcircle xscaled 0.25 head_height
+ yscaled 0.55 head_height
+ rotated alpha;
+
+ z11 = z12
+ + linethickness / 2 * dir (180 - off_angle)
+ - directionpoint dir (90 - off_angle)
+ of stropha_ellipse;
+ z12 = directionpoint -dir (90 - off_angle) of diamond_shape +
+ linethickness / 2 * dir (180 - off_angle);
+ z13 = (0, -0.5 head_height + linethickness);
+
+ auctum_hook := z12{-dir (90 - off_angle)}
+ .. {dir (90 + alpha)}z13;
+
+ labels (12);
+
+ if (stropha and not auctum):
+ clearit;
+
+ save t_in, t_out;
+
+ t_in := xpart ((stropha_ellipse shifted z11)
+ intersectiontimes
+ get_subpath (diamond_shape,
+ left, up,
+ (0, 0)));
+ t_out := xpart ((stropha_ellipse shifted z11)
+ intersectiontimes
+ get_subpath (diamond_shape,
+ up, right,
+ (0, 0)));
+
+ % the addition or subtraction of `1' is necessary
+ % so that we get the right starting point
+ fill get_subpath_i (diamond_shape,
+ dir (angle (z2 - z1) - 1),
+ dir (angle (z1 - z4) + 1),
+ (0, 0))
+ -- get_subpath (stropha_ellipse,
+ direction t_in of stropha_ellipse,
+ direction t_out of stropha_ellipse,
+ z11)
+ -- cycle;
+
+ labels (11);
+ fi;
+
+ if (auctum and not stropha):
+ clearit;
+
+ fill get_subpath (diamond_shape,
+ left,
+ -dir (90 - off_angle),
+ (0, 0))
+ .. get_subpath (circle,
+ dir (90 + alpha),
+ -dir (90 + alpha),
+ z13)
+ .. get_subpath (circle,
+ dir (90 - off_angle),
+ right,
+ z12)
+ -- cycle;
+
+ labels (13);
+ fi;
+
+ if (auctum and stropha):
+ clearit;
+
+ save t;
+
+ t := xpart ((stropha_ellipse shifted z11)
+ intersectiontimes
+ get_subpath (diamond_shape, up, right,
+ (0, 0)));
+
+ % the addition or subtraction of `1' is necessary
+ % so that we get the right starting point
+ fill get_subpath_i (diamond_shape,
+ dir (angle (z2 - z1) - 1),
+ -dir (90 - off_angle),
+ (0, 0))
+ .. get_subpath (circle,
+ dir (90 + alpha),
+ -dir (90 + alpha),
+ z13)
+ .. get_subpath (stropha_ellipse,
+ dir (90 - off_angle),
+ direction t of stropha_ellipse,
+ z11)
+ -- cycle;
+
+ labels (11, 13);
+ fi;
+ fet_endchar;
+enddef;
+
+
+% punctum
+vat_punctum_char ("Ed. Vat. punctum", "vaticana.punctum",
+ false, false, false, false,
+ false, false, false, 1.0);
+
+
+% punctum cavum (for OpusTeX compatibility)
+vat_punctum_char ("Ed. Vat. punctum cavum", "vaticana.punctum.cavum",
+ false, true, false, false,
+ false, false, false, 1.0);
+
+
+% linea punctum (for OpusTeX compatibility)
+vat_punctum_char ("Ed. Vat. linea punctum", "vaticana.linea.punctum",
+ true, false, false, false,
+ false, false, false, 1.0);
+
+
+% linea punctum cavum (for OpusTeX compatibility)
+vat_punctum_char ("Ed. Vat. linea punctum cavum", "vaticana.linea.punctum.cavum",
+ true, true, false, false,
+ false, false, false, 1.0);
+
+
+% punctum inclinatum
+inclinatum_char ("Ed. Vat. inclinatum", "vaticana.inclinatum",
+ false, false, false);
+
+
+% pes lower punctum
+vat_punctum_char ("Ed. Vat. pes lower punctum", "vaticana.lpes",
+ false, false, true, false,
+ true, false, false, 1.0);
+
+
+% pes lower punctum
+vat_punctum_char ("Ed. Vat. pes var lower punctum", "vaticana.vlpes",
+ false, false, true, false,
+ true, false, true, 1.0);
+
+
+% pes upper punctum
+vat_punctum_char ("Ed. Vat. pes upper punctum", "vaticana.upes",
+ false, false, true, false,
+ false, false, false, 1.0);
+
+
+% pes upper punctum (shifted variation)
+%
+% This note head is used instead of the regular pes upper punctum to
+% avoid collision with the lower punctum note of the pes when the upper
+% punctum sits directly on top of the lower punctum.
+%
+vat_punctum_char ("Ed. Vat. var pes upper punctum", "vaticana.vupes",
+ false, false, true, false,
+ false, true, false, 1.0);
+
+
+% small punctum as used in epiphonus
+vat_punctum_char ("Ed. Vat. plica", "vaticana.plica",
+ false, false, false, false,
+ false, false, false, 0.6);
+
+
+% small punctum as used in epiphonus
+plica_char ("Ed. Vat. var plica", "vaticana.vplica",
+ false, 0.6);
+
+
+% eccentric punctum as used in epiphonus
+epiphonus_char ("Ed. Vat. epiphonus", "vaticana.epiphonus",
+ false, true, false, 1.0);
+
+
+% eccentric punctum as used in epiphonus (shifted variation)
+%
+% This note head is used instead of the regular epiphonus punctum to
+% avoid collision with the plica head when the plica sits directly on
+% top of the lower head.
+%
+epiphonus_char ("Ed. Vat. var epiphonus", "vaticana.vepiphonus",
+ false, true, true, 1.0);
+
+
+% small punctum as used in cephalicus
+vat_punctum_char ("Ed. Vat. rev. plica", "vaticana.reverse.plica",
+ false, false, false, false,
+ true, false, false, 0.6);
+
+
+% small punctum as used in cephalicus
+plica_char ("Ed. Vat. rev. var plica", "vaticana.reverse.vplica",
+ true, 0.6);
+
+
+% eccentric punctum as used in cephalicus; without left stem
+epiphonus_char ("Ed. Vat. inner cephalicus", "vaticana.inner.cephalicus",
+ false, false, false, 1.0);
+
+
+% eccentric punctum as used in cephalicus; with left stem
+epiphonus_char ("Ed. Vat. cephalicus", "vaticana.cephalicus",
+ true, false, false, 1.0);
+
+
+% quilisma
+fet_beginchar ("Ed. Vat. quilisma", "svaticana.quilisma");
+ save a_b, b_h, a_w;
+
+ a_b := 1.54; % b_h * a_b / a_w = wd / ht
+ b_h := 0.85;
+ a_w := 1.09;
+
+ save a, beta, ht, wd;
+
+ ht# = noteheight#;
+ 2 beta = ht# * b_h;
+ a = beta * a_b;
+ wd# = 2 a / a_w;
+
+ set_char_box (0, 0.42 wd#, 0.28 ht#, 0.36 ht#);
+
+ black_notehead_width# := wd#;
+
+ define_pixels (ht, wd);
+
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled linethickness
+ yscaled 0.44 ht;
+ pickup pencircle transformed T;
+ ellipse := reverse fullcircle transformed T;
+
+ z1 = (rt 0.00 wd, top -0.28 ht);
+ z2 = (0.11 wd, -0.14 ht);
+ z3 = (0.12 wd, +0.03 ht);
+ z4 = (0.25 wd, -0.09 ht);
+ z5 = (0.25 wd, +0.08 ht);
+ z6 = (lft 0.42 wd, -0.04 ht);
+ z7 = (lft 0.40 wd, bot +0.36 ht);
+
+ fill get_subpath (ellipse, z1 - z2, z2 - z1, z1)
+ -- get_subpath (ellipse, z2 - z1, z1 - z2, z2)
+ -- cycle;
+ fill get_subpath (ellipse, z3 - z4, z4 - z3, z3)
+ -- get_subpath (ellipse, z4 - z3, z3 - z4, z4)
+ -- cycle;
+ fill get_subpath (ellipse, z5 - z6, z6 - z5, z5)
+ -- point 0 of get_subpath (ellipse, z6 - z5, z5 - z6, z6)
+ -- get_subpath (ellipse, z7 - z6, z6 - z7, z7)
+ -- get_subpath (ellipse, z6 - z7, z5 - z6, z6)
+ -- cycle;
+
+ labels (1, 2, 3, 4, 5, 6, 7);
+fet_endchar;
+
+
+% solesmes punctum inclinatum parvum
+inclinatum_char ("Solesmes punctum inclinatum parvum", "solesmes.incl.parvum",
+ true, false, false);
+
+
+% solesmes punctum auctum ascendens
+vat_punctum_char ("Solesmes punctum auctum ascendens", "solesmes.auct.asc",
+ false, false, false, true,
+ true, false, false, 1.0);
+
+
+% solesmes punctum auctum descendens
+vat_punctum_char ("Solesmes punctum auctum descendens", "solesmes.auct.desc",
+ false, false, false, true,
+ false, false, false, 1.0);
+
+
+% solesmes punctum inclinatum auctum
+inclinatum_char ("Solesmes punctum incl. auctum", "solesmes.incl.auctum",
+ false, false, true);
+
+
+% solesmes stropha
+inclinatum_char ("Solesmes stropha", "solesmes.stropha",
+ false, true, false);
+
+
+% solesmes stropha aucta
+inclinatum_char ("Solesmes stropha aucta", "solesmes.stropha.aucta",
+ false, true, true);
+
+
+% solesmes oriscus
+fet_beginchar ("Solesmes oriscus", "ssolesmes.oriscus");
+ save a_b, b_h, a_w;
+
+ a_b := 1.54; % b_h * a_b / a_w = wd / ht
+ b_h := 0.85;
+ a_w := 1.09;
+
+ save a, beta, ht, wd;
+
+ ht# = noteheight#;
+ 2 beta = ht# * b_h;
+ a = beta * a_b;
+ wd# = 2 a / a_w;
+ black_notehead_width# := wd#;
+
+ save convexity;
+
+ convexity# = +0.05 ht#;
+
+ define_pixels (ht, wd, convexity);
+
+ set_char_box (0.00 wd#, 0.50 wd#,
+ 0.25 ht# + convexity#, 0.25 ht# + convexity#);
+
+ z1 = (0.00 wd + blot_diameter / 2, -convexity);
+ z2 = (1/6 wd, +convexity);
+ z3 = (2/6 wd, -convexity);
+ z4 = (0.50 wd - blot_diameter / 2, +convexity);
+
+
+ save height;
+
+ height = 2 ypart (directionpoint right of (z1
+ .. z2
+ .. z3
+ .. z4));
+
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled blot_diameter
+ yscaled (h + d - height);
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ % Adjust vertical coordinates to touch bounding box.
+ y1 := top -d;
+ y4 := bot h;
+
+ save d_;
+ pair d_;
+
+ d_ := direction 0 of (z1
+ .. z2
+ .. z3
+ .. z4);
+
+ fill get_subpath (ellipse, -d_, d_, z1)
+ .. bot z2
+ .. bot z3
+ .. get_subpath (ellipse, d_, -d_, z4)
+ .. top z3
+ .. top z2
+ .. cycle;
+
+ labels (1, 2, 3, 4);
+fet_endchar;
+
+
+%%%%%%%%
+%
+%
+%
+% EDITIO MEDICAEA
+%
+%
+%
+
+% inclinatum
+fet_beginchar ("Ed. Med. inclinatum", "smedicaea.inclinatum");
+ draw_diamond_head (1.2 staff_space#, 0, 0, 35, false);
+fet_endchar;
+
+
+def med_punctum_char (expr verbose_name, internal_name,
+ left_up_stem, left_down_stem) =
+ fet_beginchar (verbose_name, "s" & internal_name);
+ save a, ht, wd;
+
+ ht# = 2 staff_space#;
+ wd# = ht#;
+ black_notehead_width# := wd#;
+
+ define_pixels (ht, wd);
+
+ save ellipse;
+ path ellipse;
+
+ ellipse := fullcircle xscaled blot_diameter
+ yscaled 0.50 ht;
+
+ z1 = (0.00 wd + blot_diameter / 2, 0);
+ z2 = (0.4 wd - blot_diameter / 2, 0);
+
+ labels (1, 2);
+
+ pickup pencircle scaled linethickness;
+
+ if left_down_stem:
+ z4 = (0.00 wd + linethickness / 2, -1.25 ht);
+
+ fill get_subpath (ellipse, left, down, z1)
+ -- top lft z4{down}
+ .. z4{right}
+ .. top rt z4{up}
+ -- (rt x4, -.5 ht / 2)
+ -- get_subpath (ellipse, right, left, z2)
+ -- cycle;
+
+ labels (4);
+
+ set_char_box (0.0, 0.4 wd#, 1.25 ht#, 0.25 ht#);
+ elseif left_up_stem:
+ z4 = (0.00 wd + linethickness / 2, +1.25 ht);
+
+ fill get_subpath (ellipse, down, right, z1)
+ -- get_subpath (ellipse, right, left, z2)
+ -- (rt x4, .5 ht / 2)
+ -- bot rt z4{up}
+ .. z4{left}
+ .. bot lft z4{down}
+ -- cycle;
+
+ labels (4);
+
+ set_char_box (0.0, 0.4 wd#, 0.25 ht#, 1.25 ht#);
+ else:
+ fill get_subpath (ellipse, left, right, z1)
+ -- get_subpath (ellipse, right, left, z2)
+ -- cycle;
+
+ set_char_box (0.0, 0.4 wd#, 0.25 ht#, 0.25 ht#);
+ fi;
+
+ fet_endchar;
+enddef;
+
+
+% punctum
+med_punctum_char ("Ed. Med. punctum", "medicaea.punctum",
+ false, false);
+
+
+% left up-stemmed punctum
+med_punctum_char ("Ed. Med. reverse virga", "medicaea.rvirga",
+ true, false);
+
+
+% virga (i.e. left down-stemmed punctum)
+med_punctum_char ("Ed. Med. virga", "medicaea.virga",
+ false, true);
+
+
+%%%%%%%%
+%
+%
+%
+% HUFNAGEL
+%
+%
+%
+
+def huf_punctum_char (expr verbose_name, internal_name,
+ down_stem) =
+ fet_beginchar (verbose_name, "s" & internal_name);
+ save alpha;
+
+ alpha = 55;
+
+ draw_diamond_head (staff_space#, 0, 0, alpha, false);
+
+ if down_stem:
+ set_char_box (0, head_width#,
+ 1.5 staff_space#, head_height# / 2);
+
+ save ellipse;
+ path ellipse;
+
+ ellipse := reverse fullcircle xscaled blot_diameter
+ yscaled 0.7 staff_space
+ rotated -alpha;
+
+ z11 = (head_width / 2, 0);
+ z12 = find_tangent_shift (((0, -d) -- (w, -d)), ellipse,
+ (w / 2, -d), (w / 2, 0));
+
+ fill get_subpath (ellipse, up, down, z11)
+ -- get_subpath (ellipse, down, up, z12)
+ -- cycle;
+
+ labels (11, 12);
+ fi;
+ fet_endchar;
+enddef;
+
+
+% punctum
+huf_punctum_char ("Hufnagel punctum", "hufnagel.punctum", false)
+
+
+% virga
+huf_punctum_char ("Hufnagel virga", "hufnagel.virga", true)
+
+
+% pes lower punctum
+fet_beginchar ("Hufnagel pes lower punctum", "shufnagel.lpes")
+ save width, height, alpha;
+
+ width# = 2 * staff_space#;
+ height# = 0.7 * staff_space#;
+ alpha = 35;
+
+ set_char_box (0, width#, height# / 2, height# / 2);
+
+ define_pixels (width, height);
+
+ save circle;
+ path circle;
+
+ circle := reverse fullcircle scaled linethickness;
+
+ pickup pencircle scaled linethickness;
+
+ rt x3 = -lft x1 = width / 2;
+ y2 = y3 = height / 2;
+ y1 = y4 = -height / 2;
+
+ tand (alpha) * (y2 - y1) = x2 - x1 = x3 - x4;
+
+ fill get_subpath (circle, left, z2 - z1, z1)
+ -- get_subpath (circle, z2 - z1, right, z2)
+ -- get_subpath (circle, right, z4 - z3, z3)
+ -- get_subpath (circle, z4 - z3, left, z4)
+ -- cycle;
+
+ currentpicture := currentpicture shifted (width/2, 0);
+
+% labels (1, 2, 3, 4);
+fet_endchar;
+
+
+fet_endgroup ("noteheads");
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan-macros.mf b/muse2/share/scoreglyphs/feta-original/parmesan-macros.mf
new file mode 100644
index 00000000..94d728a3
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan-macros.mf
@@ -0,0 +1,215 @@
+% -%-Fundamental-%- -*-Metafont-*-
+% parmesan-macros.mf -- macros for parmesan font
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+
+
+%
+% Find point on `curve' which gives the tangent between point `p'
+% and `curve'. To guide the search, two auxiliary points must be
+% specified, `p_in' and `p_out'. The line between `p' and `p_in'
+% must intersect `curve', while the line between `p' and `p_out'
+% must not.
+%
+def find_tangent (expr p, curve, p_in, p_out) =
+ begingroup;
+ save mid, t, t_good, in, out;
+ pair mid, in, out;
+
+ in := p_in;
+ out := p_out;
+
+ forever:
+ mid := 0.5 [in, out];
+ exitif abs (out - mid) <= eps;
+ t := xpart (curve intersectiontimes (p -- mid));
+ if t > 0:
+ in := mid;
+ t_good := t;
+ else:
+ out := mid;
+ fi;
+ endfor;
+
+ point t_good of curve
+ endgroup
+enddef;
+
+
+%
+% Shift `curve' along the line given by the auxiliary points `p_in'
+% and `p_out' until `line' is a tangent, and return the shift.
+% If `curve' is shifted to position `p_in', it must intersect
+% `line', while shifted to `p_out' it must not.
+%
+def find_tangent_shift (expr line, curve, p_in, p_out) =
+ begingroup;
+ save mid, t, in, out;
+ pair mid, in, out;
+
+ in := p_in;
+ out := p_out;
+
+ forever:
+ mid := 0.5 [in, out];
+ exitif abs (out - mid) <= eps;
+ t := xpart ((curve shifted mid) intersectiontimes line);
+ if t > 0:
+ in := mid;
+ else:
+ out := mid;
+ fi;
+ endfor;
+
+ mid
+ endgroup
+enddef;
+
+
+%
+% Get subpath specified by `dir_in' and `dir_out' of `curve'
+% which is then shifted by `offset'. Assure that result has
+% the same orientation as `curve'.
+%
+def get_subpath (expr curve, dir_in, dir_out, offset) =
+ begingroup;
+ save t_in, t_out;
+
+ t_in := directiontime dir_in of curve;
+ t_out := directiontime dir_out of curve;
+
+ if t_in > t_out:
+ t_out := t_out + length curve;
+ fi;
+
+ (subpath (t_in, t_out) of curve) shifted offset
+ endgroup
+enddef;
+
+
+%
+% Get point specified by `dir_' of `curve' which is then
+% shifted by `offset'.
+%
+def get_subpoint (expr curve, dir_, offset) =
+ (directionpoint dir_ of curve) shifted offset
+enddef;
+
+
+%
+% This is the same as `get_subpath', except that the time values
+% used to construct the resulting subpath are rounded to integers.
+%
+def get_subpath_i (expr curve, dir_in, dir_out, offset) =
+ begingroup;
+ save t_in, t_out;
+
+ t_in := directiontime dir_in of curve;
+ t_out := directiontime dir_out of curve;
+
+ if t_in > t_out:
+ t_out := t_out + length curve;
+ fi;
+
+ (subpath (floor (t_in + 0.5), floor (t_out + 0.5)) of curve)
+ shifted offset
+ endgroup
+enddef;
+
+
+%
+% Find envelope cusp created by `object' moved along `curve', using
+% step value `s' for initial intermediate points. `s' must be small
+% enough so that this macro finds at least one point on the envelope
+% between the `entrance' and `exit' points of the cusp which has
+% a significantly different direction vector.
+%
+% This function returns a time value on `curve'; if there is no
+% cusp, it returns -1.
+%
+def find_envelope_cusp (expr object, curve, s) =
+ begingroup;
+ save mid, p, t, t_good, delta, start, stop, do_exit;
+ pair p[];
+ boolean do_exit;
+
+ p0 := (directionpoint (direction 0 of curve) of object)
+ shifted (point 0 of curve);
+ p1 := (directionpoint (direction s of curve) of object)
+ shifted (point s of curve);
+
+ t := s;
+
+ forever:
+ t := t + s;
+ exitif t >= length curve;
+
+ p2 := (directionpoint (direction t of curve) of object)
+ shifted (point t of curve);
+ if p2 <> p1:
+ delta := angle (p2 - p1) - angle (p1 - p0);
+ if delta > 180:
+ delta := delta - 360;
+ fi;
+
+ % we check for a direction change by more than
+ % than 45 degrees
+ if abs (delta) >= 45:
+ do_exit := true;
+ else:
+ do_exit := false;
+ fi;
+
+ p0 := p1;
+ p1 := p2;
+ fi;
+
+ % having `exitif' within an if-clause doesn't work
+ exitif do_exit;
+ endfor;
+
+ if t >= length curve:
+ t_good := -1;
+ else:
+ % the wanted point lies between `t - s' and `t'
+ start := t - s;
+ stop := t;
+ t_good := start;
+
+ forever:
+ mid := 0.5 [start, stop];
+ exitif abs (stop - mid) <= eps;
+
+ p0 := (directionpoint (direction start of curve)
+ of object) shifted (point start of curve);
+ p1 := (directionpoint (direction mid of curve)
+ of object) shifted (point mid of curve);
+ p2 := (directionpoint (direction stop of curve)
+ of object) shifted (point stop of curve);
+
+ exitif (length (p1 - p0) = 0)
+ or (length (p2 - p1) = 0);
+
+ delta := angle (p2 - p1) - angle (p1 - p0);
+ if delta > 180:
+ delta := delta - 360;
+ fi;
+
+ if abs (delta) >= 45:
+ stop := mid;
+ t_good := mid;
+ else:
+ start := mid;
+ t_good := stop;
+ fi;
+ endfor;
+ fi;
+
+ t_good
+ endgroup
+enddef;
+
+% EOF
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan-rests.mf b/muse2/share/scoreglyphs/feta-original/parmesan-rests.mf
new file mode 100644
index 00000000..060307db
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan-rests.mf
@@ -0,0 +1,418 @@
+% -%-Fundamental-%- -*-Metafont-*-
+% parmesan-rests.mf -- implement ancient rests
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+% Neo-mensural rests originally by
+% Christian Mondrup and Mats Bengtsson.
+%
+
+fet_begingroup ("rests")
+
+
+%%%%%%%%
+%
+%
+%
+% NEO-MENSURAL NOTATION
+%
+%
+%
+
+% Neo-mensural longa and breve are identical with default longa and breve.
+
+neomens_block_rest_x# = 2/5 staff_space#;
+neomens_block_rest_y# = 1/1 staff_space#;
+neomens_half_block_rest_y# = 5/8 staff_space#;
+
+define_pixels (neomens_block_rest_x,
+ neomens_block_rest_y,
+ neomens_half_block_rest_y);
+
+
+def neomens_half_block_rest =
+ draw_block ((0, 0),
+ (neomens_block_rest_x, neomens_half_block_rest_y));
+enddef;
+
+
+fet_beginchar ("Neo-mensural maxima rest", "M3neomensural");
+ set_char_box (0, 3 neomens_block_rest_x#,
+ neomens_block_rest_y#, neomens_block_rest_y#);
+
+ draw_block ((0, -neomens_block_rest_y),
+ (neomens_block_rest_x, neomens_block_rest_y));
+ addto currentpicture also currentpicture
+ shifted (2 neomens_block_rest_x, 0);
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural longa rest", "M2neomensural");
+ set_char_box (0, neomens_block_rest_x#,
+ neomens_block_rest_y#, neomens_block_rest_y#);
+
+ draw_block ((0, -neomens_block_rest_y),
+ (neomens_block_rest_x, neomens_block_rest_y));
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural breve rest", "M1neomensural");
+ set_char_box (0, neomens_block_rest_x#,
+ 0, neomens_block_rest_y#);
+
+ draw_block ((0, 0),
+ (neomens_block_rest_x, neomens_block_rest_y));
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural whole rest", "0neomensural");
+ set_char_box (0, neomens_block_rest_x#,
+ neomens_half_block_rest_y#, 0);
+
+ neomens_half_block_rest;
+ currentpicture :=
+ currentpicture shifted (0, -neomens_half_block_rest_y);
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural half rest", "1neomensural");
+ set_char_box (0, neomens_block_rest_x#,
+ 0, neomens_half_block_rest_y#);
+
+ neomens_half_block_rest;
+fet_endchar;
+
+
+neomensrestsize# = 0.8 staff_space#;
+
+
+fet_beginchar ("Neo-mensural 4th rest", "2neomensural");
+ set_char_box (0, neomensrestsize#,
+ 0, neomensrestsize#);
+
+ pickup pencircle scaled 2 stafflinethickness;
+
+ lft x1 = 0;
+ bot y1 = 0;
+ lft x2 = lft x3 = 0;
+ top y2 = top y3 = h;
+ rt x4 = w;
+ bot y4 = h / 2;
+
+ z11 = z1 - stafflinethickness * unitvector (z2 - z1);
+ z14 = z4 + stafflinethickness * unitvector (z4 - z3);
+
+ penpos1 (2 stafflinethickness, 0);
+ penpos2 (2 stafflinethickness, 0);
+ penpos3 (2 stafflinethickness, angle (z4 - z3) - 90);
+ penpos4 (2 stafflinethickness, angle (z4 - z3) - 90);
+
+ fill z1l
+ -- z2l
+ -- z2r
+ -- z1r
+ .. z11
+ .. z1l
+ .. cycle;
+ fill z3l
+ -- z4l
+ .. z14
+ .. z4r
+ -- z3r
+ .. z2l{up}
+ .. z3l
+ .. cycle;
+
+ penlabels (1, 2, 3, 4);
+ labels (11, 14);
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural 8th rest", "3neomensural");
+ set_char_box (0, neomensrestsize#,
+ 0, neomensrestsize#);
+
+ pickup pencircle scaled 2 stafflinethickness;
+
+ rt x1 = w;
+ bot y1 = 0;
+ rt x2 = rt x3 = w;
+ top y2 = top y3 = h;
+ lft x4 = 0;
+ bot y4 = h / 2;
+
+ z11 = z1 - stafflinethickness * unitvector (z2 - z1);
+ z14 = z4 + stafflinethickness * unitvector (z4 - z3);
+
+ penpos1 (2 stafflinethickness, 0);
+ penpos2 (2 stafflinethickness, 0);
+ penpos3 (2 stafflinethickness, angle (z4 - z3) - 90);
+ penpos4 (2 stafflinethickness, angle (z4 - z3) - 90);
+
+ fill z1l
+ -- z2l
+ -- z2r
+ -- z1r
+ .. z11
+ .. z1l
+ .. cycle;
+ fill z3l
+ -- z4l
+ .. z14
+ .. z4r
+ -- z3r
+ .. z2r{down}
+ .. z3l
+ .. cycle;
+
+ penlabels (1, 2, 3, 4);
+ labels (11, 14);
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural 16th rest", "4neomensural");
+ set_char_box (0, neomensrestsize#,
+ 0, staff_space#);
+
+ pickup pencircle scaled 2 stafflinethickness;
+
+ rt x1 = w;
+ bot y1 = 0;
+ rt x2 = w;
+ top y2 = h;
+
+ rt x3 = w;
+ top y3 = h;
+ lft x4 = 0;
+ bot y4 = h / 2;
+ rt x5 = w;
+ top y5 = 5/8 h;
+ lft x6 = 0;
+ bot y6 = h / 8;
+
+ z11 = z1 - stafflinethickness * unitvector (z2 - z1);
+ z14 = z4 + stafflinethickness * unitvector (z4 - z3);
+ z16 = z6 + stafflinethickness * unitvector (z6 - z5);
+
+ penpos1 (2 stafflinethickness, 0);
+ penpos2 (2 stafflinethickness, 0);
+ penpos3 (2 stafflinethickness, angle (z4 - z3) - 90);
+ penpos4 (2 stafflinethickness, angle (z4 - z3) - 90);
+ penpos5 (2 stafflinethickness, angle (z6 - z5) - 90);
+ penpos6 (2 stafflinethickness, angle (z6 - z5) - 90);
+
+ fill z1l
+ -- z2l
+ -- z2r
+ -- z1r
+ .. z11
+ .. z1l
+ .. cycle;
+ fill z3l
+ -- z4l
+ .. z14
+ .. z4r
+ -- z3r
+ .. z2r{down}
+ .. z3l
+ .. cycle;
+ fill z5l
+ -- z6l
+ .. z16
+ .. z6r
+ -- z5r
+ -- z5l
+ -- cycle;
+
+ penlabels (1, 2, 3, 4, 5, 6);
+ labels (11, 14, 16);
+fet_endchar;
+
+
+%%%%%%%%
+%
+%
+%
+% MENSURAL NOTATION
+%
+%
+%
+
+pen_width# = 0.3 staff_space#;
+pen_height# = 0;
+pen_rotation = 30;
+slight_pen_rotation = 15;
+
+mens_block_rest_y# = 1/1 staff_space#;
+mens_half_block_rest_y# = 5/8 staff_space#;
+
+define_pixels (mens_block_rest_y, mens_half_block_rest_y,
+ pen_width, pen_height);
+
+
+fet_beginchar ("Mensural maxima rest", "M3mensural");
+ set_char_box (0, pen_width#,
+ mens_block_rest_y#, 2 mens_block_rest_y#);
+
+ pickup pencircle xscaled pen_width
+ yscaled pen_height
+ rotated slight_pen_rotation;
+
+ draw (w / 2, -mens_block_rest_y)
+ -- (w / 2, 2 mens_block_rest_y);
+fet_endchar;
+
+
+fet_beginchar ("Mensural longa rest", "M2mensural");
+ set_char_box (0, pen_width#,
+ mens_block_rest_y#, mens_block_rest_y#);
+
+ pickup pencircle xscaled pen_width
+ yscaled pen_height
+ rotated slight_pen_rotation;
+
+ draw (w / 2, -mens_block_rest_y)
+ -- (w / 2, mens_block_rest_y);
+fet_endchar;
+
+
+fet_beginchar ("Mensural breve rest", "M1mensural");
+ set_char_box (0, pen_width#,
+ 0, mens_block_rest_y#);
+
+ pickup pencircle xscaled pen_width
+ yscaled pen_height
+ rotated slight_pen_rotation;
+
+ draw (w / 2, 0)
+ -- (w / 2, mens_block_rest_y);
+fet_endchar;
+
+
+fet_beginchar ("Mensural whole rest", "0mensural");
+ set_char_box (0, pen_width#,
+ mens_half_block_rest_y#, 0);
+
+ pickup pencircle xscaled pen_width
+ yscaled pen_height
+ rotated slight_pen_rotation;
+
+ draw (w / 2, 0)
+ -- (w / 2, -mens_half_block_rest_y);
+fet_endchar;
+
+
+fet_beginchar ("Mensural half rest", "1mensural");
+ set_char_box (0, pen_width#,
+ 0, mens_half_block_rest_y#);
+
+ pickup pencircle xscaled pen_width
+ yscaled pen_height
+ rotated slight_pen_rotation;
+
+ draw (w / 2, 0)
+ -- (w / 2, mens_half_block_rest_y);
+fet_endchar;
+
+
+mensrestsize# = .8 staff_space#;
+
+
+fet_beginchar ("Mensural 4th rest", "2mensural");
+ set_char_box (0, mensrestsize#,
+ 0, mensrestsize#);
+
+ pickup pencircle xscaled pen_width
+ yscaled pen_height
+ rotated pen_rotation;
+
+ lft x1 = 0;
+ y1 = 0;
+ lft x2 = 0;
+ top y2 = 5/8 h;
+ rt x3 = 1/5 w;
+ bot y3 = 6/8 h;
+ rt x4 = w;
+ bot y4 = 4/8 h;
+
+ draw z1
+ -- z2
+ -- z3
+ -- z4;
+
+ labels (1, 2, 3, 4);
+fet_endchar;
+
+%
+% FIXME: The left sharp corner produces ugly results at lower resolutions.
+%
+fet_beginchar ("Mensural 8th rest", "3mensural");
+ set_char_box (0, mensrestsize#,
+ 0, mensrestsize#);
+
+ pickup pencircle xscaled pen_width
+ yscaled pen_height
+ rotated pen_rotation;
+
+ rt x1 = w;
+ y1 = 0;
+ rt x2 = w;
+ top y2 = 5/8 h;
+ lft x3 = 1/5 w;
+ bot y3 = 6/8 h;
+ lft x4 = 0;
+ bot y4 = 4/8 h;
+
+ draw z1
+ -- z2
+ -- z3
+ -- z4;
+
+ labels (1, 2, 3, 4);
+fet_endchar;
+
+%
+% FIXME: So far, I have never seen a semifusa rest printed. Hence,
+% the shape of this font character is currently pure invention. --jr
+%
+%
+% FIXME: The left sharp corner produces ugly results at lower resolutions.
+%
+fet_beginchar ("Mensural 16th rest", "4mensural");
+ set_char_box (0, mensrestsize#,
+ 0, staff_space#);
+
+ pickup pencircle xscaled pen_width
+ yscaled pen_height
+ rotated pen_rotation;
+
+ rt x1 = w;
+ y1 = 0;
+ rt x2 = w;
+ top y2 = 5.5/8 h;
+ lft x3 = 1/5 w;
+ bot y3 = 6.5/8 h;
+ lft x4 = 0;
+ bot y4 = 4.5/8 h;
+ rt x5 = w;
+ top y5 = 2.5/8 h;
+ lft x6 = 1/5 w;
+ bot y6 = 3.5/8 h;
+ lft x7 = 0;
+ bot y7 = 1.5/8 h;
+
+ draw z1
+ -- z2
+ -- z3
+ -- z4;
+ draw z5
+ -- z6
+ -- z7;
+
+ labels (1, 2, 3, 4, 5, 6, 7);
+fet_endchar;
+
+
+fet_endgroup ("rests")
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan-scripts.mf b/muse2/share/scoreglyphs/feta-original/parmesan-scripts.mf
new file mode 100644
index 00000000..3a43a46a
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan-scripts.mf
@@ -0,0 +1,231 @@
+% -%-Fundamental-%- -*-Metafont-*-
+% parmesan-scripts.mf -- implement ancient script symbols
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+
+fet_begingroup ("scripts");
+
+fet_beginchar ("ictus", "ictus");
+ save ht, wd;
+ ht# = .35 staff_space#;
+ wd# = linethickness#;
+
+ define_pixels (wd, ht);
+
+ save ellipse, T;
+ path ellipse;
+ transform T;
+
+ T := identity xscaled wd
+ yscaled blot_diameter;
+ pickup pencircle transformed T;
+ ellipse := fullcircle transformed T;
+
+ set_char_box (wd# / 2, wd# / 2, ht# / 2, ht# / 2);
+
+ x1 = 0;
+ top y1 = ht / 2;
+ x2 = 0;
+ bot y2 = -ht / 2;
+
+ fill get_subpath (ellipse, up, down, z1)
+ -- get_subpath (ellipse, down, up, z2)
+ -- cycle;
+
+ labels (1, 2);
+fet_endchar;
+
+
+def draw_accentus =
+ save thick, thin, ht, wd;
+
+ thin# = 1 linethickness#;
+ thick# = 1.2 linethickness#;
+ ht# = .35 staff_space#;
+ wd# = .25 staff_space#;
+
+ define_pixels (wd, ht, thin, thick);
+
+ z1 = z2 = (-wd / 2 + thin / 2, -ht / 2 + thin / 2);
+ z3 = z4 = (wd / 2 - thick / 2, ht / 2 - thick / 2);
+
+ penpos1 (thin, angle (z1 - z3));
+ penpos2 (thin, angle (z1 - z3) + 90);
+ penpos3 (thick, angle (z3 - z1) + 90);
+ penpos4 (thick, angle (z3 - z1));
+
+ fill z1r
+ .. z2r
+ -- z3l
+ .. z4r
+ .. z3r
+ -- z2l
+ .. cycle;
+
+ set_char_box (wd#/2, wd#/2, ht#/2, ht#/2);
+enddef;
+
+
+fet_beginchar ("accentus up", "uaccentus");
+ draw_accentus;
+ penlabels (1, 2, 3, 4);
+fet_endchar;
+
+
+fet_beginchar ("accentus down", "daccentus");
+ draw_accentus;
+ y_mirror_char;
+fet_endchar;
+
+
+def draw_half_circle (expr diam) =
+ save diameter, thick;
+
+ diameter# = diam;
+
+ define_pixels (diameter);
+
+ thick = 0.6 linethickness;
+
+ penpos1 (thick, 0);
+ penpos2 (thick, -90);
+ penpos3 (thick, -180);
+
+ z1r = (diameter / 2, 0);
+ z2r = (0, -diameter / 2);
+ z3r = (-diameter / 2, 0);
+
+ penstroke z1e{down}
+ .. z2e{left}
+ .. z3e{up};
+enddef;
+
+
+fet_beginchar ("half circle", "usemicirculus");
+ draw_half_circle (5/16 staff_space#);
+
+ currentpicture := currentpicture yscaled -1;
+
+ set_char_box (diameter# / 2, diameter# / 2,
+ 0, diameter# / 2);
+fet_endchar;
+
+
+fet_beginchar ("half circle", "dsemicirculus");
+ draw_half_circle (5/16 staff_space#);
+
+ set_char_box (diameter# / 2, diameter# / 2,
+ diameter# / 2, 0);
+
+ penlabels (1, 2, 3);
+fet_endchar;
+
+
+fet_beginchar ("circle", "circulus");
+ save diameter, thick;
+
+ diameter# = 5/16 staff_space#;
+
+ define_pixels (diameter);
+
+ thick = 0.6 linethickness;
+
+ fill fullcircle scaled diameter;
+ unfill fullcircle scaled (diameter - 2 thick);
+
+ set_char_box (diameter# / 2, diameter# / 2,
+ diameter# / 2, diameter# / 2);
+fet_endchar;
+
+
+fet_beginchar ("augmentum", "augmentum");
+ save diameter;
+
+ diameter# = 0.25 staff_space#;
+
+ define_pixels (diameter);
+
+ pickup pencircle scaled diameter;
+
+ drawdot (0, 0);
+
+ set_char_box (diameter# / 2, diameter# / 2,
+ diameter# / 2, diameter# / 2);
+fet_endchar;
+
+
+def draw_signum_congruentiae =
+ set_char_box (0.50 staff_space# + 1.5 linethickness#,
+ 0.50 staff_space# + 1.5 linethickness#,
+ 2.5 linethickness#,
+ 2.00 staff_space# + 3.5 linethickness#);
+
+ save ellipse, pat;
+ path ellipse, pat;
+
+ ellipse := fullcircle xscaled 1.0 linethickness
+ yscaled 5.0 linethickness
+ rotated -35;
+
+ z1 = (+0.50 staff_space, +2.00 staff_space);
+ z2 = (+0.00 staff_space, +2.00 staff_space);
+ z3 = (-0.50 staff_space, +1.50 staff_space);
+ z4 = (-0.25 staff_space, +1.00 staff_space);
+ z5 = (+0.10 staff_space, +0.80 staff_space);
+ z6 = (+0.00 staff_space, +0.00 staff_space);
+
+ pat := z1{-1, +1}
+ .. z2
+ .. z3
+ .. z4
+ .. z5
+ .. z6;
+
+ % we avoid cusps originally present in `draw pat'
+ fill get_subpath (ellipse,
+ -direction 0 of pat, direction 0 of pat, z1)
+ .. get_subpoint (ellipse, direction 1 of pat, z2)
+ {direction 1 of pat}
+ .. get_subpoint (ellipse, direction 2 of pat, z3)
+ {direction 2 of pat}
+ .. get_subpoint (ellipse, direction 3 of pat, z4)
+ {direction 3 of pat}
+ .. get_subpoint (ellipse, direction 4 of pat, z5)
+ {direction 4 of pat}
+ .. get_subpath (ellipse,
+ direction 4.8 of pat, -direction 5 of pat, z6)
+ .. get_subpoint (ellipse, -direction 4 of pat, z5)
+ {-direction 4 of pat}
+ .. get_subpoint (ellipse, -direction 3 of pat, z4)
+ {-direction 3 of pat}
+ .. get_subpoint (ellipse, -direction 2.5 of pat, point 2.5 of pat)
+ .. get_subpoint (ellipse, -direction 1 of pat, z2)
+ {-direction 1 of pat}
+ .. cycle;
+
+ pickup pencircle scaled 3.0 linethickness;
+
+ z7 = (-0.5 staff_space, +0.0 staff_space);
+ z8 = (+0.5 staff_space, +0.0 staff_space);
+
+ drawdot z7;
+ drawdot z8;
+enddef;
+
+
+fet_beginchar ("signum congruentiae up", "usignumcongruentiae");
+ draw_signum_congruentiae;
+ labels (1, 2, 3, 4, 5, 6, 7, 8);
+fet_endchar;
+
+
+fet_beginchar ("signum congruentiae down", "dsignumcongruentiae");
+ draw_signum_congruentiae;
+ xy_mirror_char;
+fet_endchar;
+
+
+fet_endgroup ("scripts");
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan-timesig.mf b/muse2/share/scoreglyphs/feta-original/parmesan-timesig.mf
new file mode 100644
index 00000000..8d0ab9d4
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan-timesig.mf
@@ -0,0 +1,395 @@
+% -%-Fundamental-%- -*-Metafont-*-
+% parmesan-timesig.mf -- implement ancient time signatures
+%
+% source file of LilyPond's pretty-but-neat music font
+%
+% (c) 1998--2009 Mats Bengtsson <matsb@s3.kth.se>,
+% Christian Mondrup <scancm@biobase.dk>
+% (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+
+fet_begingroup ("timesig");
+
+
+path threequartercircle;
+
+threequartercircle := halfcircle & quartercircle rotated 180;
+
+save mensural_Cdiameter, mensural_Cthickness, mensural_Chairpin;
+
+mensural_Cdiameter# := 3/2 staff_space#;
+mensural_Cthickness# := 2 linethickness#;
+mensural_Chairpin# := 0.5 linethickness#;
+
+define_pixels (mensural_Cdiameter, mensural_Cthickness, mensural_Chairpin);
+
+
+%%%%%%%%
+%
+%
+%
+% MENSURAL NOTATION
+%
+%
+%
+
+def draw_nail (expr bottom_left, top_right) =
+ save round;
+
+ round = floor min (blot_diameter,
+ xpart (top_right-bottom_left),
+ ypart (top_right-bottom_left));
+
+ pickup pencircle scaled round;
+
+ z2 + (round / 2, round / 2) = top_right +
+ (mensural_Cthickness / 2, 0);
+ z4 - (round / 2,round / 2) = bottom_left;
+ y3 = y2;
+ y4 = y1;
+ x2 = x1 + mensural_Cthickness / 2;
+ x2 - x1 = x4 - x3;
+ x5 = x1;
+ x6 = x4;
+ y5 = y6 = y2 - 2 mensural_Cthickness;
+
+ fill bot z1{right}
+ .. rt z1{up}
+ -- rt z5{up}
+ .. rt z2
+ .. top z2{left}
+ -- top z3{left}
+ .. lft z3
+ .. lft z6{down}
+ -- lft z4{down}
+ .. bot z4{right}
+ -- cycle;
+
+% labels (1, 2, 3, 4, 5, 6);
+enddef;
+
+
+def mensural_timesig (expr verbose_name, internal_name,
+ full_circle, reverse_circle, slashed, dotted) =
+ fet_beginchar (verbose_name, internal_name);
+ if slashed:
+ set_char_box (
+ 0,
+ mensural_Cdiameter# + mensural_Cthickness#,
+ .75 (mensural_Cdiameter# + mensural_Cthickness#),
+ .75 (mensural_Cdiameter# + mensural_Cthickness#));
+
+ if (full_circle or dotted):
+ draw_nail ((-mensural_Cthickness / 2, -d),
+ (mensural_Cthickness / 2, h));
+ elseif reverse_circle:
+ draw_nail ((0, -d), (mensural_Cthickness, h));
+ else:
+ draw_nail ((-mensural_Cthickness, -d), (0, h));
+ fi;
+ else:
+ set_char_box (
+ 0,
+ mensural_Cdiameter# + mensural_Cthickness#,
+ .5 (mensural_Cdiameter# + mensural_Cthickness#),
+ .5 (mensural_Cdiameter# + mensural_Cthickness#));
+ fi;
+
+ save ellipse, pat;
+ path ellipse, pat;
+
+ ellipse := fullcircle xscaled mensural_Cthickness
+ yscaled mensural_Chairpin;
+
+ save rot;
+
+ if reverse_circle:
+ rot := 225;
+ else:
+ rot := 45;
+ fi;
+
+ if full_circle:
+ pat := fullcircle scaled mensural_Cdiameter;
+
+ fill get_subpoint (ellipse,
+ direction 0 of pat,
+ point 0 of pat)
+ for i = 1 step 1 until length pat:
+ .. get_subpoint (ellipse,
+ direction i of pat,
+ point i of pat)
+ endfor
+ .. cycle;
+ unfill get_subpoint (ellipse,
+ -direction 0 of pat,
+ point 0 of pat)
+ for i = 1 step 1 until length pat:
+ .. get_subpoint (ellipse,
+ -direction i of pat,
+ point i of pat)
+ endfor
+ .. cycle;
+ else:
+ pat := threequartercircle rotated rot
+ scaled mensural_Cdiameter;
+
+ fill get_subpath (ellipse,
+ -direction 0 of pat,
+ direction 0 of pat,
+ point 0 of pat)
+ for i = 1 step 1 until (length pat - 1):
+ .. get_subpoint (ellipse,
+ direction i of pat,
+ point i of pat)
+ endfor
+ .. get_subpath (ellipse,
+ direction infinity of pat,
+ -direction infinity of pat,
+ point infinity of pat)
+ for i = (length pat - 1) step -1 until 1:
+ .. get_subpoint (ellipse,
+ -direction i of pat,
+ point i of pat)
+ endfor
+ .. cycle;
+ fi;
+
+ if dotted:
+ pickup pencircle scaled 4 linethickness;
+ drawdot (0, 0);
+ fi;
+
+ currentpicture := currentpicture
+ shifted 0.5 (mensural_Cdiameter
+ + mensural_Cthickness, 0);
+ fet_endchar;
+enddef;
+
+
+%% tempus imperfectum cum prolatione imperfecta
+mensural_timesig ("Mensural 4/4 meter", "mensural44",
+ false, false, false, false);
+
+
+%% tempus imperfectum cum prolatione imperfecta proportio dupla
+mensural_timesig ("Mensural 2/2 meter", "mensural22",
+ false, false, true, false);
+
+
+%% tempus perfectum cum prolatione imperfecta
+mensural_timesig ("Mensural 3/2 meter", "mensural32",
+ true, false, false, false);
+
+
+%% tempus imperfectum cum prolatione perfecta
+mensural_timesig ("Mensural 6/4 meter", "mensural64",
+ false, false, false, true);
+
+
+%% tempus perfectum cum prolatione perfecta
+mensural_timesig ("Mensural 9/4 meter", "mensural94",
+ true, false, false, true);
+
+
+%% tempus perfectum cum prolatione imperfecta proportio dupla
+mensural_timesig ("Mensural 3/4 meter", "mensural34",
+ true, false, true, false);
+
+
+%% tempus imperfectum cum prolatione perfecta proportio dupla
+mensural_timesig ("Mensural 6/8 meter", "mensural68",
+ false, false, true, true);
+
+
+%% tempus perfectum cum prolatione perfecta proportio dupla
+mensural_timesig ("Mensural 9/8 meter", "mensural98",
+ true, false, true, true);
+
+
+%% tempus imperfectum cum prolatione imperfecta diminutio simplex
+mensural_timesig ("Mensural 4/8 meter", "mensural48",
+ false, true, false, false);
+
+
+%% tempus imperfectum cum prolatione perfecta diminutio simplex
+mensural_timesig ("Mensural 6/8 meter", "mensural68alt",
+ false, true, false, true);
+
+
+%% tempus imperfectum cum prolatione imperfecta diminutio duplex
+mensural_timesig ("Mensural 2/4 meter", "mensural24",
+ false, true, true, false);
+
+
+%%%%%%%%
+%
+%
+%
+% NEO-MENSURAL NOTATION
+%
+%
+%
+
+save neomensural_Cdiameter, neomensural_Cthickness;
+
+neomensural_Cdiameter# := 3/2 staff_space#;
+neomensural_Cthickness# := 2 linethickness#;
+
+define_pixels (neomensural_Cdiameter, neomensural_Cthickness);
+
+
+def neomensural_timesig (expr verbose_name, internal_name,
+ full_circle, reverse_circle, slashed, dotted) =
+ fet_beginchar (verbose_name, internal_name);
+ set_char_box (
+ 0,
+ neomensural_Cdiameter# + neomensural_Cthickness#,
+ .5 (neomensural_Cdiameter# + neomensural_Cthickness#),
+ .5 (neomensural_Cdiameter# + neomensural_Cthickness#));
+
+ if slashed:
+ pickup penrazor scaled neomensural_Cthickness;
+
+ save t;
+ t := neomensural_Cthickness / 2;
+
+ if (full_circle or dotted):
+ draw (0, -d + t)
+ -- (0, h - t);
+ elseif reverse_circle:
+ draw (t, -d + t)
+ -- (t, h - t);
+ else:
+ draw (-t, -d + t)
+ -- (-t, h - t);
+ fi;
+ fi;
+
+ save ellipse, pat;
+ path ellipse, pat;
+
+ ellipse := fullcircle scaled neomensural_Cthickness;
+
+ save rot;
+
+ if reverse_circle:
+ rot := 225;
+ else:
+ rot := 45;
+ fi;
+
+ if full_circle:
+ pat := fullcircle scaled neomensural_Cdiameter;
+
+ fill get_subpoint (ellipse,
+ direction 0 of pat,
+ point 0 of pat)
+ for i = 1 step 1 until length pat:
+ .. get_subpoint (ellipse,
+ direction i of pat,
+ point i of pat)
+ endfor
+ .. cycle;
+ unfill get_subpoint (ellipse,
+ -direction 0 of pat,
+ point 0 of pat)
+ for i = 1 step 1 until length pat:
+ .. get_subpoint (ellipse,
+ -direction i of pat,
+ point i of pat)
+ endfor
+ .. cycle;
+ else:
+ pat := threequartercircle rotated rot
+ scaled neomensural_Cdiameter;
+
+ fill get_subpath (ellipse,
+ -direction 0 of pat,
+ direction 0 of pat,
+ point 0 of pat)
+ for i = 1 step 1 until (length pat - 1):
+ .. get_subpoint (ellipse,
+ direction i of pat,
+ point i of pat)
+ endfor
+ .. get_subpath (ellipse,
+ direction infinity of pat,
+ -direction infinity of pat,
+ point infinity of pat)
+ for i = (length pat - 1) step -1 until 1:
+ .. get_subpoint (ellipse,
+ -direction i of pat,
+ point i of pat)
+ endfor
+ .. cycle;
+ fi;
+
+ if dotted:
+ pickup pencircle scaled 4 linethickness;
+ drawdot (0, 0);
+ fi;
+
+ currentpicture := currentpicture
+ shifted 0.5 (neomensural_Cdiameter
+ + neomensural_Cthickness, 0);
+ fet_endchar;
+enddef;
+
+
+%% tempus imperfectum cum prolatione imperfecta
+neomensural_timesig ("Mensural 4/4 meter", "neomensural44",
+ false, false, false, false);
+
+
+%% tempus imperfectum cum prolatione imperfecta proportio dupla
+neomensural_timesig ("Mensural 2/2 meter", "neomensural22",
+ false, false, true, false);
+
+
+%% tempus perfectum cum prolatione imperfecta
+neomensural_timesig ("Mensural 3/2 meter", "neomensural32",
+ true, false, false, false);
+
+
+%% tempus imperfectum cum prolatione perfecta
+neomensural_timesig ("Mensural 6/4 meter", "neomensural64",
+ false, false, false, true);
+
+
+%% tempus perfectum cum prolatione perfecta
+neomensural_timesig ("Mensural 9/4 meter", "neomensural94",
+ true, false, false, true);
+
+
+%% tempus perfectum cum prolatione imperfecta proportio dupla
+neomensural_timesig ("Mensural 3/4 meter", "neomensural34",
+ true, false, true, false);
+
+
+%% tempus imperfectum cum prolatione perfecta proportio dupla
+neomensural_timesig ("Mensural 6/8 meter", "neomensural68",
+ false, false, true, true);
+
+
+%% tempus perfectum cum prolatione perfecta proportio dupla
+neomensural_timesig ("Mensural 9/8 meter", "neomensural98",
+ true, false, true, true);
+
+
+%% tempus imperfectum cum prolatione imperfecta diminutio simplex
+neomensural_timesig ("Mensural 4/8 meter", "neomensural48",
+ false, true, false, false);
+
+
+%% tempus imperfectum cum prolatione perfecta diminutio simplex
+neomensural_timesig ("Mensural 6/8 meter", "neomensural68alt",
+ false, true, false, true);
+
+
+%% tempus imperfectum cum prolatione imperfecta diminutio duplex
+neomensural_timesig ("Mensural 2/4 meter", "neomensural24",
+ false, true, true, false);
+
+
+fet_endgroup ("timesig");
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan11.mf b/muse2/share/scoreglyphs/feta-original/parmesan11.mf
new file mode 100644
index 00000000..27ba3414
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan11.mf
@@ -0,0 +1,13 @@
+% parmesan11.mf
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 11.22;
+
+input feta-autometric;
+
+test := 0;
+
+input parmesan-generic;
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan13.mf b/muse2/share/scoreglyphs/feta-original/parmesan13.mf
new file mode 100644
index 00000000..905da48d
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan13.mf
@@ -0,0 +1,14 @@
+% parmesan13.mf
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 12.60;
+
+input feta-autometric;
+
+test := 0;
+
+input parmesan-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan14.mf b/muse2/share/scoreglyphs/feta-original/parmesan14.mf
new file mode 100644
index 00000000..6357337b
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan14.mf
@@ -0,0 +1,14 @@
+% parmesan14.mf
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 14.14;
+
+input feta-autometric;
+
+test := 0;
+
+input parmesan-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan16.mf b/muse2/share/scoreglyphs/feta-original/parmesan16.mf
new file mode 100644
index 00000000..19b05167
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan16.mf
@@ -0,0 +1,14 @@
+% parmesan16.mf
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 15.87;
+
+input feta-autometric;
+
+test := 0;
+
+input parmesan-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan18.mf b/muse2/share/scoreglyphs/feta-original/parmesan18.mf
new file mode 100644
index 00000000..8c285070
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan18.mf
@@ -0,0 +1,14 @@
+% parmesan18.mf
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 17.82;
+
+input feta-autometric;
+
+test := 0;
+
+input parmesan-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan20.mf b/muse2/share/scoreglyphs/feta-original/parmesan20.mf
new file mode 100644
index 00000000..d14251ed
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan20.mf
@@ -0,0 +1,14 @@
+% parmesan20.mf
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 20;
+
+input feta-autometric;
+
+test := 0;
+
+input parmesan-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan23.mf b/muse2/share/scoreglyphs/feta-original/parmesan23.mf
new file mode 100644
index 00000000..39b64373
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan23.mf
@@ -0,0 +1,14 @@
+% parmesan23.mf
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 22.45;
+
+input feta-autometric;
+
+test := 0;
+
+input parmesan-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/feta-original/parmesan26.mf b/muse2/share/scoreglyphs/feta-original/parmesan26.mf
new file mode 100644
index 00000000..1be6fb51
--- /dev/null
+++ b/muse2/share/scoreglyphs/feta-original/parmesan26.mf
@@ -0,0 +1,14 @@
+% parmesan26.mf
+% part of LilyPond's pretty-but-neat music font
+
+design_size := 25.20;
+
+input feta-autometric;
+
+test := 0;
+
+input parmesan-generic;
+
+
+end.
+
diff --git a/muse2/share/scoreglyphs/flags16d.png b/muse2/share/scoreglyphs/flags16d.png
new file mode 100644
index 00000000..dbffcdee
--- /dev/null
+++ b/muse2/share/scoreglyphs/flags16d.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/flags16u.png b/muse2/share/scoreglyphs/flags16u.png
new file mode 100644
index 00000000..4278b260
--- /dev/null
+++ b/muse2/share/scoreglyphs/flags16u.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/flags32d.png b/muse2/share/scoreglyphs/flags32d.png
new file mode 100644
index 00000000..7aedf14b
--- /dev/null
+++ b/muse2/share/scoreglyphs/flags32d.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/flags32u.png b/muse2/share/scoreglyphs/flags32u.png
new file mode 100644
index 00000000..ddcee1c2
--- /dev/null
+++ b/muse2/share/scoreglyphs/flags32u.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/flags64d.png b/muse2/share/scoreglyphs/flags64d.png
new file mode 100644
index 00000000..30c622e0
--- /dev/null
+++ b/muse2/share/scoreglyphs/flags64d.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/flags64u.png b/muse2/share/scoreglyphs/flags64u.png
new file mode 100644
index 00000000..5e1a099f
--- /dev/null
+++ b/muse2/share/scoreglyphs/flags64u.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/flags8d.png b/muse2/share/scoreglyphs/flags8d.png
new file mode 100644
index 00000000..664ee6b5
--- /dev/null
+++ b/muse2/share/scoreglyphs/flags8d.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/flags8u.png b/muse2/share/scoreglyphs/flags8u.png
new file mode 100644
index 00000000..f80a9799
--- /dev/null
+++ b/muse2/share/scoreglyphs/flags8u.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/half.png b/muse2/share/scoreglyphs/half.png
new file mode 100644
index 00000000..50be5da9
--- /dev/null
+++ b/muse2/share/scoreglyphs/half.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/quarter.png b/muse2/share/scoreglyphs/quarter.png
new file mode 100644
index 00000000..f773f824
--- /dev/null
+++ b/muse2/share/scoreglyphs/quarter.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/rest1.png b/muse2/share/scoreglyphs/rest1.png
new file mode 100644
index 00000000..3f0df51b
--- /dev/null
+++ b/muse2/share/scoreglyphs/rest1.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/rest16.png b/muse2/share/scoreglyphs/rest16.png
new file mode 100644
index 00000000..42fc656d
--- /dev/null
+++ b/muse2/share/scoreglyphs/rest16.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/rest2.png b/muse2/share/scoreglyphs/rest2.png
new file mode 100644
index 00000000..0f4497f7
--- /dev/null
+++ b/muse2/share/scoreglyphs/rest2.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/rest4.png b/muse2/share/scoreglyphs/rest4.png
new file mode 100644
index 00000000..c229426d
--- /dev/null
+++ b/muse2/share/scoreglyphs/rest4.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/rest8.png b/muse2/share/scoreglyphs/rest8.png
new file mode 100644
index 00000000..b3289706
--- /dev/null
+++ b/muse2/share/scoreglyphs/rest8.png
Binary files differ
diff --git a/muse2/share/scoreglyphs/whole.png b/muse2/share/scoreglyphs/whole.png
new file mode 100644
index 00000000..eb8b4b7f
--- /dev/null
+++ b/muse2/share/scoreglyphs/whole.png
Binary files differ