From 27a39f5d66eec4be39d8a8b6fc184495aa8ba456 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Wed, 14 Nov 2012 10:31:44 +0100 Subject: [PATCH] Initial commit --- .gitignore | 4 + COPYING | 117 ++ Makefile | 37 + headfoot.tex | 6 + images/by-sa.png | Bin 0 -> 17594 bytes lyrics/AllForMeGrog.tex | 26 + lyrics/AuldLangSyne.tex | 38 + lyrics/BlackVelvetBand.tex | 33 + lyrics/DrunkenSailor.tex | 51 + lyrics/FoggyDew.tex | 44 + lyrics/ImARoverSeldomSober.tex | 39 + lyrics/JohnnyIHardlyKnewYe.tex | 53 + lyrics/MacPhersonsFarewell.tex | 53 + lyrics/MollyMalone.tex | 29 + lyrics/MuirsheenDurkin.tex | 26 + lyrics/NationOnceAgain.tex | 47 + lyrics/PartingGlass.tex | 26 + lyrics/RisingOfTheMoon.tex | 34 + lyrics/StarOfTheCountyDown.tex | 47 + lyrics/TimFinnegansWake.tex | 58 + lyrics/WhiskeyInTheJar.tex | 49 + lyrics/WildRover.tex | 31 + notes/AllForMeGrog.ly | 25 + notes/AuldLangSyne.ly | 32 + notes/BlackVelvetBand.ly | 32 + notes/DrunkenSailor.ly | 31 + notes/FoggyDew.ly | 37 + notes/ImARoverSeldomSober.ly | 21 + notes/JohnnyIHardlyKnewYe.ly | 29 + notes/MacPhersonsFarewell.ly | 30 + notes/MollyMalone.ly | 61 + notes/MuirsheenDurkin.ly | 29 + notes/NationOnceAgain.ly | 50 + notes/PartingGlass.ly | 29 + notes/RisingOfTheMoon.ly | 29 + notes/StarOfTheCountyDown.ly | 30 + notes/TimFinnegansWake.ly | 37 + notes/WhiskeyInTheJar.ly | 37 + notes/WildRover.ly | 42 + notes/orchestrallily.ly | 1936 ++++++++++++++++++++++++++++++++ sheet-music_tinwhistle.lytex | 125 +++ title.tex | 31 + 42 files changed, 3521 insertions(+) create mode 100644 .gitignore create mode 100644 COPYING create mode 100644 Makefile create mode 100644 headfoot.tex create mode 100644 images/by-sa.png create mode 100644 lyrics/AllForMeGrog.tex create mode 100644 lyrics/AuldLangSyne.tex create mode 100644 lyrics/BlackVelvetBand.tex create mode 100644 lyrics/DrunkenSailor.tex create mode 100644 lyrics/FoggyDew.tex create mode 100644 lyrics/ImARoverSeldomSober.tex create mode 100644 lyrics/JohnnyIHardlyKnewYe.tex create mode 100644 lyrics/MacPhersonsFarewell.tex create mode 100644 lyrics/MollyMalone.tex create mode 100644 lyrics/MuirsheenDurkin.tex create mode 100644 lyrics/NationOnceAgain.tex create mode 100644 lyrics/PartingGlass.tex create mode 100644 lyrics/RisingOfTheMoon.tex create mode 100644 lyrics/StarOfTheCountyDown.tex create mode 100644 lyrics/TimFinnegansWake.tex create mode 100644 lyrics/WhiskeyInTheJar.tex create mode 100644 lyrics/WildRover.tex create mode 100644 notes/AllForMeGrog.ly create mode 100644 notes/AuldLangSyne.ly create mode 100644 notes/BlackVelvetBand.ly create mode 100644 notes/DrunkenSailor.ly create mode 100644 notes/FoggyDew.ly create mode 100644 notes/ImARoverSeldomSober.ly create mode 100644 notes/JohnnyIHardlyKnewYe.ly create mode 100644 notes/MacPhersonsFarewell.ly create mode 100644 notes/MollyMalone.ly create mode 100644 notes/MuirsheenDurkin.ly create mode 100644 notes/NationOnceAgain.ly create mode 100644 notes/PartingGlass.ly create mode 100644 notes/RisingOfTheMoon.ly create mode 100644 notes/StarOfTheCountyDown.ly create mode 100644 notes/TimFinnegansWake.ly create mode 100644 notes/WhiskeyInTheJar.ly create mode 100644 notes/WildRover.ly create mode 100644 notes/orchestrallily.ly create mode 100644 sheet-music_tinwhistle.lytex create mode 100644 title.tex diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f61e1c --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.pdf +*.*~ +out/* +pdf/* diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..03693af --- /dev/null +++ b/COPYING @@ -0,0 +1,117 @@ + +Namensnennung – Weitergabe unter gleichen Bedingungen (by-sa) 3.0 Schweiz + + CREATIVE COMMONS CORPORATION IST KEINE ANWALTSKANZLEI UND BIETET KEINE RECHTLICHEN AUSKÜNFTE BZW. DIENSTLEISTUNGEN AN. DIE VERBREITUNG DIESER LIZENZ FÜHRT NICHT ZU EINEM MANDATSVERHÄLTNIS DES EMPFÄNGERS MIT CREATIVE COMMONS. CREATIVE COMMONS ÜBERNIMMT KEINE GEWÄHR FÜR DIE ZUR VERFÜGUNG GESTELLTEN INFORMATIONEN UND LEHNT JEGLICHE HAFTUNG FÜR SCHÄDEN AB, DIE AUS DEM GEBRAUCH DIESER INFORMATIONEN ERWACHSEN. DIESER AUSSCHLUSS VON GEWÄHRLEISTUNG UND HAFTUNG ERSTRECKT SICH AUCH AUF DIE PERSONEN, DIE AN DER ADAPTIERUNG DES VORLIEGENDEN LIZENZTEXTS ANS SCHWEIZERISCHE RECHT MITGEWIRKT HABEN. + +Lizenz + +Durch die Ausübung eines durch diese Lizenz gewährten Rechts an dem Lizenzgegenstand erklären Sie sich mit den Lizenzbedingungen rechtsverbindlich einverstanden. Soweit diese Lizenz als Vertrag anzusehen ist, gewährt Ihnen der Lizenzgeber die in der Lizenz genannten Rechte unentgeltlich und im Austausch dafür, dass Sie das Gebundensein an die Lizenzbedingungen akzeptieren. + +Der „Lizenzgeber“, d.h. die Person, welche den Lizenzgegenstand unter dieser Lizenz zur Verfügung stellt, + +und + +„Sie“, d.h. die natürliche oder juristische Person, welche die in dieser Lizenz im Abschnitt 3 genannten Nutzungen des Lizenzgegenstandes vornimmt und zuvor im Hinblick auf den Lizenzgegenstand nicht gegen die Bedingungen dieser Lizenz verstossen oder aber die ausdrückliche Erlaubnis des Lizenzgebers erhalten hat, die durch diese Lizenz gewährten Nutzungsrechte trotz eines vorherigen Verstosses auszuüben, + +vereinbaren mit dieser Creative Commons Public License („CCPL“ oder „Lizenz“) die Nutzungsbedingungen für den Lizenzgegenstand, + +im Einzelnen: + +1. Definitionen + + „Lizenzgegenstand“ kann ein urheberrechtlich geschütztes Werk sein oder eine durch verwandte Schutzrechte geschützte Leistung. + Eine „Sammlung“ im Sinne dieser Lizenz ist eine Zusammenstellung des Lizenzgegenstands mit anderen Werken oder sonstigen Elementen, unabhängig davon, ob an der Sammlung selbst aufgrund der Anordnung oder der Auswahl des Inhalts ein Urheberrecht entsteht. Als Sammlung gelten auch Datenbanken, unabhängig davon, ob an der Datenbank selbst aufgrund der Anordnung oder der Auswahl des Inhalts ein Urheberrecht entsteht. Die Aufnahme des Lizenzgegenstandes in eine Sammlung gilt nicht als Abwandlung des Lizenzgegenstandes. + Eine „Abwandlung“ im Sinne dieser Lizenz ist jede Veränderung des Lizenzgegenstandes, insbesondere eine Umgestaltung, Bearbeitung, Änderung, Anpassung oder Übersetzung, solange der Lizenzgegenstand in seinem individuellen Charakter erkennbar bleibt. Nicht als Abwandlung des Lizenzgegenstandes gilt seine Aufnahme in eine Sammlung. + „Rechteinhaber“ ist der Urheber des Lizenzgegenstandes, der Inhaber verwandter Schutzrechte oder jede andere Person, die am Lizenzgegenstand Nutzungsrechte erlangt hat, welche die Einräumung von Nutzungsrechten oder die Weiterübertragung der Nutzungsrechte an Dritte erlauben. + Ein „Werk“ ist eine geistige Schöpfung mit individuellem Charakter. + Ein „verwandtes Schutzrecht“ ist ein Recht an einer kulturellen Leistung, welche nicht als Werk geschützt ist, wie etwa jene von ausübenden Künstlern, Herstellern von Ton- und Tonbildträgern oder Sendeunternehmen. + „Öffentlich Wiedergeben“ ist das Vortragen des Lizenzgegenstandes direkt oder mit irgendwelchen Mitteln, das Aufführen, das Vorführen, das anderswo Wahrnehmbarmachen oder das Zugänglichmachen in der Weise, dass Personen von Orten und zu Zeiten ihrer Wahl dazu Zugang haben. + „Vervielfältigen“ bedeutet, mittels beliebiger Verfahren vorübergehende oder dauerhafte Vervielfältigungsstücke des Lizenzgegenstandes herzustellen und umfasst auch den Vorgang der erstmaligen körperlichen Fixierungen des Lizenzgegenstandes und der Herstellung von Vervielfältigungen dieser Fixierungen sowie die Übertragung des Lizenzgegenstandes auf einen Bild- oder Tonträger oder auf ein anderes elektronisches Medium, gleich ob in digitaler oder analoger Form. + „Verbreiten“ bedeutet, den Lizenzgegenstand oder Abwandlungen im Original oder in Form von Vervielfältigungsstücken, mithin in körperlich fixierter Form der Öffentlichkeit zugänglich zu machen oder in Verkehr zu bringen. + „Lizenzelemente“ sind die folgenden, vom Lizenzgeber ausgewählten und im Titel dieser Lizenz genannten Lizenzcharakteristika: + „Namensnennung“, „Weitergabe unter gleichen Bedingungen“. + „Mit Creative Commons kompatible Lizenz“ bezeichnet eine Lizenz, die unter http://creativecommons.org/compatiblelicenses aufgelistet ist und die durch Creative Commons als grundsätzlich zur vorliegenden Lizenz äquivalent akzeptiert wurde, da zumindest folgende Voraussetzungen erfüllt sind: + + Diese mit Creative Commons kompatible Lizenz + enthält Bestimmungen, welche die gleichen Ziele verfolgen, die gleiche Bedeutung haben und die gleichen Wirkungen erzeugen wie die Lizenzelemente der vorliegenden Lizenz, und + erlaubt ausdrücklich das Lizenzieren von ihr unterstellten Abwandlungen unter vorliegender Lizenz, unter einer anderen rechtsordnungsspezifisch angepassten Creative-Commons-Lizenz mit denselben Lizenzelementen, wie sie die vorliegende Lizenz aufweist, oder unter der entsprechenden Creative-Commons-Unported-Lizenz. + +2. Schranken des Urheberrechts + +Dieser Lizenzvertrag lässt sämtliche Befugnisse unberührt, die sich aufgrund der Beschränkungen der ausschliesslichen Rechte des Rechteinhabers durch das Urheberrechtsgesetz (Eigengebrauch, Erschöpfungsgrundsatz etc.) oder durch andere Bestimmungen der anwendbaren Gesetzgebung ergeben. + +3. Lizenzierung + +Unter den Bestimmungen dieser Lizenz räumt Ihnen der Lizenzgeber die Befugnis ein, den Lizenzgegenstand weltweit, lizenzgebührenfrei, nicht exklusiv und zeitlich unbeschränkt (d.h. für die Schutzdauer des Werks oder des verwandten Schutzrechts) wie folgt zu nutzen: + + den Lizenzgegenstand zu vervielfältigen, ihn in eine oder mehrere Sammlungen aufzunehmen und ihn im Rahmen der Sammlung zu vervielfältigen; + den Lizenzgegenstand abzuwandeln, d.h. ihn zu bearbeiten oder in anderer Weise umzugestalten, einschliesslich Übersetzungen unter Nutzung jeglicher Art von Medien anzufertigen, sofern deutlich erkennbar gemacht wird, dass es sich um eine Abwandlung handelt; + den Lizenzgegenstand oder Vervielfältigungen davon zu verbreiten, öffentlich wiederzugeben, durch Radio, Fernsehen oder ähnliche Einrichtungen, auch über Leitungen, zu senden, weiterzusenden oder sonstwie wahrnehmbar zu machen, wobei sich diese Befugnisse auch auf den in eine Sammlung aufgenommenen Lizenzgegenstand erstrecken; + den abgewandelten, d.h. bearbeiteten oder umgestalteten Lizenzgegenstand zu vervielfältigen, verbreiten, öffentlich wiederzugeben, durch Radio, Fernsehen oder ähnliche Einrichtungen, auch über Leitungen, zu senden, weiterzusenden oder sonstwie wahrnehmbar zu machen. + bezüglich Vergütung für die Nutzung des Lizenzgegenstandes gilt Folgendes: + Unverzichtbare gesetzliche Vergütungsansprüche: Soweit unverzichtbare Vergütungsansprüche als Gegenleistung für gesetzliche Lizenzen vorgesehen oder Pauschalabgabensysteme (zum Beispiel für Leermedien) vorhanden sind, behält sich der Lizenzgeber das ausschliessliche Recht vor, die entsprechende Vergütung einzuziehen für jede Ausübung eines Rechts aus dieser Lizenz durch Sie. + Vergütung bei Zwangslizenzen: Sofern Zwangslizenzen ausserhalb dieser Lizenz vorgesehen sind und zustande kommen, verzichtet der Lizenzgeber für alle Fälle einer lizenzgerechten Nutzung des Schutzgegenstandes durch Sie auf jegliche Vergütung. + Vergütung in sonstigen Fällen: Bezüglich lizenzgerechter Nutzung des Schutzgegenstandes durch Sie, die nicht unter die beiden vorherigen Abschnitte (i) und (ii) fällt, verzichtet der Lizenzgeber auf jegliche Vergütung, unabhängig davon, ob eine Einziehung der Vergütung durch ihn selbst oder nur durch eine Verwertungsgesellschaft möglich wäre. + +Die vorstehend genannten Befugnisse können für alle Nutzungsarten sowie in jedem Medium und Format ausgeübt werden, ob diese bereits bekannt sind oder erst in Zukunft entwickelt werden. Diese Befugnisse umfassen auch das Recht zu Änderungen, die technisch notwendig sind, um die Befugnisse in anderen Medien und Formaten auszuüben. + +4. Bedingungen + +Die in Ziffer 3 eingeräumten Befugnisse unterliegen den folgenden Bedingungen: + + Bei jeder Ausübung eines Rechts aus dieser Lizenz müssen Sie eine Kopie dieser Lizenz mitgeben. Sie können hiervon absehen, wenn Sie an Stelle dieser Lizenz die jedermann zugängliche Fundstelle dieser Lizenz bekannt geben (Uniform Resource Identifier, URI). Sie müssen bei der Ausübung eines Rechts aus dieser Lizenz alle Hinweise auf diese Lizenz und auf ihre Klauseln betreffend Gewährleistungs- und Haftungsausschluss beibehalten. Sie dürfen keine Vereinbarungen treffen, welche die Bedingungen dieser Lizenz verschärfen oder die mit dieser Lizenz gewährten Rechte für einen Dritten einschränken. Sie dürfen für den Lizenzgegenstand keine Unterlizenz erteilen. Sie dürfen den Lizenzgegenstand nicht mit technischen Schutzmassnahmen versehen, die den Nutzer des Lizenzgegenstandes in der Ausübung der ihm durch diese Lizenz gewährten Rechte behindern können. + + Ziffer 4 Buchstabe a gilt auch, falls der Lizenzgegenstand Bestandteil einer Sammlung ist. Dies bedeutet allerdings nicht, dass die Sammlung als solche diesen Lizenzbestimmungen unterstellt werden muss. + + Wenn Sie den Lizenzgegenstand in eine Sammlung aufnehmen, müssen Sie auf Aufforderung des Urhebers oder jedes Lizenzgebers hin jeden Hinweis auf den Auffordernden soweit machbar und gewünscht aus der Sammlung entfernen; soweit Hinweise gestützt auf eine solche Aufforderung zu entfernen sind, entfallen die Pflichten gemäss Ziffer 4 Buchstabe b. Entsprechendes gilt bei Abwandlungen. + + Sie dürfen eine Abwandlung des Lizenzgegenstandes ausschliesslich unter den Bedingungen + dieser Lizenz, + einer späteren Version dieser Lizenz mit denselben Lizenzelementen, + einer rechtsordnungsspezifischen Creative-Commons-Lizenz mit denselben Lizenzelementen ab Version 3.0 aufwärts (z.B. Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 US), + der Creative-Commons-Unported-Lizenz mit denselben Lizenzelementen ab Version 3.0 aufwärts, oder + einer mit Creative Commons kompatiblen Lizenz + öffentlich wiedergeben oder verbreiten. + + Falls Sie die Abwandlung gemäss Abschnitt (v) unter einer mit Creative Commons kompatiblen Lizenz lizenzieren, müssen Sie deren Lizenzbestimmungen Folge leisten. + + Falls Sie die Abwandlungen unter einer der unter (i)-(iv) genannten Lizenzen („Verwendbare Lizenzen“) lizenzieren, müssen Sie deren Lizenzbestimmungen sowie folgenden Bestimmungen Folge leisten: Sie müssen stets eine Kopie der verwendbaren Lizenz oder deren vollständige Internetadresse in Form des Uniform-Resource-Identifier (URI) beifügen, wenn Sie die Abwandlung verbreiten oder öffentlich zeigen. Sie dürfen keine Vertrags- oder Nutzungsbedingungen anbieten oder fordern, die die Bedingungen der verwendbaren Lizenz oder die durch sie gewährten Rechte beschränken. Bei jeder Abwandlung, die Sie verbreiten oder öffentlich zeigen, müssen Sie alle Hinweise auf die verwendbare Lizenz und den Haftungsausschluss unverändert lassen. Wenn Sie die Abwandlung verbreiten oder öffentlich zeigen, dürfen Sie (in Bezug auf die Abwandlung) keine technischen Massnahmen ergreifen, die den Nutzer der Abwandlung in der Ausübung der ihm durch die verwendbare Lizenz gewährten Rechte behindern können. Dieser Abschnitt 4.a gilt auch für den Fall, dass die Abwandlung einen Bestandteil einer Sammlung bildet, was jedoch nicht bedeutet, dass die Sammlung insgesamt der verwendbaren Lizenz unterstellt werden muss. + Bei der Nutzung des Lizenzgegenstands oder einer Abwandlung davon, sei es isoliert oder als Teil einer Sammlung, müssen Sie die bestehenden Copyright-Vermerke vollständig beibehalten bzw. in einem Rahmen wiedergeben, der dem technischen Verfahren und dem Trägermedium der von Ihnen vorgenommenen Nutzung angemessen ist, ausgenommen, es liegt eine Aufforderung zur Entfernung der Angaben gemäss Ziffer 4 Buchstabe a Absatz 3 vor. + Insbesondere müssen Sie (i) den Namen (oder das Pseudonym) des Urhebers sowie den Namen von Dritten nennen, die ein Rechteinhaber in den Copyright-Vermerk aufgenommen hat. + Ist Ihnen (ii) der Titel des Lizenzgegenstands bekannt, müssen Sie diesen angeben. + Hat der Lizenzgeber (iii) eine Internetadresse angegeben (z.B. in Form des Uniform Resource Identifier, URI), welche Lizenzinformationen oder Copyright-Vermerke enthält, müssen Sie diese ebenfalls nennen, soweit dies mit angemessenem Aufwand durchführbar ist. + Bei Abwandlungen müssen Sie (iv) einen mit Ziffer 3 Buchstabe b in Einklang stehenden Hinweis darauf anführen, in welcher Form der Lizenzgegenstand in die Abwandlung eingegangen ist (z. B. „Französische Übersetzung des … (Werk) durch … (Urheber)“ oder „Das Drehbuch beruht auf dem Werk des … (Urheber)“). + Die gemäss dieser Ziffer 4 Buchstabe b vorgeschriebenen Hinweise können in jeder angemessenen Weise erfolgen. Bei Abwandlungen oder Sammlungen müssen solche Hinweise hinsichtlich Plazierung und Ausgestaltung mindestens ebenso auffällig und in vergleichbarer Weise ausgeführt werden, wie dies für die anderen Rechteinhaber erfolgte, sofern ein solcher Hinweis für alle beitragenden Lizenzgeber erscheint. + + Zur Klarstellung: Die gemäss dieser Ziffer 4 Buchstabe b vorgeschriebenen Hinweise dürfen ausschliesslich in der in diesem Abschnitt beschriebenen Weise und zum Zweck der Zurechnung des Werks zum Urheber, Lizenzgeber bzw. zu Dritten, die ein Urheber bzw. Lizenzgeber in den Copyright-Vermerk aufgenommen hat, verwendet werden. Bei der Nutzung des Lizenzgegenstandes dürfen Sie weder implizit noch explizit den Eindruck einer Unterstützung oder Billigung durch diese Personen oder den Eindruck einer sonstigen Verbindung zwischen Ihnen und diesen Personen erwecken, ohne zuvor eine separate schriftliche Einwilligung von den betroffenen Personen eingeholt zu haben. + Ihre Befugnis, den Lizenzgegenstand zu nutzen, findet ihre gesetzliche Grenze in den (Urheber-) Persönlichkeitsrechten des Rechteinhabers, dessen berechtigte geistige und persönliche Interessen bzw. dessen Ansehen oder Ruf durch die Nutzung ohne eine zuvor eingeholte separate schriftliche Einwilligung der betroffenen Personen nicht beeinträchtigt werden dürfen. + +5. Keine Gewährleistung + +SOFERN VOM LIZENZGEBER NICHT SCHRIFTLICH ANDERS ANERKANNT, ÜBERNIMMT DER LIZENZGEBER KEINE GEWÄHRLEISTUNG FÜR DIE ERTEILTEN BEFUGNISSE. + +6. Haftungsausschluss + +ÜBER DIE IN ZIFFER 5 GENANNTE GEWÄHRLEISTUNG HINAUS HAFTET DER LIZENZGEBER NUR FÜR VORSATZ UND GROBE FAHRLÄSSIGKEIT. JEDE ANDERE HAFTUNG IST AUSGESCHLOSSEN, SOWEIT GESETZLICH ZULÄSSIG. FÜR SEINE HILFSPERSONEN HAFTET DER LIZENZGEBER IN KEINEM FALL. DIESER HAFTUNGSAUSSCHLUSS GILT AUCH DANN, WENN SIE AUF DIE MÖGLICHKEIT EINER SCHÄDIGUNG HINGEWIESEN HABEN. + +7. Beendigung + + Diese Lizenz und die darunter eingeräumten Befugnisse fallen ohne weiteres und mit sofortiger Wirkung dahin, wenn Sie die Bedingungen dieser Lizenz verletzen. Mit natürlichen oder juristischen Personen, die Abwandlungen des Lizenzgegenstandes oder diesen enthaltende Sammlungen unter den Bedingungen dieser Lizenz von Ihnen erhalten haben, bestehen nachträglich entstandene Lizenzbeziehungen jedoch solange weiter, wie die genannten Personen sich ihrerseits an sämtliche Lizenzbedingungen halten. Die Ziffern 1, 2, 5, 6, 7 und 8 bleiben ungeachtet der Beendigung dieser Lizenz verbindlich. + Die mit dieser Lizenz eingeräumten Befugnisse werden zeitlich uneingeschränkt eingeräumt (freilich höchstens für die Dauer, für welche der Lizenzgegenstand nach dem anwendbaren Recht urheber- bzw. leistungsschutzrechtlich geschützt ist). Der Lizenzgeber behält sich jedoch für einen beliebigen Zeitpunkt das Recht vor, den Lizenzgegenstand unter einer anderen Lizenz weiterzugeben oder die Verbreitung des Lizenzgegenstands ganz zu beenden. Der Lizenzwechsel wird jedoch nicht die Wirkung eines Widerrufs dieser Lizenz haben (oder jeder anderen Lizenzierung, die auf der Grundlage dieser Lizenz erfolgt oder erfolgen muss), vielmehr wird die Lizenz so lange weiter bestehen, als sie nicht nach Ziffer 7 Buchstabe a vorstehend beendigt wurde. + +8. Verschiedenes + + Jedes Mal, wenn Sie den Lizenzgegenstand oder eine Sammlung gestützt auf Ziffer 3 dieser Lizenz nutzen, räumt der Lizenzgeber auch dem Empfänger eines allfälligen Vervielfältigungsstücks eine Lizenz am Lizenzgegenstand selber ein, und zwar zu denselben Bedingungen wie die Ihnen eingeräumte Lizenz. + Jedes Mal, wenn Sie eine Abwandlung des Lizenzgegenstandes gestützt auf Ziffer 3 dieser Lizenz nutzen, räumt der Lizenzgeber auch dem Empfänger eine Lizenz am ursprünglichen Lizenzgegenstand an, und zwar zu denselben Bedingungen wie die Ihnen eingeräumte Lizenz. + Sollten sich einzelne Bestimmungen dieser Lizenz nach dem anwendbaren Recht als nicht durchsetzbar oder nichtig erweisen, so bleiben die übrigen Bestimmungen dieser Lizenz gültig und durchsetzbar und an die Stelle der unwirksamen Bestimmung tritt eine Ersatzregelung, die dem mit der unwirksamen Bestimmung angestrebten Zweck am nächsten kommt. + Keine Bestimmung dieser Lizenz gilt als wegbedungen und keine Verletzung als genehmigt, bevor nicht die durch die Wegbedingung oder Genehmigung belastete Partei die Wegbedingung oder Genehmigung in Schriftform und unterschriftlich bestätigt hat. + Diese Lizenz enthält alle mit Blick auf den Lizenzgegenstand zwischen den Parteien massgeblichen Bestimmungen. Andere Vertrauenspositionen, Abreden oder Zusicherungen im Hinblick auf den Lizenzgegenstand bestehen nicht. Der Lizenzgeber ist durch keine zusätzliche Klausel gebunden, welche sich aus irgendwelchen Unterlagen von Ihnen ergibt. Diese Vereinbarung kann ohne vorherige Vereinbarung mit unterschriftlicher Bestätigung zwischen dem Lizenzgeber und Ihnen nicht abgeändert werden. + + Creative Commons Hinweis + + Creative Commons ist nicht Partei dieses Lizenzvertrags und macht keinerlei Zusicherungen mit Blick auf den Lizenzgegenstand. Creative Commons haftet nicht für Ihnen entstandene Schäden aus der Verwendung des Lizenzgegenstands oder dieser Lizenz, aus welchem Rechtsgrund sie auch abgeleitet werden, sei es für direkten, indirekten Schaden oder für Folgeschaden. Ungeachtet des vorstehenden Satzes hat Creative Commons alle Rechte aus dieser Lizenz, sofern sie bezüglich eines Werks ausdrücklich selber als Lizenzgeberin unter dieser Lizenz auftritt. + + Ausser für den begrenzten Zweck, dem Publikum öffentlich bekannt zu machen, dass der Lizenzgegenstand unter der CCPL lizenziert ist, erlaubt Creative Commons den Parteien dieser Lizenz nicht, das Markenzeichen "Creative Commons" oder irgend ein anderes Markenzeichen oder Logo von Creative Commons ohne die vorgängige schriftliche Zustimmung von Creative Commons zu verwenden. Jegliche erlaubte Nutzung hat in Übereinstimmung mit den dannzumal gültigen Markenrichtlinien von Creative Commons zu stehen. Die Markenrichtlinien von Creative Commons sind auf ihrer Website abrufbar oder erhältlich auf Anfrage. + + Creative Commons kann unter http://creativecommons.org/ kontaktiert werden. + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b937794 --- /dev/null +++ b/Makefile @@ -0,0 +1,37 @@ +OUTDIR=out +PDFDIR=pdf +FILE = sheet-music_tinwhistle +LILY_PDF = lilypond-book --pdf -o $(OUTDIR) +PDF=cd $(OUTDIR) && pdflatex $(FILE).tex +INDEX=cd $(OUTDIR) && makeindex $(FILE).tex + +# The suffixes used in this Makefile. +.SUFFIXES: .lytex .tex .ly .pdf + +# Input and output files are searched in the directories listed in +# the VPATH variable. All of them are subdirectories of the current +# directory (given by the GNU make variable `CURDIR'). +VPATH = \ + $(CURDIR)/lyrics \ + $(CURDIR)/notes \ + $(CURDIR)/pdf \ + +all: book + +book: $(OUTDIR) $(PDFDIR) + cp headfoot.tex $(OUTDIR)/ + cp -r images/ $(OUTDIR)/ + $(LILY_PDF) $(FILE).lytex + $(PDF) + $(INDEX) + $(PDF) + cp $(CURDIR)/$(OUTDIR)/$(FILE).pdf $(CURDIR)/$(PDFDIR)/$(FILE).pdf + +$(OUTDIR): + mkdir -p $(OUTDIR) + +$(PDFDIR): + mkdir -p $(PDFDIR) + +clean: + rm -rf $(OUTDIR) diff --git a/headfoot.tex b/headfoot.tex new file mode 100644 index 0000000..7f37fee --- /dev/null +++ b/headfoot.tex @@ -0,0 +1,6 @@ +\fancyhf{} +\fancyhead[C]{\textbf{Songs for you}} +\fancyfoot[C]{\thepage } +\renewcommand{\headrulewidth}{0.4pt} +\renewcommand{\footrulewidth}{0.4pt} +\pagestyle{fancy} \ No newline at end of file diff --git a/images/by-sa.png b/images/by-sa.png new file mode 100644 index 0000000000000000000000000000000000000000..8770732928cb20d8aeafee32bec9c5de89d51238 GIT binary patch literal 17594 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 vk5D0%B4z(q5^F$?&> diff --git a/notes/AuldLangSyne.ly b/notes/AuldLangSyne.ly new file mode 100644 index 0000000..958e9f3 --- /dev/null +++ b/notes/AuldLangSyne.ly @@ -0,0 +1,32 @@ +\version "2.16.0" + +\header { + %title = "Auld lang syne" + composer = "Robert Burns" +} + +<< + \chords {s4 d1 a:7 d g d a2.:7 fis4 b2:m e4:min7 a:7 d1 d1 a:7 d g d a2.:7 fis4 b2:m e4:min7 a:7 d1 } + \relative a' + { + \time 4/4 + \key d \major + \partial 4 a4 | + d4. cis8 d4 fis | + e4. d8 e4 fis | + d4. d8 fis4 a | + b2. b4 | + a4. fis8 fis4 d | + e4. d8 e4 fis8 e | + d4. b8 b4 a | + d2. b'4 | + a4. fis8 fis4 d | + e4. d8 e4 b' | + a4. fis8 fis4 a | + b2. b4 | + a4. fis8 fis4 d | + e4. d8 e4 fis8 e | + d4. b8 b4 a | + d2. s8 \bar "|." + } +>> diff --git a/notes/BlackVelvetBand.ly b/notes/BlackVelvetBand.ly new file mode 100644 index 0000000..b1a494b --- /dev/null +++ b/notes/BlackVelvetBand.ly @@ -0,0 +1,32 @@ +\version "2.16.0" + +\header { + %title = "The Black Velvet Band" + composer = "Traditional" +} + +<< + \chords {s4 d1.*3 a1.:7 d1*9/4 a d } + \relative g'' + { + \time 3/4 + \key g \major + \partial 4 d4 | + d2 d4 | + b c4. d8 | + c4 b2( | + b) a4 | + g a b | + g fis e | + d2.( | + d4) d' c | + b2 b4 | + d, e fis | + g2( a4) | + b2 g4 | + a b c | + fis, g a | + g2.( | + g2) s4 \bar "|." + } +>> diff --git a/notes/DrunkenSailor.ly b/notes/DrunkenSailor.ly new file mode 100644 index 0000000..a12d4ac --- /dev/null +++ b/notes/DrunkenSailor.ly @@ -0,0 +1,31 @@ +\version "2.16.0" + +\header { + %title = "Drunken Sailor" + composer = "Traditional" +} + +<< + \chords {a1:m g a:m g a:m g a:m g} + \relative b' + { + \time 2/4 + \key d \major + b8 b16 b b8 b16 b | + b8 e, g b | + a a16 a a8 a16 a | + a8 d, fis a | + b b16 b b8 b16 b | + b8 cis d e | + d b a fis | + e4 e \bar ":|:" + b' b | + b8 e, g b | + a4 a | + a8 d, fis a | + b4 b | + b8 cis d e | + d b a fis | + e4 e \bar ":|" + } +>> diff --git a/notes/FoggyDew.ly b/notes/FoggyDew.ly new file mode 100644 index 0000000..44b1176 --- /dev/null +++ b/notes/FoggyDew.ly @@ -0,0 +1,37 @@ +\version "2.16.0" + +\header { + %title = "The Foggy Dew" + composer = "Charles O’Neill" +} + +\relative g' +{ + \time 4/4 + \key g \major + \partial 2 b d | + e2 d4 b | + e2 d4 b | + a2 b | + d, e4 fis | + g b a g | + e2. d4 | + e1( | + e2) \bar ":|" + \partial 2 fis | + g b | + d c4 b | + a2 a | + b g4 a | + b2 g'4 fis | + e d b d | + e1( | + e2) b4 d | + e2 d4 b | + e2 d4 b | + a2 b | + d, e4 fis | + g b a g | + e2. e4 | + e2 \bar "|." +} diff --git a/notes/ImARoverSeldomSober.ly b/notes/ImARoverSeldomSober.ly new file mode 100644 index 0000000..90628d8 --- /dev/null +++ b/notes/ImARoverSeldomSober.ly @@ -0,0 +1,21 @@ +\version "2.16.0" + +\header { + %title = "I'm a Rover seldom sober" + composer = "Traditional" +} + +\relative g' +{ + \time 9/8 + \key g \major + r2 r4 g g8 | + g4. d4 d8 e4 e8 | + e4. d g4 g8 | + g4. b4 b8 b4 b8 | + a4. r4 d8 d4 c8 | + b4. d4 d8 a4 fis8 | + g4. d g4 a8 | + b4. b4 b8 a4 a8 | + g4. r4 \bar "|." +} diff --git a/notes/JohnnyIHardlyKnewYe.ly b/notes/JohnnyIHardlyKnewYe.ly new file mode 100644 index 0000000..2742439 --- /dev/null +++ b/notes/JohnnyIHardlyKnewYe.ly @@ -0,0 +1,29 @@ +\version "2.16.0" + +\header { + %title = "Johnny I hardly knew ye" + composer = "Traditional" +} + +\relative c' +{ + \time 6/8 + \key c \major + r2 r8 e8 | + e a a a4 b 8 | + c4 b8 c4 a8 | + g2 ( g8) e | + g2 ( g8) a | + e a a a4 b8 | + c4 b8 c4 d8 | + e2( e8) c8 | + e2( e8) c8 | + e4 e8 e d c | + d4 d8 d4 b8 | + c4 c8 c b a | + b4 b8 b c d | + e4( e8) d4( d8) | + c4( c8) b4( e,8) | + e a a a4 g8 | + a4.( a4) r8 \bar "|." +} \ No newline at end of file diff --git a/notes/MacPhersonsFarewell.ly b/notes/MacPhersonsFarewell.ly new file mode 100644 index 0000000..3b30812 --- /dev/null +++ b/notes/MacPhersonsFarewell.ly @@ -0,0 +1,30 @@ +\version "2.16.0" + +\header { + %title = "MacPhersons Farewell" + composer = "Robert Burns" +} + +\relative g' +{ + \time 4/4 + \key g \major + \partial 4 d | + g4. a8 b4 a8 ( g)| + a ( g) a (b) a4 b8 ( a) | + g4. a8 b4 a8( g) | + e2. d8( e) | + g4. a8 b4 a8( g) | + a ( g) a (b) a4 b8 ( a) | + g4. b8 a8( g) e4 | + d2. \bar "|." + b'8( c) | + d4. b8 c( b) a( g) | + b4 a a b8( c) | + d4. b8 c( b) a( g) | + e2. e'4 | + d4. b8 c( b) a g | + b4 a a d, | + g4. b8 a( g) e4 | + d2. \bar "|." +} diff --git a/notes/MollyMalone.ly b/notes/MollyMalone.ly new file mode 100644 index 0000000..02e4516 --- /dev/null +++ b/notes/MollyMalone.ly @@ -0,0 +1,61 @@ +\version "2.16.0" + +\header { + %title = "Molly Malone" + composer = "Traditional" +} + +\relative g' +{ + \time 3/4 + \key c \major + \partial 4 g | + c c c | + c8 e4. d8 c | + d4 d d | + d8 f4. e8 d | + g4 e c | + g' e c | + a d c | + b2 g4 | + c c c | + c8 e4. d8 c | + d4 d d | + d8 f4. e8 d | + g e4. c4 | + g'8 e4. c4 | + d4. c8 d4 | + c2 g4 | + c4. c8 c4 | + c( e) d8( c) | + d4. d8 d4 | + d( f) e8 d | + g e4. c4 | + g'8 e4. c4 | + d4. c8 d4 | + c2 g4 | + c c c | + c8 e4. d8 c | + d4 d d | + d8 f4. e8 d | + g4 e c | + g' e c | + a d c | + b2 g4 | + c c c | + c8 e4. d8 c | + d4 d d | + d8 f4. e8 d | + g e4. c4 | + g'8 e4. c4 | + d4. c8 d4 | + c2 g4 | + c4. c8 c4 | + c( e) d8( c) | + d4. d8 d4 | + d( f) e8 d | + g e4. c4 | + g'8 e4. c4 | + d4. c8 d4 | + c2 \bar "|." +} diff --git a/notes/MuirsheenDurkin.ly b/notes/MuirsheenDurkin.ly new file mode 100644 index 0000000..ad91faa --- /dev/null +++ b/notes/MuirsheenDurkin.ly @@ -0,0 +1,29 @@ +\version "2.16.0" + +\header { + %title = "Muirsheen Durkin" + composer = "Traditional" +} + +\relative d' +{ + \time 4/4 + \key d \major + \partial 4 d8. e16 | + fis4 fis e d | + e a a b | + cis a g e | + e d2 d8. e16 | + fis4 fis e d | + e a2 b4 | + cis8 cis a4 b cis | + d2. a4 | + d d e d | + cis a a b | + cis a g e | + e d2 d8. e16 | + fis2 e4 d | + e a a b | + cis a g( e) | + d2. \bar "|." +} diff --git a/notes/NationOnceAgain.ly b/notes/NationOnceAgain.ly new file mode 100644 index 0000000..f726708 --- /dev/null +++ b/notes/NationOnceAgain.ly @@ -0,0 +1,50 @@ +\version "2.16.0" + +\header { + %title = "A Nation once again" + composer = "Thomas Osborne Davis" +} + +\relative fis'' +{ + \time 4/4 + \key d \major + \partial 4 fis | + a, b8 cis d4 cis8 d | + fis4. e8 d4. cis8 | + b4 e d8 cis b cis | + e4 d d2 | + a4 b8 cis d4 cis8 d | + fis4. e8 d4. cis8 | + b4 e d8 cis b cis | + b4 a a2 | + a4 b cis d | + e4. a,8 a2 | + b4 cis d e | + fis2 fis8 e d cis | + b4 b g'4. fis8 | + e4 d cis4. b8 | + a fis'4. e d8 | + d2 d4 a | + \repeat volta 2 + { + fis'4. e8 d4. cis8 | + b2 b4 b | + g'4. fis8 e4. d8 | + cis2 cis4 b | + a b8 cis d4. cis8 | + } + \alternative + { + { + b8 e8. d16 cis4 cis8 b r | + a4 fis' e4. d8 | + d2 d4 a + } + { + b8 e8. d16 cis4 d8 e r | + fis4 g e4. d8 | + d2 d4 \bar "|." + } + } +} diff --git a/notes/PartingGlass.ly b/notes/PartingGlass.ly new file mode 100644 index 0000000..54039b4 --- /dev/null +++ b/notes/PartingGlass.ly @@ -0,0 +1,29 @@ +\version "2.16.0" + +\header { + %title = "The parting Glass" + composer = "Traditional" +} + +\relative b' +{ + \time 4/4 + \key g \major + \partial 4 b8 (a) | + g4 e e d8 e | + g4 g a g8 (a) | + b4 b b8 (a) g (a) | + b4 d, d b'8 (a) | + g4 e e d8 (e) | + g4 g a g8 (a) | + b4 e d8 (b) a (b) | + g4 e e4. b'8 | + d (b) d (e) d4. b8 | + d (b) d (e) d4. b8 | + c4 b a g8 (a) | + b4 d, d b'8 (a) | + g4 e e d8 (e) | + g4 g a g8 (a) | + b4 e d8 (b) a (b) | + g4 e e \bar "|." +} diff --git a/notes/RisingOfTheMoon.ly b/notes/RisingOfTheMoon.ly new file mode 100644 index 0000000..4dfa888 --- /dev/null +++ b/notes/RisingOfTheMoon.ly @@ -0,0 +1,29 @@ +\version "2.16.0" + +\header { + %title = "The Rising og the Moon" + composer = "John Keegan Casey" +} + +\relative d' +{ + \time 4/4 + \key d \major + \partial 4 d8. e16 | + fis4 fis e d | + e a a b | + cis a g e | + e d2 d8. e16 | + fis4 fis e d | + e a2 b4 | + cis8 cis a4 b cis | + d2. a4 | + d d e d | + cis a a b | + cis a g e | + e d2 d8. e16 | + fis2 e4 d | + e a a b | + cis a g( e) | + d2. \bar "|." +} diff --git a/notes/StarOfTheCountyDown.ly b/notes/StarOfTheCountyDown.ly new file mode 100644 index 0000000..89f0658 --- /dev/null +++ b/notes/StarOfTheCountyDown.ly @@ -0,0 +1,30 @@ +\version "2.16.0" + +\header { + %title = "The Star of the County Down" + composer = "Cathal Mac Garvey" +} + +\relative c' +{ + \time 4/4 + \key g \major + \partial 4 fis8 a | + b4 b b a8 b | + d4 d e d8 e | + fis4 e8 d b4 a8 fis | + a2. fis8 a | + b4 b b a8 b | + d4 d e d8 e | + fis4 e8 d b4 b | + b2. \bar "||" + \partial 4 e8 fis | + a4 fis fis e8 d | + e4 e e d8 e | + fis4 e8 d b4 a8 fis | + a2. fis8 a | + b4 b b a8 b | + d4 d e d8 e | + fis4 e8 d8 b4 b | + b2. \bar "|." +} diff --git a/notes/TimFinnegansWake.ly b/notes/TimFinnegansWake.ly new file mode 100644 index 0000000..6ab587a --- /dev/null +++ b/notes/TimFinnegansWake.ly @@ -0,0 +1,37 @@ +\version "2.16.0" + +\header { + %title = "Tim Finnegan's Wake" + composer = "Traditional" +} + +\relative a' +{ + \time 2/4 + \key g \major + \partial 8 a8 | + b16 b b8 b a | + b e e8. fis16 | + g g fis8 e d | + b a a a16 a | + b b b8 b a | + b e e fis16 fis | + g8 fis16 fis e8 d | + e16 e fis8 g8. d16 | + g8 g16 g g8 a16 a | + g8 fis e d16 d | + g8 g16 g g g a8 | + g fis e8. d16 | + g8 g g a16 a | + g8 fis e d16 d | + e8 e16 e e8 d | + e fis g4 | + b,8 b16 b b8 a | + b e16 e e8 fis | + g fis e d | + b16 a8. a4 | + b8 b b a | + b e e fis | + g fis e d | + e16 e fis8 g \bar "|." +} diff --git a/notes/WhiskeyInTheJar.ly b/notes/WhiskeyInTheJar.ly new file mode 100644 index 0000000..adf4372 --- /dev/null +++ b/notes/WhiskeyInTheJar.ly @@ -0,0 +1,37 @@ +\version "2.16.0" + +\header { + %title = "Whiskey in the jar" + composer = "Traditional" +} + +\relative c' +{ + \time 4/4 + \key d \major + \partial 4 fis | + a4. a8 a4 b | + a fis2 a4 | + b4. b8 b4 cis | + b fis2 a4 | + b4. b8 b4 cis | + d2 cis4 b | + a8 b4 d4. cis4 | + b fis2 fis4 | + a4. a8 a4 b | + a fis2 fis4 | + b4. b8 b4 cis | + b fis2 a4 | + b4. b8 b4 cis | + d2 cis4 b | + a8 b4 d4. cis4 | + b a fis d | + e e8 e e4 fis | + e1( | + e4) fis fis4. e8 | + fis8 a4. a2( | + a4) b b4. a8 | + b cis4. d4 b | + a fis e fis | + d2. \bar "|." +} diff --git a/notes/WildRover.ly b/notes/WildRover.ly new file mode 100644 index 0000000..60cb5f7 --- /dev/null +++ b/notes/WildRover.ly @@ -0,0 +1,42 @@ +\version "2.16.0" + +\header { + %title = "The wild Rover" + composer = "Traditional" +} + +\relative g' +{ + \time 3/4 + \key g \major + \partial 4 a | + g4. a8 g4 | + e d b' | + b4. a8 b4 | + c2 b8 c | + d4 b d | + c8 a4. fis4 | + d b' a | + g2 g4 | + g4. a8 g4 | + e d b' | + b4. a8 d4 | + c2 b8 c | + d4 b d | + c8 a4. fis4 | + d b' a | + g fis g | a2. | + a | + fis4 d2( | + d2.)(d4) b' b | + b a b | + c2.( | + c2) b8 c | + d2.( | + d4) b g | + fis e2( | + e) e8 e | + d4 b' a | + g2.( | + g) \bar "|." +} diff --git a/notes/orchestrallily.ly b/notes/orchestrallily.ly new file mode 100644 index 0000000..4936ccc --- /dev/null +++ b/notes/orchestrallily.ly @@ -0,0 +1,1936 @@ +\version "2.15.19" + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% OrchestralLily +% ============== +% Desciption: Lilypond package to make writing large orchestral scores easier. +% Documentation: http://wiki.kainhofer.com/lilypond/orchestrallily +% Version: 0.02, 2008-03-06 +% Author: Reinhold Kainhofer, reinhold@kainhofer.com +% Copyright: (C) 2008 by Reinhold Kainhofer +% License: Dual-licensed under either: +% -) GPL v3.0, http://www.gnu.org/licenses/gpl.html +% -) Creative Commons BY-NC 3.0, http://creativecommons.org/licenses/by-nc/3.0/at/ +% +% Version History: +% 0.01 (2008-03-02): Initial Version +% 0.02 (2008-03-06): Added basic MIDI support (*MidiInstrument and \setCreateMIDI) +% 0.03 (2008-07-xx): General staff/voice types, title pages, etc. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +#(use-modules (ice-9 match)) + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% GLOBAL OPTIONS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Use relative include pathes! +#(ly:set-option 'relative-includes #t) + +\include "sceaux_clef-key.ily" + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% SCORE STRUCTURE AND AUTOMATIC GENERATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Helper functions +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Helper function to filter all non-null entries +#(define (not-null? x) (not (null? x))) + +% Helper function to extract a given variable, built from [Piece][Instrument]Identifier +#(define (namedPieceInstrObject piece instr name) + (let* ( + (fullname (string->symbol (string-append piece instr name))) + (instrname (string->symbol (string-append instr name))) + (piecename (string->symbol (string-append piece name))) + (fallback (string->symbol name)) + ) + (cond + ((defined? fullname) (primitive-eval fullname)) + ((defined? instrname) (primitive-eval instrname)) + ((defined? piecename) (primitive-eval piecename)) + ((defined? fallback) (primitive-eval fallback)) + (else '()) + ) + ) +) + +%% Print text as a justified paragraph, taken from the lilypond Notation Reference +#(define-markup-list-command (paragraph layout props args) (markup-list?) + (let ((indent (chain-assoc-get 'par-indent props 2))) + (interpret-markup-list layout props + (make-justified-lines-markup-list (cons (make-hspace-markup indent) + args))))) + +conditionalBreak = #(define-music-function (parser location) () + #{ \tag #'instrumental-score \pageBreak #} +) + +#(define (oly:piece-title-markup title) (markup #:column (#:line (#:fontsize #'3 #:bold title))) ) + +#(define-markup-command (piece-title layout props title) (markup?) + (interpret-markup layout props (oly:piece-title-markup title)) +) + +#(define (oly:generate_object_name piece instr obj ) + (if (and (string? piece) (string? instr) (string? obj)) + (string-append piece instr obj) + #f + ) +) +#(define (oly:generate_staff_name piece instr) (oly:generate_object_name piece instr "St")) + +#(define (set-context-property context property value) + (set! (ly:music-property context property) value) +) + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Score structure and voice types +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +#(define oly:LiedScoreStructure '( + ("SoloScore" "SimultaneousMusic" ("Singstimme")) + ("Pfe" "PianoStaff" ("PfeI" "PfeII")) + ;("PfeI" "ParallelVoicesStaff" ("OIa" "OIb")) + ;("PfeII" "ParallelVoicesStaff" ("OIIa" "OIIb")) + ("FullScore" "SimultaneousMusic" ("Singstimme" "Pfe")) + ("VocalScore" "SimultaneousMusic" ("Singstimme" "Pfe")) +)) + +#(define oly:StringEnsembleScoreStructure '( + ("FullScore" "StaffGroup" ("VI" "VII" "Va" "Vc" "Cb" "VcB")) +)) + +#(define oly:fullOrchestraScoreStructure '( +; Part-combined staves for full score + ("Fl" "PartCombinedStaff" ("FlI" "FlII")) + ("Ob" "PartCombinedStaff" ("ObI" "ObII")) + ("Cl" "PartCombinedStaff" ("ClI" "ClII")) + ("Fag" "PartCombinedStaff" ("FagI" "FagII")) + ("Wd" "StaffGroup" ("Fl" "Ob" "Cl" "Fag" "CFag")) + + ("Cor" "PartCombinedStaff" ("CorI" "CorII")) + ("Tbe" "PartCombinedStaff" ("TbeI" "TbeII")) + ("Clni" "PartCombinedStaff" ("ClnoI" "ClnoII")) + ("Trb" "PartCombinedStaff" ("TrbI" "TrbII")) + ("Br" "StaffGroup" ("Cor" "Tbe" "Clni" "Trb" "Tba")) + +; long score; no part-combined staves, but GrandStaves instead + ("FlLong" "GrandStaff" ("FlI" "FlII")) + ("ObLong" "GrandStaff" ("ObI" "ObII")) + ("ClLong" "GrandStaff" ("ClI" "ClII")) + ("FagLong" "GrandStaff" ("FagI" "FagII")) + ("WdLong" "StaffGroup" ("FlLong" "ObLong" "ClLong" "FagLong" "CFag")) + + ("CorLong" "GrandStaff" ("CorI" "CorII")) + ("TbeLong" "GrandStaff" ("TbeI" "TbeII")) + ("ClniLong" "GrandStaff" ("ClnoI" "ClnoII" "ClnoIII")) + ("TrbLong" "GrandStaff" ("TrbI" "TrbII" "TrbIII")) + ("BrLong" "StaffGroup" ("CorLong" "TbeLong" "ClniLong" "TrbLong" "Tba")) + +; Percussion + ("Perc" "StaffGroup" ("Tim")) + +; Strings, they are the same in long and short full score + ("VV" "GrandStaff" ("VI" "VII")) + ("Str" "StaffGroup" ("VV" "Va")) + ("VceB" "StaffGroup" ("Vc" "Cb" "VcB")) + ("FullStr" "StaffGroup" ("VV" "Va" "Vc" "Cb" "VcB")) + +; Choral score + ("Solo" "SimultaneousMusic" ("SSolo" "ASolo" "TSolo" "BSolo")) + ("Ch" "ChoirStaff" ("S" "A" "T" "B")) + ("ChoralScore" "SimultaneousMusic" ("Ch")) + ("SoloScore" "SimultaneousMusic" ("Solo")) + ("SoloChoirScore" "SimultaneousMusic" ("Solo" "Ch")) + +; Organ score (inkl. Figured bass) + ("BCFb" "FiguredBass" ()) + ("FiguredBass" "FiguredBass" ()) + ;("Organ" "SimultaneousMusic" ("BCFb" "O")) + ("Continuo" "ParallelVoicesStaff" ("BCFb" "BC" "FiguredBass")) + ("RealizedContinuo" "PianoStaff" ("BCRealization" "Continuo")) + + ("P" "PianoStaff" ("PI" "PII")) + ("O" "PianoStaff" ("OI" "OII")) + ("OI" "ParallelVoicesStaff" ("OIa" "OIb")) + ("OII" "ParallelVoicesStaff" ("OIIa" "OIIb")) + + ;("Organ" "SimultaneousMusic" ("OGroup" "RealizedContinuo")) + ;("BassGroup" "ParallelVoicesStaff" ("Organ" "O" "BC" "VceB")) + ("BassGroup" "StaffGroup" ("O" "RealizedContinuo" "Vc" "Cb" "VcB")) + +; Full Scores + ("FullScore" "SimultaneousMusic" ("Wd" "Br" "Perc" "Str" "SoloChoirScore" "BassGroup")) + ("LongScore" "SimultaneousMusic" ("WdLong" "BrLong" "Perc" "Str" "SoloChoirScore" "BassGroup")) + ("OriginalScore" "SimultaneousMusic" ("BrLong" "WdLong" "Perc" "Str" "SoloChoirScore" "BassGroup")) + +; Piano reduction + ;("Piano" "SimultaneousMusic" ("Organ")) + ("OrganScore" "SimultaneousMusic" ("SoloChoirScore" "O")) + ("VocalScore" "SimultaneousMusic" ("SoloChoirScore" "P")) + ("Particell" "SimultaneousMusic" ("ChoralScore" "BassGroup")) + +; Full scores: Orchestral score and long score including organ + ("ChStrQ" "SimultaneousMusic" ("Str" "Ch" "VceB")) +)) +#(define oly:orchestral_score_structure oly:fullOrchestraScoreStructure) + +#(define (oly:set_score_structure struct) + (if (list? struct) + (set! oly:orchestral_score_structure struct) + (ly:warning (_ "oly:set_score_structure needs an association list as argument!")) + ) +) + +#(define (oly:modify_score_structure entry) + (if (list? entry) + (set! oly:orchestral_score_structure (assoc-set! oly:orchestral_score_structure (car entry) (cdr entry))) + (ly:warning (_ "oly:modify_score_structure expects a list (\"key\" \"type\" '(children)) as argument!")))) + +#(define (oly:remove_from_score_structure entry) + (if (list? entry) + (map oly:remove_from_score_structure entry) + (set! oly:orchestral_score_structure (assoc-remove! oly:orchestral_score_structure entry)))) + +orchestralScoreStructure = #(define-music-function (parser location structure) (list?) + (oly:set_score_structure structure) + (make-music 'Music 'void #t) +) + +#(define oly:voice_types '()) + +#(define (oly:set_voice_types types) + (if (list? types) + (set! oly:voice_types types) + (ly:warning (_ "oly:set_voice_types needs an association list as argument!")) + ) +) + +orchestralVoiceTypes = #(define-music-function (parser location types) (list?) + (oly:set_voice_types types) + (make-music 'Music 'void #t) +) + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Automatic staff and group generation +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Retrieve all music definitions for the given +#(define (oly:get_music_object piece instrument) + (namedPieceInstrObject piece instrument "Music") +) +#(define (oly:get_music_objects piece instruments) + (filter not-null? (map (lambda (i) (oly:get_music_object piece i)) instruments)) +) + +% Given a property name and the extensions, either generate the pair to set +% the property or an empty list, if no pre-defined variable could be found +#(define (oly:generate_property_pair prop piece instr type) + (let* ((val (namedPieceInstrObject piece instr type))) + (if (not-null? val) (list 'assign prop val) '() ) + ) +) + +#(define (oly:staff_type type) + (cond + ((string? type) (string->symbol type)) + ((symbol? type) type) + (else 'Staff) + ) +) + +% extract the pitch from the music (can also be a raw pitch object!) +#(define (oly:extractPitch music) + (let* ( + (elems (if (ly:music? music) (ly:music-property music 'elements))) + (note (if (pair? elems) (car elems))) + (mpitch (if (ly:music? note) (ly:music-property note 'pitch))) + (pitch (if (ly:pitch? music) music mpitch)) + ) + (if (and (not-null? music) (not (ly:pitch? pitch))) + (ly:warning "Unable to interpret as a pitch!") + ) + pitch + ) + +) +#(define (oly:extractTranspositionPitch piece name) + (let* ( + (trpFromPitch (oly:extractPitch (namedPieceInstrObject piece name "TransposeFrom"))) + (trpToPitch (oly:extractPitch (namedPieceInstrObject piece name "TransposeTo"))) + ) + (if (ly:pitch? trpFromPitch) + (if (ly:pitch? trpToPitch) + ; Both pitches + (ly:pitch-diff trpFromPitch trpToPitch) + (ly:pitch-diff trpFromPitch (ly:make-pitch 0 0 0)) + ) + (if (ly:pitch? trpToPitch) + (ly:pitch-diff (ly:make-pitch 0 0 0) trpToPitch) + #f + ) + ) + ) +) + + +%%===================================================================== +%% Extract context modifications for given objects +%%--------------------------------------------------------------------- + + +% TODO: join these property extractors to avoid code duplication + +% Generate the properties for the lyrics for piece and instr. +% Also check whether we have a modifications object to fech mods from. +% return a (possibly empty) list of all assignments. +#(define (oly:lyrics_handler_properties piece name lyricsid) + (let* ( + (mods (namedPieceInstrObject piece name (string-append lyricsid "Modifications"))) + (mod-list (if (not-null? mods) (ly:get-context-mods mods) '())) + (mapping '( + ;(instrumentName . "InstrumentName") + ;(shortInstrumentName . "ShortInstrumentName") + ;(midiInstrument . "MidiInstrument") + )) + (assignments (map + (lambda (pr) + (oly:generate_property_pair (car pr) piece name (cdr pr)) + ) + mapping)) + (olyprops (filter not-null? assignments)) + (props (append mod-list olyprops)) + ) + props + ) +) + +% Generate the properties for the voice for piece and instr. +% Also check whether we have a modifications object to fech mods from. +% return a (possibly empty) list of all assignments. +#(define (oly:voice_handler_properties piece name) + (let* ( + (mods (namedPieceInstrObject piece name "VoiceModifications")) + (mod-list (if (not-null? mods) (ly:get-context-mods mods) '())) + (mapping '( + ;(instrumentName . "InstrumentName") + ;(shortInstrumentName . "ShortInstrumentName") + ;(midiInstrument . "MidiInstrument") + )) + (assignments (map + (lambda (pr) + (oly:generate_property_pair (car pr) piece name (cdr pr)) + ) + mapping)) + (olyprops (filter not-null? assignments)) + (props (append mod-list olyprops)) + ) + props + ) +) + +% Generate the properties for the staff for piece and instr. Typically, these +% are the instrument name and the short instrument name (if defined). +% Also check whether we have a modifications object to fech mods from. +% return a (possibly empty) list of all assignments. +#(define (oly:staff_handler_properties piece instr) + (let* ( + (mods (namedPieceInstrObject piece instr "StaffModifications")) + (mod-list (if (not-null? mods) (ly:get-context-mods mods) '())) + (mapping '( + (instrumentName . "InstrumentName") + (shortInstrumentName . "ShortInstrumentName") + (midiInstrument . "MidiInstrument") + )) + (assignments (map + (lambda (pr) + (oly:generate_property_pair (car pr) piece instr (cdr pr)) + ) + mapping)) + (olyprops (filter not-null? assignments)) + (props (append mod-list olyprops)) + ) + props + ) +) + +%% Process the extracted object, e.g. wrap \clef around the +%% string for "type"=="Clef", etc. +% This allows a more fine-grained post-processing of the global vars +#(define (oly:processExtractedObject piece name type object) + (if (and (string=? type "Clef") (string? object)) + (make-ancient-or-modern-clef object) ;; Use Nicolas Sceaux' old/modern clef notation + object)) + + + +%%===================================================================== +%% Extract contents for voices +%%--------------------------------------------------------------------- + +#(define (oly:musiccontent_for_voice parser piece name music additional) + (let* ((musiccontent additional)) + + ; Append the settings, key and clef (if defined) + (map + (lambda (type) + (let* ((object (oly:processExtractedObject piece name type (namedPieceInstrObject piece name type)))) + (if (ly:music? object) + (set! musiccontent (append musiccontent (list (ly:music-deep-copy object)))) + (if (not-null? object) (ly:warning (_ "Wrong type (no ly:music) for ~S for instrument ~S in piece ~S") type name piece)) + ) + ) + ) + ; TODO: Does the "Tempo" work here??? + '("Settings" "Key" "Clef" "TimeSignature" "ExtraSettings";"Tempo" + ) + ) + + (if (ly:music? music) + (begin + (set! musiccontent (make-sequential-music (append musiccontent (list music)))) + ;(ly:message "Generating staff for ~a" name) + (let* ((trpPitch (oly:extractTranspositionPitch piece name))) + (if (ly:pitch? trpPitch) + (set! musiccontent (ly:music-transpose musiccontent trpPitch)) + ) + ) + musiccontent + ) + ; For empty music, return empty + '() + ) + ) +) + + + +%%===================================================================== +%% create Lyrics +%%--------------------------------------------------------------------- + + +#(define (oly:lyrics_create_single_context parser piece name voicename lyricsid) + ; If we have lyrics, create a lyrics context containing LyricCombineMusic + ; and add that as second element to the staff's elements list... + ; Also add possibly configured LyricsModifications + (let* ((id (string-append "Lyrics" lyricsid)) + (lyricsmods (oly:lyrics_handler_properties piece name id)) + (lyrics (namedPieceInstrObject piece name id)) + (ctx (if (ly:music? lyrics) + (context-spec-music (make-music 'LyricCombineMusic + 'element lyrics + 'associated-context voicename) + 'Lyrics + (oly:generate_object_name piece name id)) + '()))) + (if (and (not-null? lyricsmods) (not-null? ctx)) + (set! (ly:music-property ctx 'property-operations) lyricsmods) + ) + ctx + ) +) + +#(define (oly:lyrics_create_contexts parser piece name voicename) + (filter not-null? + (map (lambda (str) + (oly:lyrics_create_single_context parser piece name voicename str)) + (list "" "I" "II" "III" "IV" "V" "VI")))) + + +%%===================================================================== +%% Voice handling +%%--------------------------------------------------------------------- + + +#(define (oly:voice_handler_internal parser piece name type music) + (if (ly:music? music) + (let* ( + (voicename (oly:generate_object_name piece name "Voice" )) + (lyrics (oly:lyrics_create_contexts parser piece name voicename)) + (additional (if (not-null? lyrics) (list dynamicUp) '())) + (musiccontent (oly:musiccontent_for_voice parser piece name music additional)) + (voicetype (oly:staff_type type)) + (voice (context-spec-music musiccontent voicetype voicename)) + (voiceprops (oly:voice_handler_properties piece name)) + ) + (if (not-null? voiceprops) + (set! (ly:music-property voice 'property-operations) voiceprops) + ) + (cons voice lyrics) + ) + ; For empty music, return empty + '() + ) +) + +#(define (oly:voice_handler parser piece name type) + (oly:voice_handler_internal parser piece name type (oly:get_music_object piece name))) + + +%%===================================================================== +%% Staff/Group handling +%%--------------------------------------------------------------------- + + +#(define (oly:staff_handler_internal parser piece name type voices) + (if (not-null? voices) + (let* ( + (staffname (oly:generate_staff_name piece name)) + (stafftype (oly:staff_type type)) + (staff (make-simultaneous-music voices)) + (propops (oly:staff_handler_properties piece name)) + ) + (case stafftype + ((SimultaneousMusic ParallelMusic) #f) + (else (set! staff (context-spec-music staff stafftype staffname))) + ) + (if (not-null? propops) + (set! (ly:music-property staff 'property-operations) propops) + ) + staff + ) + ; For empty music, return empty + '() + ) +) + +#(define (oly:staff_handler parser piece name type children) + (let* ((c (if (not-null? children) children (list name))) + (voices (apply append (map (lambda (v) (oly:create_voice parser piece v)) c)) ) + ) + (if (not-null? voices) + (oly:staff_handler_internal parser piece name type voices) + '() + ) + ) +) + +#(define (oly:devnull_handler parser piece name type children) + (oly:voice_handler parser piece name type) +) + +#(define (oly:parallel_voices_staff_handler parser piece name type children) + (let* ( + (voices (map (lambda (i) (oly:create_voice parser piece i)) children)) + ; get the list of non-empty voices and flatten it! + (nonemptyvoices (apply append (filter not-null? voices))) + ) + (if (not-null? nonemptyvoices) + (oly:staff_handler_internal parser piece name "Staff" nonemptyvoices) + '() + ) + ) +) + +#(define (oly:remove-with-tag tag music) + (if (ly:music? music) + (music-filter + (lambda (m) + (let* ((tags (ly:music-property m 'tags)) + (res (memq tag tags))) + (not res))) + music) + music)) + +% Remove all music tagged a not-part-combine +#(define (oly:remove-non-part-combine-events music) + (oly:remove-with-tag 'non-partcombine music)) + +#(define (oly:part_combined_staff_handler parser piece name type children) + (let* ((rawmusic (map (lambda (c) (oly:musiccontent_for_voice parser piece name (oly:get_music_object piece c) '())) children)) + (filteredmusic (map (lambda (m) (oly:remove-non-part-combine-events m)) rawmusic)) + (music (filter not-null? filteredmusic))) + (cond + ((and (pair? music) (ly:music? (car music)) (not-null? (cdr music)) (ly:music? (cadr music))) + ;(ly:message "Part-combine with two music expressions") + (oly:staff_handler_internal parser piece name "Staff" (list (make-part-combine-music parser music #f)))) + ((null? music) + ;;(ly:warning "Part-combine without any music expressions") + '()) + ; exactly one is a music expression, simply use that by joining + ((list? music) + ;;(ly:message "Part-combine with only one music expressions") + (oly:staff_handler_internal parser piece name "Staff" (list (apply append music)))) + (else + ;(ly:message "make_part_combined_staff: ~S ~S ~a" piece instr instruments) + '() ) + ) + ) +) + +% Figured bass is a special case, as it can be voice- or staff-type. When +% given as a staff type, simply call the voice handler, instead + +#(define (oly:figured_bass_staff_handler parser piece name type children) + (let* ((c (if (not-null? children) children (list name))) + (voice (oly:voice_handler parser piece (car c) type))) + (if (pair? voice) (car voice) ()) + ) +) + +#(define (flatten lst) + (define (f remaining result) + (cond + ((null? remaining) result) + ((pair? (car remaining)) (f (cdr remaining) (f (car remaining) result))) + (else (f (cdr remaining) (cons (car remaining) result))))) + (reverse! (f lst '()))) + +#(define (oly:staff_group_handler parser piece name type children) + (let* ( + (staves (flatten (map (lambda (i) (oly:create_staff_or_group parser piece i)) children))) + (nonemptystaves (filter not-null? staves)) + ) + (if (not-null? nonemptystaves) + (let* ( + (musicexpr (if (= 1 (length nonemptystaves)) + (car nonemptystaves) + (make-simultaneous-music nonemptystaves))) + (groupname (oly:generate_staff_name piece name)) + (grouptype (oly:staff_type type)) + (group musicexpr) + (propops (oly:staff_handler_properties piece name)) + ) + (case grouptype + ((SimultaneousMusic ParallelMusic) #f) + (else (set! group (context-spec-music group grouptype groupname))) + ) + (if (pair? propops) + (set! (ly:music-property group 'property-operations) propops)) + group + ) + ; Return empty list if no staves are generated + '() + ) + ) +) + +#(define (oly:create_voice parser piece name) + (let* ( (voice (namedPieceInstrObject piece name "Voice")) + (type (assoc-ref oly:voice_types name)) ) + (if (not-null? voice) + ; Explicit voice variable, use that + voice + + (if (not type) + ; No entry in structure found => simple voice + (oly:voice_handler parser piece name "Voice") + ; Entry found in structure => use the handler for the given type + (let* ( + (voicetype (car type)) + (handler (assoc-ref oly:voice_handlers voicetype)) + ) + (if handler + ((primitive-eval handler) parser piece name voicetype) + (begin + (ly:warning "No handler found for voice type ~a, using default voice handler" voicetype) + (oly:voice_handler parser piece name voicetype) + ) + ) + ) + ) + ) + ) +) + +#(define (oly:create_staff_or_group parser piece name) + (let* ( (staff (namedPieceInstrObject piece name "Staff")) + (type_from_structure (assoc-ref oly:orchestral_score_structure name)) ) + ;(if (not-null? staff) + ; (ly:message "Found staff variable for instrument ~a in piece ~a" instr piece) + ; (ly:message "Staff variable for instrument ~a in piece ~a NOT FOUND" instr piece) + ;) + (if (not-null? staff) + ; Explicit staff variable, use that + staff + + (if (not (list? type_from_structure)) + ; No entry in structure found => simple staff + (oly:staff_handler parser piece name "Staff" '()) + + ; Entry found in structure => use the handler for the given type + (let* ((type (car type_from_structure)) + (handler (assoc-ref oly:staff_handlers type)) + (children (cadr type_from_structure)) + ) + (if handler + ((primitive-eval handler) parser piece name type children) + (begin + (ly:warning "No handler found for staff type ~a, using default staff handler" type) + (oly:staff_handler parser piece name type children) + ) + ) + ) + ) + ) + ) +) + +#(define (oly:dynamics_handler parser piece name type children) + (oly:voice_handler parser piece name type) +) + + +%%===================================================================== +%% Handler definitions +%%--------------------------------------------------------------------- + +#(define oly:staff_handlers + (list + ; staff group types + '("GrandStaff" . oly:staff_group_handler ) + '("PianoStaff" . oly:staff_group_handler ) + '("ChoirStaff" . oly:staff_group_handler ) + '("StaffGroup" . oly:staff_group_handler ) + '("ParallelMusic" . oly:staff_group_handler ) + '("SimultaneousMusic" . oly:staff_group_handler ) + ; staff types + '("Staff" . oly:staff_handler ) + '("DrumStaff" . oly:staff_handler ) + '("RhythmicStaff" . oly:staff_handler ) + '("TabStaff" . oly:staff_handler ) + '("GregorianTranscriptionStaff" . oly:staff_handler ) + '("MensuralStaff" . oly:staff_handler ) + '("VaticanaStaff" . oly:staff_handler ) + '("ChordNames" . oly:staff_handler ) + ; staves with multiple voices + '("PartCombinedStaff" . oly:part_combined_staff_handler ) + '("ParallelVoicesStaff" . oly:parallel_voices_staff_handler ) + ; special cases: Figured bass can be staff or voice type! + '("FiguredBass" . oly:figured_bass_staff_handler ) + ; Devnull is like a staff, only that it doesn't craete output + '("Devnull" . oly:devnull_handler ) + '("Dynamics" . oly:dynamics_handler ) + ) +) + +#(define oly:voice_handlers + (list + ; voice types + '("Voice" . oly:voice_handler ) + '("CueVoice" . oly:voice_handler ) + '("DrumVoice" . oly:voice_handler ) + '("FiguredBass" . oly:voice_handler ) + '("ChordNames" . oly:voice_handler ) + '("GregorianTranscriptionVoice" . oly:voice_handler ) + '("NoteNames" . oly:voice_handler ) + '("TabVoice" . oly:voice_handler ) + '("VaticanaVoice" . oly:voice_handler ) + ) +) + + +#(define (oly:register_staff_type_handler type func) +; (ly:message "Registering staff handler ~a for type ~a" func type) + (set! oly:staff_handlers (assoc-set! oly:staff_handlers type func)) +) + +#(define (oly:register_voice_type_handler type func) +; (ly:message "Registering voice type handler ~a for type ~a" func type) + (set! oly:voice_handlers (assoc-set! oly:voice_handlers type func)) +) + +% handlers for deprecated API +#(oly:register_staff_type_handler 'StaffGroup 'oly:staff_group_handler) +#(oly:register_staff_type_handler 'GrandStaff 'oly:staff_group_handler) +#(oly:register_staff_type_handler 'PianoStaff 'oly:staff_group_handler) +#(oly:register_staff_type_handler 'ChoirStaff 'oly:staff_group_handler) +#(oly:register_staff_type_handler 'Staff 'oly:staff_handler ) +#(oly:register_staff_type_handler 'ParallelMusic 'oly:staff_group_handler) +#(oly:register_staff_type_handler 'SimultaneousMusic 'oly:staff_group_handler) +#(oly:register_staff_type_handler #t 'oly:part_combined_staff_handler ) +#(oly:register_staff_type_handler #f 'oly:parallel_voices_staff_handler ) + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Automatic score generation +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +#(define oly:score_handler add-score) +#(define oly:music_handler add-music) +#(define oly:text_handler add-text) + + +% TODO: deprecate +setUseBook = #(define-music-function (parser location usebook) (boolean?) + (ly:warning "\\setUseBook has been deprecated! Books are now automatically handled without any hacks") + (make-music 'Music 'void #t) +) + + +% Two functions to handle midi-blocks: Either don't set one, or set an empty +% one so that MIDI is generated +#(define (oly:set_no_midi_block score) '()) +#(define (oly:set_midi_block score) + (let* ((midiblock (if (defined? '$defaultmidi) + (ly:output-def-clone $defaultmidi) + (ly:make-output-def)))) + (ly:output-def-set-variable! midiblock 'is-midi #t) + (ly:score-add-output-def! score midiblock) + ) +) + +% \setCreateMidi ##t/##f sets a flag to determine wheter MIDI output should +% be generated +#(define oly:apply_score_midi oly:set_no_midi_block) +setCreateMIDI = #(define-music-function (parser location createmidi) (boolean?) + (if createmidi + (set! oly:apply_score_midi oly:set_midi_block) + (set! oly:apply_score_midi oly:set_no_midi_block) + ) + (make-music 'Music 'void #t) +) + + +% Two functions to handle layout-blocks: Either don't set one, or set an empty +% one so that a PDF is generated +#(define (oly:set_no_layout_block score) '()) +#(define (oly:set_layout_block score) + (let* ((layoutblock (if (defined? '$defaultlayout) + (ly:output-def-clone $defaultlayout) + (ly:make-output-def)))) + (ly:output-def-set-variable! layoutblock 'is-layout #t) + (ly:score-add-output-def! score layoutblock) + ) +) + +% \setCreatePDF ##t/##f sets a flag to determine wheter PDF output should +% be generated +#(define oly:apply_score_layout oly:set_no_layout_block) +setCreatePDF = #(define-music-function (parser location createlayout) (boolean?) + (if createlayout + (set! oly:apply_score_layout oly:set_layout_block) + (set! oly:apply_score_layout oly:set_no_layout_block) + ) + (make-music 'Music 'void #t) +) + + +% Set the piece title in a new header block. +#(define (oly:set_piece_header score piecename) + (if (not-null? piecename) + (let* ((header (make-module))) + (module-define! header 'piece piecename) + (ly:score-set-header! score header) + ) + ) +) + + +% post-filter functions. By default, no filtering is done. However, +% for the *NoCues* function, the cue notes should be killed +keepcuefilter = #(define-music-function (parser location music) (ly:music?) + ((ly:music-function-extract removeWithTag) parser location 'non-cued music)) +removecuefilter = #(define-music-function (parser location music) (ly:music?) + ((ly:music-function-extract removeWithTag) parser location 'cued ((ly:music-function-extract killCues) parser location music))) + +%% The page numbers are pages counts in the pdf file, not visible page number! +%% So we have to offset them if the first page is not page #1 +%% unfortunately this means we have to store the first-page-number of the first +%% bookpart in a global variable, because in later layouts we don't have that +%% information available any more (first-page-number will be the first page +%% number of the currently processed bookpart!) +#(define oly:first-page-offset #f) +#(define (oly:create-toc-file layout pages) + (if (not oly:first-page-offset) + (set! oly:first-page-offset (1- (ly:output-def-lookup layout 'first-page-number)))) + (let* ((label-table (ly:output-def-lookup layout 'label-page-table))) + (if (not (null? label-table)) + (let* ((format-line (lambda (toc-item) + (let* ((label (car toc-item)) + (text (caddr toc-item)) + (label-page (and (list? label-table) + (assoc label label-table))) + (page (and label-page (cdr label-page)))) + (if page + (format #f "~a, section, 1, {~a}, ~a" (- page oly:first-page-offset) text label) + ;; label came from a different bookpart, so ignore it! + #f)))) + (formatted-toc-items (map format-line (toc-items))) + (whole-string (string-join (filter (lambda (i) i) formatted-toc-items) ",\n")) + (output-name (ly:parser-output-name parser)) + (outfilename (format "~a.toc" output-name)) + (outfile (open-output-file outfilename))) + (if (output-port? outfile) + (display whole-string outfile) + (ly:warning (_ "Unable to open output file ~a for the TOC information") outfilename)) + (close-output-port outfile))))) + + +#(define-public (oly:add-toc-item parser markup-symbol text) + (oly:music_handler parser (add-toc-item! markup-symbol text))) + + +#(define (oly:add-score parser score piecename) + (if (not-null? piecename) + (oly:add-toc-item parser 'tocItemMarkup piecename)) + (oly:score_handler parser score) +) +% The helper function to build a score. +#(define (oly:createScoreHelper parser location piece children func) + (let* ( + (staves (oly:staff_group_handler parser piece "" "SimultaneousMusic" children)) + (music (if (not-null? staves) + ((ly:music-function-extract func) parser location staves) + '() + )) + (score '()) + (piecename (namedPieceInstrObject piece (car children) "PieceName")) + (piecenametacet (namedPieceInstrObject piece (car children) "PieceNameTacet")) + (header '()) + ) + (if (null? music) + ; No staves, print tacet + (begin + (if (not-null? piecenametacet) (set! piecename piecenametacet)) + (if (not-null? piecename) + (oly:add-score parser (list (oly:piece-title-markup piecename)) piecename) + (ly:warning (_ "No music and no score title found for part ~a and instrument ~a") piece children) + ) + ) + ; we have staves, apply the piecename to the score and add layout/midi blocks if needed + (begin + (set! score (scorify-music music parser)) + (oly:set_piece_header score piecename) + (oly:apply_score_midi score) + (oly:apply_score_layout score) + ; Schedule the score for typesetting + (oly:add-score parser score piecename) + ) + ) + ) + ; This is a void function, the score has been schedulled for typesetting already + (make-music 'Music 'void #t) +) + +createVoice = #(define-music-function (parser location piece name) (string? string?) + (let* ((vc (oly:create_voice parser piece name))) + (make-music 'SimultaneousMusic + 'elements vc))) + +createStaff = #(define-music-function (parser location piece name) (string? string?) + (oly:create_staff_or_group parser piece name)) +createStaffForContents = #(define-music-function (parser location piece name contents) (string? string? ly:music?) + (let* ((tstruct (assoc-ref oly:orchestral_score_structure name)) + (type (if (list? tstruct) (car tstruct) "Staff"))) + (oly:staff_handler_internal parser piece name type (list contents)))) + + +createScore = #(define-music-function (parser location piece children) (string? list?) + (oly:createScoreHelper parser location piece children keepcuefilter) +) +createNoCuesScore = #(define-music-function (parser location piece children) (string? list?) + (oly:createScoreHelper parser location piece children removecuefilter) +) + +createHeadline = #(define-music-function (parser location headline) (string?) + (oly:add-toc-item parser 'tocItemMarkup headline) + (oly:score_handler parser (list (oly:piece-title-markup headline))) + (make-music 'Music 'void #t) +) + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% CUE NOTES +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +newInstrument = #(define-music-function (parser location instr) (string?) +#{ + \set Voice.instrumentCueName = #(string-join (list "+" instr)) +#} +) +cueText = #(define-music-function (parser location instr) (string?) +#{ + \set Voice.instrumentCueName = $instr +#} +) +cueMarkup = #(define-music-function (parser location instr) (markup?) +#{ + \set Voice.instrumentCueName = $instr +#} +) + +clearCueText = #(define-music-function (parser location) () +#{ + \unset Voice.instrumentCueName +#} +) + +insertCueText = #(define-music-function (parser location instr) (string?) + (if (string-null? instr) + #{ \tag #'cued \clearCueText #} + #{ \tag #'cued \cueText #instr #} +)) + +% generate a cue music section with instrument names +% Parameters: \namedCueDuring NameOfQuote CueDirection CueInstrument OriginalInstrument music +% -) NameOfQuote CueDirection music are the parameters for \cueDuring +% -) CueInstrument and OriginalInstrument are the displayed instrument names +% typical call: +% \namedCueDuring #"vIQuote" #UP #"V.I" #"Sop." { R1*3 } +% This adds the notes from vIQuote (defined via \addQuote) to three measures, prints "V.I" at +% the beginning of the cue notes and "Sop." at the end +namedCueDuring = #(define-music-function (parser location cuevoice direction instrcue instr cuemusic) (string? number? string? string? ly:music?) +#{ + \cueDuring #cuevoice #direction { + \insertCueText #instrcue + $cuemusic + \insertCueText #instr + } +#} +) +namedTransposedCueDuring = #(define-music-function (parser location cuevoice direction instrcue instr trans cuemusic) (string? number? string? string? ly:music? ly:music?) + #{ + \transposedCueDuring #cuevoice #direction #trans { + \insertCueText #instrcue + #cuemusic + \insertCueText #instr + } + #} +) + +% set the cue instrument name and clef +% setClefCue = #(define-music-function (parser location instr clef) +% (string? ly:music?) +% #{ +% \once \override Staff.Clef #'font-size = #-3 \clef $clef +% \insertCueText $instr +% #} ) + +% generate a cue music section with instrument names and clef changes +% Parameters: \cleffedCueDuring NameOfQuote CueDirection CueInstrument CueClef OriginalInstrument OriginalClef music +% -) NameOfQuote CueDirection music are the parameters for \cueDuring +% -) CueInstrument and OriginalInstrument are the displayed instrument names +% -) CueClef and OriginalClef are the clefs for the the cue notes and the clef of the containing voice +% typical call: +% \cleffedCueDuring #"vIQuote" #UP #"V.I" #"treble" #"Basso" #"bass" { R1*3 } +% This adds the notes from vIQuote (defined via \addQuote) to three measures, prints "V.I" at +% the beginning of the cue notes and "Basso" at the end. The clef is changed to treble at the +% beginning of the cue notes and reset to bass at the end +cleffedCueDuring = #(define-music-function (parser location cuevoice direction instrcue clefcue instr clefinstr cuemusic) + (string? number? string? string? string? string? ly:music?) + #{ + \namedCueDuringWithClef $cuevoice $direction $instrcue $clefcue $instr $cuemusic + #} +) +% generate a cue music section with instrument names and clef changes +% Parameters: \namedCueDuringClef NameOfQuote CueDirection CueInstrument CueClef OriginalInstrument music +% -) NameOfQuote CueDirection music are the parameters for \cueDuring +% -) CueInstrument and OriginalInstrument are the displayed instrument names +% -) CueClef is the clef for the the cue notes +% typical call: +% \namedCueDuringWithClef #"vIQuote" #UP #"V.I" #"treble" #"Basso" { R1*3 } +% This adds the notes from vIQuote (defined via \addQuote) to three measures, prints "V.I" at +% the beginning of the cue notes and "Basso" at the end. The clef is changed to treble at the +% beginning of the cue notes and reset to bass at the end +namedCueDuringWithClef = #(define-music-function (parser location cuevoice direction instrcue clefcue instr cuemusic) + (string? number? string? string? string? ly:music?) + #{ + \cueDuringWithClef #cuevoice #direction #(extract-ancient-or-modern-clef clefcue) { + \insertCueText #instrcue + #cuemusic + \insertCueText #instr + } + #} +) + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% DYNAMICS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +dynamicsX = #(define-music-function (parser location offset) (number?) +#{ + \once \override DynamicText #'X-offset = $offset + \once \override DynamicLineSpanner #'Y-offset = #0 +#}) + +% Move the dynamic sign inside the staff to a fixed staff-relative position +% posY (where 0 means vertically starts at the middle staff line) +dynamicsAllInside = #(define-music-function (parser location offsetX posY) +(number? number?) +#{ + % Invalid y-extent -> hidden from skyline calculation and collisions +% \once \override DynamicLineSpanner #'Y-extent = #(cons +0 -0.01) + \once \override DynamicLineSpanner #'Y-extent = $(lambda (grob) + (let* ((ext (ly:axis-group-interface::height grob)) + (dir (ly:grob-property grob 'direction))) + (if (eq? dir UP) + (cons (- (cdr ext) 0.1) (cdr ext)) + (cons (car ext) (+ (car ext) 0.1))))) + % move by X offset and to fixed Y-position (use Y-offset of parent!) + \once \override DynamicText #'X-offset = $offsetX + \once \override DynamicText #'Y-offset = + $(lambda (grob) + (let* ((head (ly:grob-parent grob Y)) + (offset (ly:grob-property head 'Y-offset))) + (- posY offset (- 0.6)))) + \once \override DynamicLineSpanner #'Y-offset = $posY +#}) + +dynamicsUpInside = #(define-music-function (parser location offsetX) (number?) + ((ly:music-function-extract dynamicsAllInside) parser location offsetX 1.5) +) + +dynamicsDownInside = #(define-music-function (parser location offsetX) (number?) + ((ly:music-function-extract dynamicsAllInside) parser location offsetX -3.5) +) + +hairpinOffset = #(define-music-function (parser location posY) (number?) +#{ + \once \override DynamicLineSpanner #'Y-offset = $posY + \once \override DynamicLineSpanner #'Y-extent = #(cons +0 -0.01) +#}) + +#(define ((line-break-offset before after) grob) + (let* ((orig (ly:grob-original grob)) + ; All siblings if line-broken: + (siblings (if (ly:grob? orig) (ly:spanner-broken-into orig) '() ))) + (if (>= (length siblings) 2) + ; We have been line-broken + (if (eq? (car (last-pair siblings)) grob) + ; Last sibling: + (ly:grob-set-property! grob 'Y-offset after) + ; Others get the before value: + (ly:grob-set-property! grob 'Y-offset before) + ) + ) + ) +) + +rf = #(make-dynamic-script "rf") +ffz = #(make-dynamic-script "ffz") +pf = #(make-dynamic-script "pf") +sempp = #(make-dynamic-script (markup #:line( #:with-dimensions '(0 . 0) +'(0 . 0) #:right-align #:normal-text #:italic "sempre" #:dynamic "pp"))) +parenf = #(make-dynamic-script (markup #:line(#:normal-text #:italic #:fontsize 2 "(" #:dynamic "f" #:normal-text #:italic #:fontsize 2 ")"))) +parenp = #(make-dynamic-script (markup #:line(#:normal-text #:italic #:fontsize 2 "(" #:dynamic "p" #:normal-text #:italic #:fontsize 2 ")"))) +pdolce = #(make-dynamic-script (markup #:line(#:dynamic "p" #:with-dimensions '(0 . 0) '(0 . 0) #:normal-text #:italic "dolce"))) +ppdolce = #(make-dynamic-script (markup #:line(#:dynamic "pp" #:with-dimensions '(0 . 0) '(0 . 0) #:normal-text #:italic "dolce"))) +dolce = #(make-dynamic-script (markup #:line(#:normal-text #:italic "dolce"))) +sfpdolce = #(make-dynamic-script (markup #:line(#:dynamic "sfp" #:with-dimensions '(0 . 0) '(0 . 0) #:normal-text #:italic "dolce" ))) +bracketf = #(make-dynamic-script (markup #:line(#:concat(#:normal-text #:fontsize 3 "[" #:dynamic "f" #:hspace 0.1 #:normal-text #:fontsize 3 "]")))) +bracketmf = #(make-dynamic-script (markup #:line(#:concat(#:normal-text #:fontsize 3 "[" #:dynamic "mf" #:hspace 0.1 #:normal-text #:fontsize 3 "]")))) +bracketmp = #(make-dynamic-script (markup #:line(#:concat(#:normal-text #:fontsize 2 "[" #:hspace 0.2 #:dynamic "mp" #:normal-text #:fontsize 2 "]")))) +bracketp = #(make-dynamic-script (markup #:line(#:concat(#:normal-text #:fontsize 2 "[" #:hspace 0.2 #:dynamic "p" #:normal-text #:fontsize 2 "]")))) + +whiteoutp = #(make-dynamic-script (markup #:whiteout #:pad-markup 0.5 #:dynamic "p")) +whiteoutf = #(make-dynamic-script (markup #:whiteout #:pad-markup 0.5 #:dynamic "f")) +whiteoutff = #(make-dynamic-script (markup #:whiteout #:pad-markup 0.5 #:dynamic "ff")) + +sim = ^\markup{\italic "sim."} + +%%% Thanks to "Gilles THIBAULT" , there is a way +% to remove also the fermata from R1-\fermataMarkup: By filtering the music +% and removing the corresponding events. +% Documented as an LSR snippet: http://lsr.dsi.unimi.it/LSR/Item?id=372 +#(define (filterOneEventsMarkup event) +( let ( (eventname (ly:music-property event 'name)) ) + (not + (or ;; add here event name you do NOT want + (eq? eventname 'MultiMeasureTextEvent) + (eq? eventname 'AbsoluteDynamicEvent) + (eq? eventname 'TextScriptEvent) + (eq? eventname 'ArticulationEvent) + (eq? eventname 'CrescendoEvent) + (eq? eventname 'DecrescendoEvent) + ) + ) +)) + +filterArticulations = #(define-music-function (parser location music) (ly:music?) + (music-filter filterOneEventsMarkup music) +) + + + +%%% Add the same articulation to a longer sequence of notes: +#(define (make-script x) + (make-music 'ArticulationEvent + 'articulation-type x)) + +#(define (add-articulation music art) + (map-some-music + (lambda (m) + (cond ((music-is-of-type? m 'event-chord) + (set! (ly:music-property m 'elements) + (append (ly:music-property m 'elements) + (list (make-script art)))) + m) + ((music-is-of-type? m 'note-event) + (set! (ly:music-property m 'articulations) + (append (ly:music-property m 'articulations) + (list (make-script art)))) + m) + (else #f))) + music)) + +addArticulation = #(define-music-function (parser location type music) + (string? ly:music? ) + (add-articulation music type)) + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% Tempo markings +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +rit = \markup {\italic "rit."} +atempo = \markup {\italic "a tempo"} +pocorit = \markup {\italic "poco rit."} +ppmosso = \markup {\italic "poco più mosso"} +pizz = \markup {\italic "pizz."} +arco = \markup {\italic "arco"} +colarco = \markup {\italic "Col' arco"} +perd = \markup {\italic "perdend."} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% REST COMBINATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +%% REST COMBINING, TAKEN FROM http://lsr.dsi.unimi.it/LSR/Item?id=336 +%% +%% Usage: +%% \new Staff \with { +%% \override RestCollision #'positioning-done = #merge-rests-on-positioning +%% } << \somevoice \\ \othervoice >> +%% or (globally): +%% \layout { +%% \context { +%% \Staff +%% \override RestCollision #'positioning-done = #merge-rests-on-positioning +%% } +%% } +%% +%% Limitations: +%% - only handles two voices +%% - does not handle multi-measure/whole-measure rests + +#(define (rest-score r) + (let ((score 0) + (yoff (ly:grob-property-data r 'Y-offset)) + (sp (ly:grob-property-data r 'staff-position))) + (if (number? yoff) + (set! score (+ score 2)) + (if (eq? yoff 'calculation-in-progress) + (set! score (- score 3)))) + (and (number? sp) + (<= 0 2 sp) + (set! score (+ score 2)) + (set! score (- score (abs (- 1 sp))))) + score)) + +#(define (merge-rests-on-positioning grob) + (let* ((can-merge #f) + (elts (ly:grob-object grob 'elements)) + (num-elts (and (ly:grob-array? elts) + (ly:grob-array-length elts))) + (two-voice? (= num-elts 2))) + (if two-voice? + (let* ((v1-grob (ly:grob-array-ref elts 0)) + (v2-grob (ly:grob-array-ref elts 1)) + (v1-rest (ly:grob-object v1-grob 'rest)) + (v2-rest (ly:grob-object v2-grob 'rest))) + (and + (ly:grob? v1-rest) + (ly:grob? v2-rest) + (let* ((v1-duration-log (ly:grob-property v1-rest 'duration-log)) + (v2-duration-log (ly:grob-property v2-rest 'duration-log)) + (v1-dot (ly:grob-object v1-rest 'dot)) + (v2-dot (ly:grob-object v2-rest 'dot)) + (v1-dot-count (and (ly:grob? v1-dot) + (ly:grob-property v1-dot 'dot-count -1))) + (v2-dot-count (and (ly:grob? v2-dot) + (ly:grob-property v2-dot 'dot-count -1)))) + (set! can-merge + (and + (number? v1-duration-log) + (number? v2-duration-log) + (= v1-duration-log v2-duration-log) + (eq? v1-dot-count v2-dot-count))) + (if can-merge + ;; keep the rest that looks best: + (let* ((keep-v1? (>= (rest-score v1-rest) + (rest-score v2-rest))) + (rest-to-keep (if keep-v1? v1-rest v2-rest)) + (dot-to-kill (if keep-v1? v2-dot v1-dot))) + ;; uncomment if you're curious of which rest was chosen: + ;;(ly:grob-set-property! v1-rest 'color green) + ;;(ly:grob-set-property! v2-rest 'color blue) + (ly:grob-suicide! (if keep-v1? v2-rest v1-rest)) + (if (ly:grob? dot-to-kill) + (ly:grob-suicide! dot-to-kill)) + (ly:grob-set-property! rest-to-keep 'direction 0) + (ly:rest::y-offset-callback rest-to-keep))))))) + (if can-merge + #t + (ly:rest-collision::calc-positioning-done grob)))) + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% TABLE OF CONTENTS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +contentsTitle = "Inhalt / Contents" + +\paper { + tocTitleMarkup = \markup \fill-line{ + \null + \column { + \override #(cons 'line-width (* 7 cm)) + \line{ \fill-line {\piece-title {\contentsTitle} \null }} + \hspace #1 + } + \null + } + tocItemMarkup = \markup \fill-line { + \null + \column { + \override #(cons 'line-width (* 7 cm )) + \line { \fill-line{\fromproperty #'toc:text \fromproperty #'toc:page }} + } + \null + } +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% TITLE PAGE / HEADER +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +#(define-markup-command (when-property layout props symbol markp) (symbol? markup?) + (if (chain-assoc-get symbol props) + (interpret-markup layout props markp) + (ly:make-stencil '() '(1 . -1) '(1 . -1)))) + +#(define-markup-command (vspace layout props amount) (number?) + "This produces a invisible object taking vertical space." + (let ((amount (* amount 3.0))) + (if (> amount 0) + (ly:make-stencil "" (cons -1 1) (cons 0 amount)) + (ly:make-stencil "" (cons -1 1) (cons amount amount))))) + + + +titlePageMarkup = \markup \abs-fontsize #10 \when-property #'header:title \column { + \vspace #4 + \fill-line { \fontsize #8 \fromproperty #'header:composer } + \vspace #1 + \fill-line { \fontsize #8 \fromproperty #'header:poet } + \vspace #4 + \fill-line { \fontsize #10 \bold \fromproperty #'header:titlepagetitle } + \vspace #1 + \fontsize #2 \when-property #'header:titlepagesubtitle { + \fill-line { \fromproperty #'header:titlepagesubtitle } + \vspace #1 + } + \fill-line { \postscript #"-20 0 moveto 40 0 rlineto stroke" } + \vspace #8 + \fill-line { \fontsize #5 \fromproperty #'header:ensemble } + \vspace #0.02 + \fill-line { \fontsize #2 \fromproperty #'header:instruments } + \vspace #9 + \fill-line { \fontsize #5 \fromproperty #'header:date } + \vspace #1 + \fill-line { \fontsize #5 \fromproperty #'header:scoretype } + \vspace #1 + \when-property #'header:instrument { + \fill-line { \bold \fontsize #6 \rounded-box \fromproperty #'header:instrument } + } + \vspace #7 + \fontsize #2 \when-property #'header:enteredby \override #'(baseline-skip . 3.75) \left-align\center-column { + \fill-line { "Herausgegeben von: / Edited by:"} + \vspace #0. + \fill-line { \fromproperty #'header:enteredby } + } + \fill-line { + \when-property #'header:arrangement \column { + \vspace #8 + \fill-line { \fontsize #3 \fromproperty #'header:arrangement } + } + } + \vspace #6 + \fill-line { \fromproperty #'header:copyright } +} + +titleHeaderMarkup = \markup { + \override #'(baseline-skip . 3.5) + \column { + \fill-line { + \fromproperty #'header:logo + \override #'(baseline-skip . 4.5) \center-column { + \bold \abs-fontsize #18 \fromproperty #'header:title + \bold \abs-fontsize #12 \fromproperty #'header:subtitle + \abs-fontsize #11 \fromproperty #'header:subsubtitle + } + \bold \abs-fontsize #11 \when-property #'header:instrument \rounded-box \fromproperty #'header:instrument + } + \fill-line { + \with-dimensions #'( 0 . 0) #'( 0 . 1 ) \null + } + + \fill-line { + \abs-fontsize #10 \fromproperty #'header:poet + \abs-fontsize #10 \fromproperty #'header:composer + } + \fill-line { + \abs-fontsize #10 \fromproperty #'header:meter + \abs-fontsize #10 \fromproperty #'header:arranger + } + } +} +date = #(strftime "%d-%m-%Y" (localtime (current-time))) +\header { + logo = \date + scorenumber = \markup \concat { \fromproperty #'header:scorenumberbase "-" \fromproperty #'header:instrumentnr } + pdftitle = \markup \line {\concat{\fromproperty #'header:shortcomposer ":"} \concat {\fromproperty #'header:title ","} \fromproperty #'header:instrument \fromproperty #'header:scoretype } +} + + +titleScoreMarkup = \markup \piece-title \fromproperty #'header:piece + +\paper { + scoreTitleMarkup = \titleScoreMarkup + bookTitleMarkup = \titleHeaderMarkup +} + + + +%%%%%%%%%%%%%% headers and footers %%%%%%%%%%%%%%%%%%%%%%%%%% + +#(define (first-score-page layout props arg) + (let* ((label 'first-score-page) + (table (ly:output-def-lookup layout 'label-page-table)) + (label-page (and (list? table) (assoc label table))) + (page-number (and label-page (cdr label-page))) + ) + (if (eq? (chain-assoc-get 'page:page-number props -1) page-number) + (interpret-markup layout props arg) + empty-stencil))) + +#(define no-header-table '(1)) +addNoHeaderPage = #(define-music-function (parser location nr) (number?) + (set! no-header-table (cons nr no-header-table)) + (make-music 'Music 'void #t)) +setNoHeaderPages = #(define-music-function (parser location pages) (list?) + (set! no-header-table pages) + (make-music 'Music 'void #t)) + +#(define (is-header-page layout props arg) + (let* ((page-number (chain-assoc-get 'page:page-number props -1))) + (if (not (member page-number no-header-table)) + (interpret-markup layout props arg) + empty-stencil))) + +#(define no-footer-table '(1)) +addNoFooterPage = #(define-music-function (parser location nr) (number?) + (set! no-footer-table (cons nr no-footer-table)) + (make-music 'Music 'void #t)) +setNoFooterPages = #(define-music-function (parser location pages) (list?) + (set! no-footer-table pages) + (make-music 'Music 'void #t)) + +#(define (is-footer-page layout props arg) + (let* ((page-number (chain-assoc-get 'page:page-number props -1))) + (if (not (member page-number no-footer-table)) + (interpret-markup layout props arg) + empty-stencil))) + +#(define copyright-pages-table '(1)) +addCopyrightPage = #(define-music-function (parser location nr) (number?) + (set! copyright-pages-table (cons nr copyright-pages-table)) + (make-music 'Music 'void #t)) +setCopyrightPages = #(define-music-function (parser location pages) (list?) + (set! copyright-pages-table pages) + (make-music 'Music 'void #t)) + +#(define (is-copyright-page layout props arg) + (let* ((page-number (chain-assoc-get 'page:page-number props -1))) + (if (member page-number copyright-pages-table) + (interpret-markup layout props arg) + empty-stencil))) + + + +\paper { + olyStdOddHeaderMarkup = \markup \fill-line { + %% force the header to take some space, otherwise the + %% page layout becomes a complete mess. + " " + \on-the-fly #is-header-page \fromproperty #'header:title + \on-the-fly #is-header-page \fromproperty #'page:page-number-string + } + olyStdEvenHeaderMarkup = \markup \fill-line { + \on-the-fly #is-header-page \fromproperty #'page:page-number-string + \on-the-fly #is-header-page \fromproperty #'header:composer + " " + } + olyInstrumentOddHeaderMarkup = \markup \fill-line { + " " + \on-the-fly #is-header-page \concat { \fromproperty #'header:instrument } + \on-the-fly #is-header-page \fromproperty #'page:page-number-string + } + olyInstrumentEvenHeaderMarkup = \markup \fill-line { + \on-the-fly #is-header-page \fromproperty #'page:page-number-string + \on-the-fly #is-header-page \concat { \fromproperty #'header:composer ": " \fromproperty #'header:title } + " " + } + oddHeaderMarkup = \olyStdOddHeaderMarkup + evenHeaderMarkup = \olyStdEvenHeaderMarkup + + olyStdOddFooterMarkup = \markup { + \column { + \fill-line { + %% publisher header field only on title page. + \on-the-fly #first-page \fromproperty #'header:publisher + } + \fill-line { + %% copyright on the first real score page + \on-the-fly #is-copyright-page \fromproperty #'header:copyright + \on-the-fly #is-copyright-page \null + } + \fill-line { + %% All other pages get the number of the edition centered + \on-the-fly #is-footer-page \fromproperty #'header:scorenumber + } + } + } + olyInstrumentOddFooterMarkup = \markup { + \column { + \fill-line { + %% copyright on the first real score page + \on-the-fly #is-copyright-page \fromproperty #'header:copyright + \on-the-fly #is-copyright-page \null + } + \fill-line { + %% All other pages get the number of the edition centered + \on-the-fly #is-footer-page \fromproperty #'header:scorenumber + } + } + } + oddFooterMarkup = \olyStdOddFooterMarkup +} + + + + + + + + + + + +% Interpret the given markup with the header fields added to the props. +% This way, one can re-use the same functions (using fromproperty +% #'header:field) in the header block and as top-level markup. +% +% This function is originally copied from mark-up-title (file scm/titling.scm), +% which is lilypond's internal function to handle the title markups. I needed +% to replace the scopes and manually add the $defaultheader (which is internally +% done in paper-book.cc before calling mark-up-title. Also, I don't extract the +% markup from the header block, but use the given markup. +% +% I'm not sure if I really need the page properties in props, too... But I +% suppose it does not hurt, either. +#(define-markup-command (markupWithHeader layout props markup) (markup?) + "Interpret the given markup with the header fields added to the props. + This way, one can re-use the same functions (using fromproperty + #'header:field) in the header block and as top-level markup." + (let* ( + ; TODO: If we are inside a score, add the score's local header block, too! + ; Currently, I only use the global header block, stored in $defaultheader + (scopes (list $defaultheader)) + (alists (map ly:module->alist scopes)) + + (prefixed-alist + (map (lambda (alist) + (map (lambda (entry) + (cons + (string->symbol (string-append "header:" (symbol->string (car entry)))) + (cdr entry))) + alist)) + alists)) + (props (append prefixed-alist + props + (layout-extract-page-properties layout))) + ) + (interpret-markup layout props markup) + ) +) + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% Equally spacing multiple columns (e.g. for translations) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Credits: Nicolas Sceaux on the lilypond-user mailinglist +#(define-markup-command (columns layout props args) (markup-list?) + (let ((line-width (/ (chain-assoc-get 'line-width props + (ly:output-def-lookup layout 'line-width)) + (max (length args) 1)))) + (interpret-markup layout props + (make-line-markup (map (lambda (line) + (markup #:pad-to-box `(0 . ,line-width) '(0 . 0) + #:override `(line-width . ,line-width) + line)) + args))))) + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% SCORE (HEADER / LAYOUT) SETTINGS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +startSlashedGraceMusic = { + \override Flag #'stroke-style = #"grace" +} + +stopSlashedGraceMusic = { + \revert Flag #'stroke-style +} + +slashedGrace = +#(def-grace-function startSlashedGraceMusic stopSlashedGraceMusic + (_i "Create slashed graces (slashes through stems, but no slur)from the following music expression")) + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% SCORE (HEADER / LAYOUT) SETTINGS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\paper { + footnote-separator-markup = \markup { \fill-line { \override #`(span-factor . 1/4) { \draw-hline } \null }} + + left-margin = 2\cm + right-margin = 1.5\cm + line-width = 17.5\cm +% bottom-margin = 1.5\cm + top-margin = 0.7\cm + ragged-right = ##f + ragged-last = ##f + ragged-bottom = ##f + ragged-last-bottom = ##f +} +\layout { + \context { + \ChoirStaff + % If only one non-empty staff in a system exists, still print the backet + \override SystemStartBracket #'collapse-height = #1 + \consists "Instrument_name_engraver" + \consists "Keep_alive_together_engraver" + } + \context { + \StaffGroup + % If only one non-empty staff in a system exists, still print the backet + \override SystemStartBracket #'collapse-height = #1 + \consists "Instrument_name_engraver" + } + \context { + \GrandStaff + \override SystemStartBracket #'collapse-height = #1 + \consists "Instrument_name_engraver" + } + \context { + \FiguredBass + \override VerticalAxisGroup #'padding = #0 + } + \context { + \Score + % Force multi-measure rests to be written as one span + \override MultiMeasureRest #'expand-limit = #3 + skipBars = ##t + autoBeaming = ##f + \override CombineTextScript #'avoid-slur = #'outside + \override DynamicTextSpanner #'style = #'none + \override InstrumentSwitch #'font-size = #-1 + + % Rest collision + \override RestCollision #'positioning-done = #merge-rests-on-positioning + % Auto-Accidentals: Use modern-cautionary style... + extraNatural = ##f + % Accidental rules (the rule giving the most accidentals wins!) + % -) Reset accidentals at each barline -> accs not in key sig will always be printed + % -) Same octave accidentals are remembered for two measures -> cancellation + % -) other octave accidentals are remembered for next measure -> cancellation + autoAccidentals = #`(Staff ,(make-accidental-rule 'same-octave 0) + ,(make-accidental-rule 'any-octave 0) + ,(make-accidental-rule 'any-octave 1) + ,(make-accidental-rule 'same-octave 2)) + % No auto-cautionaries, we always use autoAccidentals! +% autoCautionaries = #`(Staff ,(make-accidental-rule 'any-octave 0) +% ,(make-accidental-rule 'same-octave 1)) + printKeyCancellation = ##t + quotedEventTypes = #'(StreamEvent) + quotedCueEventTypes = #'( + rhythmic-event + tie-event + beam-event + tuplet-span-event + tremolo-event + glissando-event + harmonic-event + repeat-tie-event + articulation-event + slur-event + trill-span-event + tremolo-span-event + ) + implicitBassFigures = #'(0 100) + } + \context { + \Staff + \RemoveEmptyStaves + } +} + + +ts = #(make-music 'TextScriptEvent 'text "t.s." 'direction UP ) +tt = #(make-music 'TextScriptEvent 'text "Tutti" 'direction UP ) +solo = #(make-music 'TextScriptEvent 'text "Solo" 'direction UP ) +tutti = #(make-music 'TextScriptEvent 'text "Tutti" 'direction UP ) +bracketts = #(make-music 'TextScriptEvent 'text "[t.s.]" 'direction UP ) +brackettt = #(make-music 'TextScriptEvent 'text "[Tutti]" 'direction UP ) +bracketsolo = #(make-music 'TextScriptEvent 'text "[Solo]" 'direction UP ) + +sottovoce = #(make-music 'TextScriptEvent 'text "sotto voce" 'direction UP ) + +dashedSlur = -\tweak #'dash-definition #'((0 1 0.4 0.75))( +dashedTie = -\tweak #'dash-definition #'((0 1 0.4 0.75))~ + +divisi = #(define-music-function (parser location vc1 vc2) (ly:music? ly:music?) +#{ + << { \voiceOne $vc1 \oneVoice} \context Voice = "divisi2" { \voiceTwo $vc2 } >> +#} +) + +#(define twoVoice divisi) + +#(define-public (bracket-stencils grob) + (let ((lp (grob-interpret-markup grob (markup #:fontsize 3.5 #:translate (cons -0.3 -0.5) "["))) + (rp (grob-interpret-markup grob (markup #:fontsize 3.5 #:translate (cons -0.3 -0.5) "]")))) + (list lp rp))) + +bracketify = #(define-music-function (parser loc arg) (ly:music?) + (_i "Tag @var{arg} to be parenthesized.") +#{ + \once \override ParenthesesItem #'stencils = #bracket-stencils + \parenthesize $arg +#}) + + + +#(define-markup-command (hat layout props arg) (markup?) + "Draw a hat above the given string @var{arg}." + (interpret-markup layout props (markup #:combine #:raise 1.5 "^" arg))) + + + +smallFlageolet = +#(let ((m (make-music 'ArticulationEvent + 'articulation-type "flageolet"))) + (ly:music-set-property! m 'tweaks + (acons 'font-size -2 + (ly:music-property m 'tweaks))) + m) + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% LICENSE TEXTS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +LicenseCCBYPlain = \markup {Creative Commons BY \with-url #"http://creativecommons.org/licenses/by/3.0/at/" {\translate #'(0 . -0.7) \epsfile #Y #3 #"orchestrallily/cc-by.eps" }} +LicenseCCBY = \markup {Lizensiert unter / Licensed under: Creative Commons BY \with-url #"http://creativecommons.org/licenses/by/3.0/at/" {\translate #'(0 . -0.7) \epsfile #Y #3 #"orchestrallily/cc-by.eps" }} +LicenseCCBYNC = \markup {Lizensiert unter / Licensed under: Creative Commons BY-NC \with-url #"http://creativecommons.org/licenses/by-nc/3.0/at/" {\translate #'(0 . -0.7) \epsfile #Y #3 #"orchestrallily/cc-by-nc.eps" }} +LicenseNoRestrictions = \markup{\line {Die Ausgabe darf kopiert und ohne Einschränkungen aufgeführt werden. / May be copied and performed without restriction.}} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% VARIOUS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +startUnremovableSection = \set Staff.keepAliveInterfaces = + #'(rhythmic-grob-interface + rest-interface + lyric-interface + percent-repeat-item-interface + percent-repeat-interface + stanza-number-interface) + +endUnremovableSection = \unset Staff.keepAliveInterfaces + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% EDITORIAL ANNOTATIONS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +#(define-public (editorial-bracket-stencil stil padding widen) +"Add brackets for editorial annoations around STIL, producing a new stencil." +(let* ((axis Y) + (other-axis (lambda (a) (remainder (+ a 1) 2))) + (ext (interval-widen (ly:stencil-extent stil axis) widen)) + (thick 0.15) + (protrusion 0.3) + (lb (ly:bracket axis ext thick protrusion)) + (rb (ly:bracket axis ext thick (- protrusion)))) + (set! stil (ly:stencil-combine-at-edge stil (other-axis axis) 1 rb padding)) + (set! stil + (ly:stencil-combine-at-edge lb (other-axis axis) 1 stil padding)) + stil)) + +editorialHairpin = \once \override Hairpin #'stencil = #(lambda (grob) (editorial-bracket-stencil (ly:hairpin::print grob) 0.2 0.55)) +editorialDynamic = \once \override DynamicText #'stencil = #(lambda (grob) (editorial-bracket-stencil (ly:text-interface::print grob) 0.2 0.55)) +editorialMarkup = \once \override TextScript #'stencil = #(lambda (grob) (editorial-bracket-stencil (ly:text-interface::print grob) 0.2 0.55)) + +% videStart = \mark \markup { \hspace #1 \musicglyph #"scripts.coda" \with-dimensions #'(0 . 0) #'(0 . 0) \left-align { vi-} } +videStart = \mark \markup \halign #-2.3 \concat { \hspace #4.5 \musicglyph #"scripts.coda" \left-align { vi- } } +% videEnd = \notemode { +% \once \override Score.RehearsalMark #'break-visibility = #begin-of-line-invisible +% \mark \markup \concat{ \with-dimensions #'(0 . 0) #'(0 . 0) \right-align { -de } \hspace #1 \musicglyph #"scripts.coda" } +%} +videEnd = \notemode { + \once \override Score.RehearsalMark #'break-visibility = #begin-of-line-invisible + \mark \markup \concat{ \right-align { -de } \hspace #1.5 \musicglyph #"scripts.coda" \hspace #4.2 } +} + + + +\layout { + \context {\Staff + soloText = #"I" + soloIIText = #"II" + aDueText = #"a2" + } +} + +\paper { +% annotate-spacing = ##t + ragged-bottom = ##f + ragged-last = ##f + ragged-last-bottom = ##f + + top-markup-spacing #'minimum-distance = #5 +% top-markup-spacing #'basic-distance = #4 +% top-markup-spacing #'padding = #2 + top-markup-spacing #'stretchability = #15 + + top-system-spacing #'minimum-distance = #0 +% top-system-spacing #'basic-distance = #3 + top-system-spacing #'padding = #2 + top-system-spacing #'stretchability = #13 + + markup-system-spacing #'minimum-distance = #5 +% markup-system-spacing #'basic-distance = #4 + markup-system-spacing #'padding = #3 + markup-system-spacing #'stretchability = #25 + + system-system-spacing #'minimum-distance = #0 +% system-system-spacing #'basic-distance = #5 + system-system-spacing #'padding = #2 + system-system-spacing #'stretchability = #15 + + last-bottom-spacing #'basic-distance = #3 +% last-bottom-spacing #'basic-distance = #7 + last-bottom-spacing #'padding = #4 + last-bottom-spacing #'stretchability = #14 + +% score-markup-spacing #'basic-distance = #5 +% score-markup-spacing #'stretchability = #15 + +% markup-markup-spacing #'basic-distance = #5 +% markup-markup-spacing #'stretchability = #30 +} + +\layout { + \context { \PianoStaff + \override StaffGrouper #'staff-staff-spacing #'stretchability = #1.5 + } + \context { \StaffGroup + \override StaffGrouper #'staff-staff-spacing #'stretchability = #2.5 + \override SystemStartBracket #'collapse-height = #1 + } + \context { \GrandStaff + \override StaffGrouper #'staff-staff-spacing #'stretchability = #3 + \override StaffGrouper #'staffgroup-staff-spacing #'stretchability = #3 + } + \context { \ChoirStaff + \override StaffGrouper #'staff-staff-spacing #'stretchability = #1 + } + \context { \Staff + \override StaffGrouper #'staff-staff-spacing #'stretchability = #4.9 + } + \context { \Score + \override StaffGrouper #'staff-staff-spacing #'stretchability = #5 + } +} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% WORKAROUNDS! +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% _ does not work as a direction modifier in figured bass +tsdown = #(make-music 'TextScriptEvent 'text "t.s." 'direction DOWN ) diff --git a/sheet-music_tinwhistle.lytex b/sheet-music_tinwhistle.lytex new file mode 100644 index 0000000..9c16680 --- /dev/null +++ b/sheet-music_tinwhistle.lytex @@ -0,0 +1,125 @@ +\documentclass[12pt, a4paper, openany]{scrbook} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{graphicx} +\usepackage{fancyhdr} +\usepackage{geometry} +\geometry{a4paper,left=20mm,right=20mm, top=3cm, bottom=3cm} + +\input{headfoot.tex} + +\begin{document} + \widowpenalties 1 10000 + \raggedbottom + \pagenumbering{roman} + + \input{title.tex} + + \tableofcontents + + \clearpage + \pagenumbering{arabic} + + \chapter{All for me Grog} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/AllForMeGrog.ly} + ~\\ + \input{lyrics/AllForMeGrog.tex} + + \chapter{Auld lang syne} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/AuldLangSyne.ly} + ~\\ + \input{lyrics/AuldLangSyne.tex} + + \chapter{Black Velvet band} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/BlackVelvetBand.ly} + ~\\ + \input{lyrics/BlackVelvetBand.tex} + + \chapter {Drunken Sailor} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/DrunkenSailor.ly} + ~\\ + \input{lyrics/DrunkenSailor.tex} + + \chapter{The Foggy Dew} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/FoggyDew.ly} + ~\\ + \input{lyrics/FoggyDew.tex} + + \chapter{I'm a Rover seldom Sober} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/ImARoverSeldomSober.ly} + ~\\ + \input{lyrics/ImARoverSeldomSober.tex} + + \chapter{Johnny I hardly knew ye} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/JohnnyIHardlyKnewYe.ly} + ~\\ + \input{lyrics/JohnnyIHardlyKnewYe.tex} + + \chapter{MacPherson's Farewell} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/MacPhersonsFarewell.ly} + ~\\ + \input{lyrics/MacPhersonsFarewell.tex} + + \chapter{Molly Malone} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/MollyMalone.ly} + ~\\ + \input{lyrics/MollyMalone.tex} + + \chapter{Muirsheen Durkin} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/MuirsheenDurkin.ly} + ~\\ + \input{lyrics/MuirsheenDurkin.tex} + + \chapter {A Nation once again} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/NationOnceAgain.ly} + ~\\ + \input{lyrics/NationOnceAgain.tex} + + \chapter{The parting Glass} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/PartingGlass.ly} + ~\\ + \input{lyrics/PartingGlass.tex} + + \chapter {The Rising of the Moon} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/RisingOfTheMoon.ly} + ~\\ + \input{lyrics/RisingOfTheMoon.tex} + + \chapter{The Star of the County Down} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/StarOfTheCountyDown.ly} + ~\\ + \input{lyrics/StarOfTheCountyDown.tex} + + \chapter{Tim Finnegan's Wake} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/TimFinnegansWake.ly} + ~\\ + \input{lyrics/TimFinnegansWake.tex} + + \chapter{Whiskey in the Jar} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/WhiskeyInTheJar.ly} + ~\\ + \input{lyrics/WhiskeyInTheJar.tex} + + \chapter{The Wild Rover} + \thispagestyle{fancy} + \lilypondfile[staffsize=14]{notes/WildRover.ly} + ~\\ + \input{lyrics/WildRover.tex} + +\end{document} diff --git a/title.tex b/title.tex new file mode 100644 index 0000000..7b421c4 --- /dev/null +++ b/title.tex @@ -0,0 +1,31 @@ +\begin{titlepage} + + \begin{center} + + \rule{\linewidth}{0.5mm} \\[0.4cm] + { \huge \bfseries Songs for you} + + \rule{\linewidth}{0.5mm} \\[1.5cm] + + \begin{minipage}{0.4\textwidth} + \begin{flushleft} \large + \emph{Compiled by}\\ + \textsc{Sebastian Hugentobler} + \end{flushleft} + \end{minipage} + \begin{minipage}{0.4\textwidth} + \begin{flushright} \large + \emph{Last edited:} \\ + \textsc{\today} + \end{flushright} + \end{minipage} + \vfill + + \textbf{Creative Commons BY-SA 3.0 Switzerland License} + http://creativecommons.org/licenses/by-sa/3.0/ch/ \\ + ~\\ + \includegraphics[width=0.20\textwidth]{images/by-sa.png}\\[1cm] + + \end{center} + +\end{titlepage}