From: Joe Neeman Date: Wed, 24 Jan 2007 07:05:14 +0000 (+0200) Subject: Merge branch 'master' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond X-Git-Tag: release/2.11.14-1~43^2 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=f9214bac21e9926dc3248416f58190c98c4167a9;hp=804385793dcad0400e6b7ccfe006fece27e5feac;p=lilypond.git Merge branch 'master' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond --- diff --git a/.gitignore b/.gitignore index 7fe9d82c2a..f69a725cab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,39 @@ +*- *-midi.ly *-systems.tex *-systems.texi +*.600pk *.afm *.aux *.eps +*.gcda +*.gcno +*.gcov *.log *.midi *.orig +*.patch +*.pats *.pdf *.ps *.pyc *.rej +*.signature *.svg *.tfm *~ +*~* +.\#* .dotest .gdbinit .htaccess +/*.html +/*.ly +/*.png /.sconf_temp /.sconsign.dblite /GNUmakefile +/local.make /scons.cache /x ?.* @@ -27,6 +41,7 @@ AUTHORS.txt INSTALL.txt TAGS \#* +\#.* a.out aclocal.m4 autom4te.cache @@ -39,8 +54,8 @@ configure gcstat*.scm lily-[0-9a-f][0-9a-f][0-9a-f]* out-scons +out-cov tags test-output-distance -*.gcov -*.gcda -*.gcno +config-*.hh +config-*.make diff --git a/Documentation/GNUmakefile b/Documentation/GNUmakefile index 37a452a11f..cd96e38b5b 100644 --- a/Documentation/GNUmakefile +++ b/Documentation/GNUmakefile @@ -44,4 +44,7 @@ new-lang: msgmerge -U po/lilypond-doc.pot $(outdir)/doc.pot cp po/lilypond-doc.pot po/$(ISOLANG).po @echo "*** Please add a language definition for $(ISOLANG) in buildscripts/langdefs.py ***" + +check-translation: + find $(ISOLANG)/user/ -name '*.*tely' | xargs $(PYTHON) $(buildscript-dir)/check_translation.py $(buildscript-dir) endif diff --git a/Documentation/fr/user/advanced-notation.itely b/Documentation/fr/user/advanced-notation.itely index e1f82f0748..8481a50e3f 100644 --- a/Documentation/fr/user/advanced-notation.itely +++ b/Documentation/fr/user/advanced-notation.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Advanced notation @chapter Advanced notation @@ -226,6 +235,7 @@ UNTRANSLATED NODE: IGNORE ME * Analysis brackets:: * Coloring objects:: * Parentheses:: +* Grid lines:: @end menu @node Balloon help @subsection Balloon help @@ -267,3 +277,8 @@ UNTRANSLATED NODE: IGNORE ME UNTRANSLATED NODE: IGNORE ME +@node Grid lines +@subsection Grid lines + +UNTRANSLATED NODE: IGNORE ME + diff --git a/Documentation/fr/user/basic-notation.itely b/Documentation/fr/user/basic-notation.itely index d7c1bccb57..709eef6d52 100644 --- a/Documentation/fr/user/basic-notation.itely +++ b/Documentation/fr/user/basic-notation.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Basic notation @chapter Basic notation diff --git a/Documentation/fr/user/changing-defaults.itely b/Documentation/fr/user/changing-defaults.itely index 69342deaff..15345c1a60 100644 --- a/Documentation/fr/user/changing-defaults.itely +++ b/Documentation/fr/user/changing-defaults.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Changing defaults @chapter Changing defaults @@ -40,7 +49,9 @@ UNTRANSLATED NODE: IGNORE ME * Layout tunings within contexts:: * Changing context default settings:: * Defining new contexts:: +* Aligning contexts:: @end menu + @node Contexts explained @subsection Contexts explained @@ -76,6 +87,11 @@ UNTRANSLATED NODE: IGNORE ME UNTRANSLATED NODE: IGNORE ME +@node Aligning contexts +@subsection Aligning contexts + +UNTRANSLATED NODE: IGNORE ME + @node The \override command @section The \override command diff --git a/Documentation/fr/user/cheatsheet.itely b/Documentation/fr/user/cheatsheet.itely index 24a63dc774..0e1c151288 100644 --- a/Documentation/fr/user/cheatsheet.itely +++ b/Documentation/fr/user/cheatsheet.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Cheat sheet @appendix Cheat sheet diff --git a/Documentation/fr/user/converters.itely b/Documentation/fr/user/converters.itely index 07b91238fd..93a51dbe27 100644 --- a/Documentation/fr/user/converters.itely +++ b/Documentation/fr/user/converters.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: 0d9d3feea8ca1b22388bd1c67545a518987e72f1 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Converting from other formats @chapter Converting from other formats diff --git a/Documentation/fr/user/instrument-notation.itely b/Documentation/fr/user/instrument-notation.itely index bf8742de5d..46ce66be57 100644 --- a/Documentation/fr/user/instrument-notation.itely +++ b/Documentation/fr/user/instrument-notation.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Instrument-specific notation @chapter Instrument-specific notation diff --git a/Documentation/fr/user/introduction.itely b/Documentation/fr/user/introduction.itely index bfb50ccdef..97a1a7aaf6 100644 --- a/Documentation/fr/user/introduction.itely +++ b/Documentation/fr/user/introduction.itely @@ -1,43 +1,987 @@ +@c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: 94e27fe2da58c91791e1cacb32c16a4acccf0638 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Introduction @chapter Introduction -UNTRANSLATED NODE: IGNORE ME -@menu -* Engraving:: +@menu +* Engraving:: * Automated engraving:: -* What symbols to engrave?:: -* Music representation:: +* What symbols to engrave?:: +* Music representation:: * Example applications:: * About this manual:: -@end menu +@end menu + + @node Engraving @section Engraving -UNTRANSLATED NODE: IGNORE ME +L'art de la typographie musicale se nomme la @emph{gravure}. Ce terme +est issu du processus traditionnel d'impression musicale. Il y a +seulement quelques dizaines d'années, on faisait les partitions en +coupant et en embossant une plaque de zinc ou d'étain en image miroir. +Cette plaque était ensuite encrée, les dépressions créées par les +creux et les bosses retenant l'encre. Une image était formée en +pressant du papier sur la plaque. La découpe et l'embossage étaient +entièrement faits à la main. Il était pénible d'appliquer une +correction, quand celle-ci n'était pas impossible, la gravure devait +donc être parfaite du premier coup. La gravure demandait une +qualification hautement spécialisée : un artisan devait accomplir +environ cinq ans de formation avant de mériter le titre de maître +graveur, et il lui fallait cinq années d'expérience supplémentaires +pour devenir vraiment habile. + +De nos jours, toutes les partitions récentes sont produites avec des +ordinateurs. Ceci a des avantages évidents : le coût des impressions +a diminué, et le travail d'éditeur peut être envoyé par courriel. +Malheureusement, l'utilisation dominante des ordinateurs a également +diminué la qualité graphique des partitions. L'impression +informatisée leur donne un aspect fade et mécanique qui les rend +désagréables à jouer. + +@c introduce illustrating aspects of engraving, font... +Les images ci-dessous illustrent la différence entre la gravure +traditionelle et l'impression typique par ordinateur, et la troisème +image montre comment LilyPond mime l'aspect traditionnel. L'image de +gauche est une numérisation d'un symbole bémol d'une édition publiée +en 2000. Celle du centre montre un bémol d'une gravure à la main de +l'édition Bärenreiter de la même musique. L'image de gauche illustre +des défauts typiques de l'impression informatique : les lignes de +portée sont minces, l'épaisseur de trait du bémol est la même que les +lignes fines, et il y a un aspect rigide avec des angles pointus. Par +contraste, le bémol Bärenreiter possède un aspect gras et arrondi, +presque voluptueux. Notre symbole bémol est créé, entre autres, à +partir de celui-là. Il est arrondi, et son épaisseur de trait +s'harmonise avec nos lignes de portée, lesquelles sont également plus +épaisses que celles de l'édition informatique. + +@multitable @columnfractions .125 .25 .25 .25 .125 +@item @tab +@ifnotinfo +@iftex +@image{henle-flat-gray,,4cm} +@end iftex +@ifnottex +@image{henle-flat-gray,,,png} +@end ifnottex + +@tab +@iftex +@image{baer-flat-gray,,4cm} +@end iftex +@ifnottex +@image{baer-flat-gray,,,png} +@end ifnottex + +@tab +@iftex +@image{lily-flat-bw,,4cm} +@end iftex +@ifnottex +@image{lily-flat-bw,,,png} +@end ifnottex +@end ifnotinfo +@ifinfo +@c workaround for makeinfo-4.6: line breaks and multi-column cookies +@image{henle-flat-bw,,,png} @image{baer-flat-bw,,,png} +@image{lily-flat-bw,,,png} +@end ifinfo + +@item @tab +Henle (2000) +@tab +Bärenreiter (1950) +@tab +Fonte Feta de LilyPond (2003) + +@end multitable + + +@cindex musical symbols +@cindex font +@cindex blackness +@cindex balance + +@c introduce illustrating aspects of engraving, spacing... +En matière d'espacement, la répartition de l'espace devrait refléter +les durées entre les notes. Cependant, beaucoup de partitions +modernes se contentent des durées avec une précision mathématique, ce +qui mène à de mauvais résultats. Dans l'exemple suivant, un motif est +imprimé deux fois : une fois en utilisant un espacement mathématique +exact, et une autre fois avec des corrections. Pouvez-vous les +repérer ? + +@cindex optical spacing +@c file spacing-optical. +@c need to include it here, because we want two images. +@lilypond +\paper { + ragged-right = ##t + indent = #0.0 +} + +music = { + c'4 e''4 e'4 b'4 | + \stemDown + b'8[ e'' a' e''] + \stemNeutral + e'8[ e'8 e'8 e'8] +} + +\score +{ + \music + \layout { + \context { + \Staff + \override NoteSpacing #'stem-spacing-correction = #0.6 + } + } +} +@end lilypond + +@lilypond +\paper { + ragged-right = ##t + indent = #0.0 +} + +music = { + c'4 e''4 e'4 b'4 | + \stemDown + b'8[ e'' a' e''] + \stemNeutral + e'8[ e'8 e'8 e'8] +} +\score +{ + \music + \layout { + \context { + \Staff + \override NoteSpacing #'stem-spacing-correction = #0.0 + \override NoteSpacing #'same-direction-correction = #0.0 + \override StaffSpacing #'stem-spacing-correction = #0.0 + } + } +} +@end lilypond + +@cindex regular rhythms +@cindex regular spacing + +L'extrait n'utilise que des notes de même durée ; l'espacement devrait +le refléter. Malheureusement, notre oeil nous trompe quelque peu ; il +ne se contente pas de remarquer la distance entre les têtes de notes, +il prend en compte également la distance entre les hampes +consécutives. Ainsi, par compensation, les notes avec une combinaison +« hampe vers le haut »/@/« hampe vers le bas » doivent être éloignées +l'une de l'autre, et les notes avec une combinaison « hampe vers le +bas »/@/« hampe vers le haut » rapprochées, le tout dépendant de la +position verticale des notes. Les deux premières mesures sont +imprimées avec cette correction, les deux suivantes sans. Les notes +dans les deux dernières mesures forment des blocs de notes « hampe +vers le bas »/@/« hampe vers le haut ». + +@cindex typography + +Les musiciens sont généralement plus absorbés par l'exécution que par +l'étude de l'aspect graphique d'une partition, donc discutailler sur +les détails typographiques peut paraître peu important. Il n'en est +rien. Dans de longues pièces avec des rythmes monotones, les +corrections d'espacement engendrent de subtiles variations dans la +mise en forme de chaque ligne, donnant à chacune une signature +visuelle distincte. Sans cette signature, toutes les lignes auraient +le même aspect, et ressembleraient à un labyrinthe. Si un musicien +regarde ailleurs un instant ou se déconcentre momentanement, il peut +avoir du mal à se retrouver sur la page. + +De même, l'aspect robuste des symboles sur d'épaisses lignes de +portées ressort mieux quand la partition est éloignée du lecteur, +comme sur un pupitre par exemple. Une organisation minutieuse des +espaces vides permet de minimiser l'espace qu'occupe la musique, tout +en évitant que les symboles s'amassent les uns contre les autres. le +résultat permet de réduire le nombre de pages à tourner, ce qui est un +grand avantage. + +Ceci est une caractéristique commune à toute typographie. La +disposition doit être belle, non seulement pour des raisons +esthétiques, mais également pour l'aide apportée au lecteur dans la +tâche qu'il doit accomplir. Pour du matériel d'exécution comme les +partitions de musique, cela prend une double importance : les +musiciens ont une quantité limitée d'attention. Moins ils en ont +besoin pour lire, plus ils peuvent se concentrer sur la musique +elle-même. Autrement dit, une meilleure typographie permet une +meilleure interprétation. + +Ces exemples démontrent que la typographie musicale est un art subtil +et complexe, et que la produire demande une expertise considérable, +que les musiciens n'ont généralement pas. LilyPond représente notre +effort pour apporter l'excellence graphique de la gravure à la main à +l'ère de l'ordinateur, et la rendre accessible à tous les musiciens. +Nous avons conçu nos algorithmes, fontes et paramètres de programme +pour retrouver la qualité d'édition des anciennes partitions que nous +aimons tant lire et jouer. + + @node Automated engraving @section Automated engraving -UNTRANSLATED NODE: IGNORE ME +Comment pouvons-nous implémenter la typographie ? Si les artisans ont +besoin de plus de dix ans pour devenir de vrais maîtres, comment nous, +simples programmeurs, pourrions-nous jamais écrire un programme pour +faire leur travail? + +La réponse est : nous ne le pouvons pas. La typographie se base sur +le jugement visuel humain, donc les humains ne peuvent pas être +complètement remplacés. Si LilyPond arrive à résoudre la plupart des +situations correctement, ce sera déjà une grande avancée sur les +logiciels existants. Les autres situations peuvent être résolues à la +main. Au fil des ans, le logiciel peut être affiné pour faire de plus +en plus de choses automatiquement, pour que les ajustements manuels +soient de moins en moins nécessaires. + +Quand nous avons commencé, nous avons écrit le programme Lilypond +entièrement dans le language de programmation C++ ; les fonctions du +programme étaient figées par les développeurs. Ceci s'est avéré +insatisfaisant pour plusieurs raisons : + +@itemize @bullet +@item Quand Lilypond fait des erreurs, +les utilisateurs ont besoin de contredire les décisions de formatage. +Les utilisateurs doivent donc avoir accès au moteur de formatage. Par +conséquent, les règles et les propriétés ne peuvent pas être fixées +par nous au moment de la compilation, mais doivent être accessibles +aux utilisateurs au moment de l'exécution. + +@item La gravure est une question de jugement visuel, et donc de goût. +Aussi bien informés que nous le sommes, les utilisateurs peuvent être +en désaccord avec nos décisions personnelles. Par conséquent, les +définitions du modèle typographique doivent également être accessibles +à l'utilisateur. + +@item Enfin, nous affinons continuellement les algorithmes de formatage, +donc nous avons besoin d'une approche souple des règles. Le language +C++ oblige à une certaine méthode de groupage des règles qui ne +convient pas bien au fonctionnement de la notation musicale. +@end itemize + +Ces problèmes ont été résolus en intégrant un interpréteur pour le +language de programmation Scheme, et en réécrivant des parties de +LilyPond en Scheme. L'architecture actuelle de formatage est +construite autour de la notion d'objets graphiques, décrits par des +fonctions et des variables Scheme. Cette architecture comprend les +règles de formatage, le style typographique, et des décisions +individuelles de formatage. L'utilisateur a un accès direct à la +plupart de ces contrôles. + +Les variables Scheme contrôlent les décisions de mise en page. Par +exemple, beaucoup d'objets graphiques ont une variable de direction +qui encode le choix entre haut et bas (ou gauche et droite). Vous +pouvez voir ici deux accords, avec des accents, et des arpèges. Dans +le premier accord, les objets graphiques sont tous dirigés vers le bas +(ou la gauche). Dans le second accord ils sont tous dirigés vers le +haut (droite). + +@lilypond[quote,ragged-right] +\new Score \with { + \override SpacingSpanner #'spacing-increment = #3 + \override TimeSignature #'transparent = ##t +} \relative { + \stemDown 4_>-\arpeggio + \override Arpeggio #'direction = #RIGHT + \stemUp 4^>-\arpeggio +} +@end lilypond + +@noindent +Le processus de formatage d'une partition consiste à lire et écrire +les variables d'objets graphiques. Certaines variables ont une valeur +prédéfinie. Par exemple, l'épaisseur d'un grand nombre de lignes -- +une caractéristique du style typographique -- est une variable avec +une valeur prédéfinie. Vous êtes libres d'altérer cette valeur, ce +qui vous donne une partition avec une impression typographique +différente. + +@lilypond[quote,ragged-right] +fragment = { + \clef bass f8 as8 + c'4-~ c'16 as g f e16 g bes c' des'4 +} +<< + \new Staff \fragment + \new Staff \with { + \override Beam #'thickness = #0.3 + \override Stem #'thickness = #0.5 + \override Bar #'thickness = #3.6 + \override Tie #'thickness = #2.2 + \override StaffSymbol #'thickness = #3.0 + \override Tie #'extra-offset = #'(0 . 0.3) + } + \fragment +>> +@end lilypond + +Les règles de formatage ont aussi des variables prédéfinies : chaque +objet possède des variables contenant des procédures. Ces procédures +exécutent le formatage, et en les substituant par d'autres, nous +pouvons changer l'apparence des objets. Dans l'exemple suivant, la +règle du choix de têtes de notes est changée au cours de l'extrait de +musique. + +@lilypond[quote,ragged-right] +#(set-global-staff-size 30) + +#(define (mc-squared grob orig current) + (let* ((interfaces (ly:grob-interfaces grob)) + (pos (ly:grob-property grob 'staff-position))) + (if (memq 'note-head-interface interfaces) + (begin + (ly:grob-set-property! grob 'stencil ly:text-interface::print) + (ly:grob-set-property! grob 'font-family 'roman) + (ly:grob-set-property! grob 'text + (make-raise-markup -0.5 + (case pos + ((-5) (make-simple-markup "m")) + ((-3) (make-simple-markup "c ")) + ((-2) (make-smaller-markup (make-bold-markup "2"))) + (else (make-simple-markup "bla"))))))))) + +\new Voice \relative c' { + \stemUp + \set autoBeaming = ##f + \time 2/4 + 4 + \once \override NoteHead #'stencil = #ly:note-head::brew-ez-stencil + \once \override NoteHead #'font-size = #-7 + \once \override NoteHead #'font-family = #'sans + \once \override NoteHead #'font-series = #'bold + + \once \override NoteHead #'style = #'cross + + \applyOutput #'Voice #mc-squared + + << + { d8[ es-( fis^^ g] fis2-) } + \repeat unfold 5 { \applyOutput #'Voice #mc-squared s8 } + >> +} +@end lilypond + + @node What symbols to engrave? @section What symbols to engrave? -UNTRANSLATED NODE: IGNORE ME +@cindex engraving +@cindex typography + +Le processus de formatage décide où placer les symboles. Cependant, +cela ne peut être fait qu'à partir du moment où il a été décidé +@emph{quels} symbols doivent être imprimés, c'est-à-dire quelle +notation utiliser. + +La notation musicale usuelle est un système d'écriture qui a évolué à +travers les dix derniers siècles. La forme qui est aujourd'hui +communément utilisée date du début de la Renaissance. Bien que la +forme basique --- les têtes de notes sur une portée de cinq lignes --- +n'a pas changé, les détails continuent d'évoluer pour exprimer les +innovations de la notation contemporaine. Par conséquent, elle +comprend quelque 500 ans de musique, avec des applications allant des +mélodies monodiques à de monstrueux contrepoints pour grand orchestre. + +Comment pouvons nous appréhender un tel monstre à plusieurs têtes, et +le confiner dans l'espace réduit d'un programme informatique ? Notre +solution consiste à diviser le problème de la notation --- par +opposition à la gravure, ou typographie --- en morceaux digestes et +programmables : chaque type de symbole est géré par un module séparé, +couramment appelé greffon@footnote{traduction de l'anglais +@emph{plug-in}.}. Chaque greffon est entièrement modulaire et +indépendant, et donc peut être développé et amélioré séparément. De +tels greffons sont nommées @code{graveur}s@footnote{@code{engraver}s +en anglais.}, par analogie avec les artisans qui traduisent les idées +musicales en symboles graphiques. + +Dans l'exemple suivant, voyons comment nous commençons avec un greffon +pour les têtes de notes, le graveur de têtes de note +(@code{Note_heads_engraver}) : + +@lilypond[quote,ragged-right] +\include "engraver-example.ily" + +\score { + \topVoice + \layout { + \context { + \Voice + \remove "Stem_engraver" + \remove "Phrasing_slur_engraver" + \remove "Slur_engraver" + \remove "Script_engraver" + \remove "Beam_engraver" + \remove "Auto_beam_engraver" + } + \context { + \Staff + \remove "Accidental_engraver" + \remove "Key_engraver" + \remove "Clef_engraver" + \remove "Bar_engraver" + \remove "Time_signature_engraver" + \remove "Staff_symbol_engraver" + \consists "Pitch_squash_engraver" + } +} +} +@end lilypond + +@noindent +Ensuite, le graveur du symbole de portée +(@code{Staff_symbol_engraver}) ajoute la portée + +@lilypond[quote,ragged-right] +\include "engraver-example.ily" + +\score { + \topVoice + \layout { + \context { + \Voice + \remove "Stem_engraver" + \remove "Phrasing_slur_engraver" + \remove "Slur_engraver" + \remove "Script_engraver" + \remove "Beam_engraver" + \remove "Auto_beam_engraver" + } + \context { + \Staff + \remove "Accidental_engraver" + \remove "Key_engraver" + \remove "Clef_engraver" + \remove "Bar_engraver" + \consists "Pitch_squash_engraver" + \remove "Time_signature_engraver" + } + } +} +@end lilypond + +@noindent +le graveur de clef (@code{Clef_engraver}) définit un point de +référence pour la portée + +@lilypond[quote,ragged-right] +\include "engraver-example.ily" + +\score { + \topVoice + \layout { + \context { + \Voice + \remove "Stem_engraver" + \remove "Phrasing_slur_engraver" + \remove "Slur_engraver" + \remove "Script_engraver" + \remove "Beam_engraver" + \remove "Auto_beam_engraver" + } + \context { + \Staff + \remove "Accidental_engraver" + \remove "Key_engraver" + \remove "Bar_engraver" + \remove "Time_signature_engraver" + } + } +} +@end lilypond + +@noindent +et le graveur de hampes (@code{Stem_engraver}) ajoute les hampes : + +@lilypond[quote,ragged-right] +\include "engraver-example.ily" + +\score { + \topVoice + \layout { + \context { + \Voice + \remove "Phrasing_slur_engraver" + \remove "Slur_engraver" + \remove "Script_engraver" + \remove "Beam_engraver" + \remove "Auto_beam_engraver" + } + \context { + \Staff + \remove "Accidental_engraver" + \remove "Key_engraver" + \remove "Bar_engraver" + \remove "Time_signature_engraver" + } + } +} +@end lilypond + +Le graveur de hampe est notifié de chaque tête de note qui survient. +Chaque fois qu'une tête de note --- plusieurs pour un accord --- est +rencontrée, un objet hampe est créé et connecté à la tête de note. En +ajoutant des graveurs pour les barres de ligature, les liaisons, les +accents, les altérations accidentelles, les barres de mesure, la +métrique, et les armures, nous obtenons un jeu de notation complet. + +@lilypond[quote,ragged-right] +\include "engraver-example.ily" +\score { \topVoice } +@end lilypond + +Ce système fonctionne bien pour de la musique monodique, mais qu'en +est-il de la polyphonie ? En notation polyphonique, plusieurs voix +peuvent partager une portée. + +@lilypond[quote,ragged-right] +\include "engraver-example.ily" +\new Staff << \topVoice \\ \botVoice >> +@end lilypond + +Dans cette situation, la portée et les altérations accidentelles sont +partagées, mais les hampes, liaisons etc., sont spécifiques à chaque +voix. Par conséquent, les graveurs doivent être groupés. Les +graveurs des têtes de notes, hampes, liaisons etc., vont dans un +groupe appelé « contexte de Voix »@footnote{``Voice context'' en +anglais, ``Voice'' commence par une majuscule comme tous les noms de +contexte dans le programme LilyPond.}, alors que les graveurs des clés, +altérations accidentelles, barres de mesure etc., vont dans un groupe +appelé « contexte de Portée ». Dans le cas de la polyphonie, un seul +contexte de Portée contient plusieurs contextes de Voix. De même, +plusieurs contextes de Portée peuvent être inclus dans un seul +contexte de Partition. Le contexte de Partition est le contexte de +notation de plus haut niveau. + +@seealso + +Program reference: @internalsref{Contexts}. + +@lilypond[quote,ragged-right] +\include "engraver-example.ily" +\score { + << + \new Staff << \topVoice \\ \botVoice >> + \new Staff << \pah \\ \hoom >> + >> +} +@end lilypond @node Music representation @section Music representation -UNTRANSLATED NODE: IGNORE ME +Idéalement, le format d'entrée pour n'importe quel système de +formatage est une description abstraite du contenu. Dans ce cas-ci, +ce serait la musique elle-même. Cela pose un formidable problème : +comment pouvons-nous définir ce que la musique est réellement ? Plutôt +que d'essayer de trouver une réponse, nous avons renversé la question. +Nous écrivons un logiciel capable de produire de la musique écrite, et +adaptons le format pour atteindre la plus grande concision possible. +Quand le format ne peut plus être simplifé, il nous reste par +définition le contenu lui-même. Notre logiciel sert de définition +formelle d'un document de musique. + +La syntaxe est également l'interface utilisateur pour LilyPond, par +conséquent il est facile de saisir + +@example +c'4 d'8 +@end example + +@noindent +c'est-à-dire un do central noire et, juste au-dessus un ré croche + +@lilypond[quote,fragment] +c'4 d'8 +@end lilypond + +Sur une échelle microscopique, une telle syntaxe est facile à +utiliser. A plus grande échelle, la syntaxe a besoin aussi de +structure. Comment serait-il possible autrement de rentrer des +pièces complexes comme des symphonies ou des opéras? La structure +est formée par le concept d'expression musicale : en combinant +de petits fragments de musique pour en former de plus grands, on peut +exprimer de la musique plus complexe. Par exemple + +@lilypond[quote,verbatim,fragment,relative=1] +c4 +@end lilypond + +@noindent +Des accord peuvent être construits avec @code{<<} et @code{>>} autour +des notes. + +@c < > is not a music expression, +@c so we use <<>> iso. <> to drive home the point of +@c expressions. Don't change this back --hwn. +@example +<> +@end example + +@lilypond[quote,fragment,relative=1] +\new Voice { <> } +@end lilypond + +@noindent +Cette expression est mise dans une séquence en l'encadrant avec des +accolades @code{@{@tie{}@dots{}@tie{}@}} + +@example +@{ f4 <> @} +@end example + +@lilypond[quote,relative=1,fragment] +{ f4 <> } +@end lilypond + +@noindent +Ceci est également une expression, et peut donc encore une fois +être combinée avec d'autres expressions simultanées (une blanche) +en utilisant <<, @code{\\}, et >> + +@example +<< g2 \\ @{ f4 <> @} >> +@end example + +@lilypond[quote,fragment,relative=2] +\new Voice { << g2 \\ { f4 <> } >> } +@end lilypond + +De telles strucutres récursives peuvent être spécifiées formellement +et de manière ordonnée dans une grammaire indépendante de tout +contexte. Le code d'analyse est aussi générée à partir de cette +grammaire. Autrement dit, la syntaxe de LilyPond est définie +clairement et sans ambiguités. + +L'interface utilisateur et la syntaxe sont ce que les gens voient et +manipulent le plus. Elles sont e npartie une affaire de goût, et +aussi sujettes à beaucoup de discussions. Même si ces discussions sur +les goûts ont leur mérite, elles ne sont pas très productives. D'un +point de vue plus large sur LilyPond, l'importance de la syntaxe est +minime : il est facile d'inventer une syntaxe concise, alors qu'écrire +un code de formatage décent est beaucoup plus difficile. Ceci est +également illustré par le nombre de lignes de codes pour les +composants respectifs : l'analyse et la représentation représentent +moins de 10% du code source. @node Example applications @section Example applications -UNTRANSLATED NODE: IGNORE ME +Nous avons conçu Lilypond comme une expérimentation visant à +concentrer l'art de la gravure musicale dans un logiciel. Grâce à +tout ce dur labeur, le programme peut maintenant être utilisé pour +accomplir des travaux utiles. L'application la plus simple est +d'imprimer des notes : + +@lilypond[quote,relative=1,fragment] +\time 2/4 c4 c g'4 g a4 a g2 +@end lilypond + +@noindent +En ajoutant des noms d'accords et des paroles, nous obtenons +une partition de chanson : + +@lilypond[quote,ragged-right] +<< + \chords { c2 c f2 c } + \new Staff \relative c' { \time 2/4 c4 c g'4 g a4 a g2 } + \new Lyrics \lyricmode { twin4 kle twin kle lit tle star2 } +>> +@end lilypond + +La notation polyphonique et la musique pour piano peuvent également +être générées. L'exemple suivant associe quelques constructions +plus exotiques : + +@lilypondfile[quote,ragged-right]{screech-boink.ly} + +Les extraits exposés ici ont tous été écrits à la main, mais ce n'est +pas une obligation. Puisque le moteur de formatage est en grande +partie automatique, il peut servir de sortie pour d'autres programmes +qui manipulent la musique. Par exemple, il peut être utilisé pour +convertir des bases de données d'extraits musicaux en images pour des +sites Internet et des présentations multimédias. + +Ce manuel montre également une application : le format d'entrée est du +texte, et peut donc facilement être intégrés dans d'autres formats +basés sur le texte comme @LaTex{}, HTML, ou dans le cas de ce manuel, +Texinfo. À l'aide d'un programme spécial, les extraits de code +peuvent être remplacés par des images de musiques dans les fichiers de +sortie PDF ou HTML. Cela donne la possibilité de mélanger de la +musique et du texte dans les documents. + + @node About this manual @section About this manual -UNTRANSLATED NODE: IGNORE ME +Le manuel est divisé en chapitres comme suit : +@itemize @bullet + +@item +@ifhtml +Le +@end ifhtml +@emph{@ref{Tutorial}} +propose une introduction en douceur à la typographie musicale. +Les utilisateurs débutants sont invités à commencer ici. + +@item +@emph{@ref{Putting it all together}} +explique des concepts généraux du format de ficheir ly. Si vous n'êtes +pas certain de l'endroit où placer une commande, lisez ce chapitre ! + +@item +@emph{@ref{Working on LilyPond projects}} +montre des utilisations pratiques de LilyPond et donne des conseils +afin d'éviter les problèmes les plus courants. + +@item +@emph{@ref{Tweaking output}} +est une introduction aux retouches de gravure avec LilyPond. + +@item +@emph{@ref{Basic notation}} +traite de sujets groupés par type de notation. Cette section +détaille la notation de base, qui sera utile dans la plupart des +projets de partition. + +@item +@emph{@ref{Instrument-specific notation}} +traite de sujets groupés par type de notation. Cette section détaille +des notations spéciales qui ne seront utiles que pour des types +particuliers d'instruments ou la voix. + +@item +@emph{@ref{Advanced notation}} +traite de sujets groupés par type de notation. Cette section +donne des précisions à propos de notations compliquées et +inhabituelles + +@item +@emph{@ref{Changing defaults}} +explique comment ajuster finement la mise en page. + +@item +@emph{@ref{Non-musical notation}} +traite de sorties non musicales comme les titres, les mouvements +multiples, et la sélection des instruments MIDI. + +@item +@emph{@ref{Spacing issues}} +traite de sujets affectant la sortie globale, comme sélectionner +la taille de papier ou spécifier les sauts de page. + +@item +@emph{@ref{Interfaces for programmers}} +explique comment créer des fonctions de musique. + +@item +@emph{@ref{Running LilyPond}} +montre comment lancer LilyPond et ses programmes auxiliaires. De +plus, cette section explique comment mettre à jour des fichiers +source écrits pour d'anciennes versions de LilyPond. + +@item +@emph{@ref{LilyPond-book}} +explique comment créer des documents intégrant des exemples musicaux, +comme ce manuel. + +@item +@emph{@ref{Converting from other formats}} +explique comment exécuter les programmes de conversion. Ces programmes +sont livrés avec le paquetage Lilypond, et convertissent une variété +de formats musicaux vers le format @code{.ly}. + +@item +@ifhtml +La +@end ifhtml +@emph{@ref{Literature list}} +contient un choix de livres de référence utiles pour ceux qui veulent +en savoir plus sur la notation et la gravure. + +@item +Le +@emph{@ref{Scheme tutorial}} +propose une courte introduction à Scheme, le langage de programmation +utilisé par les fonctions de musique. + +@item +@ifhtml +Les +@end ifhtml +@emph{@ref{Notation manual tables}} +sont un ensemble de tableaux montrant les noms d'accord, les +instruments MIDI, les noms de couleur, et la police Feta. + +@item +Les +@emph{@ref{Example templates}} +procurent des modèles de pièces LilyPond. Copiez et collez un modèle +dans un fichier, ajouter les notes, et c'est prêt! + +@item +La +@emph{@ref{Cheat sheet}} +est une référence pratique des commandes LlyPond les plus courantes. + +@item +L' +@emph{@ref{LilyPond command index}} +est un index de toutes les @code{\commandes} LilyPond. + +@item +L' +@emph{@ref{LilyPond index}} +est un index complet. + +@end itemize + +Une fois que vous êtes un utilisateur expérimenté, vous pouvez +utiliser le manuel comme référence : il y a un index +exhaustif@footnote{Si vous cherchez quelque chose, et que vous ne le +trouvez pas dans le manuel, ceci est considéré comme un bogue ; dans +ce cas, envoyez un rapport de bogue s'il-vous-plaît.}, mais ce +document est aussi disponible en +@iftex +une seule grande page HTML, +@end iftex +@ifhtml +@uref{source/Documentation/user/lilypond.html, une seule grande page}, +@end ifhtml +dans laquelle la fonction recherche d'un navigateur Web est très utile +pour trouver quelque chose. +@cindex search in manual +@cindex using the manual + +@c FIXME: +@c add/integrate glossary, put in list above +Si vous n'êtes pas familier avec la notation musicale ou la +terminologie, il est conseillé de consulter le glossaire, notamment +pour les parties non encore traduites de la documentation. +@iftex +Le glossaire de musique explique les termes musicaux, et inclut +les traductions vers divers languages. C'est un document séparé, +disponible dans les formats HTML et PDF. +@end iftex +@ifnottex +Le @ref{Top,Music glossary,,music-glossary} explique les termes +musicaux et inclut les traductions vers divers languages. Il est +également disponible au format PDF. +@end ifnottex +@cindex idiom +@cindex jargon +@cindex terminology +@cindex foreign languages +@cindex language + + +Ce manuel ne serait pas complet sans un certain nombre d'autres +documents. Ils ne sont pas tous disponibles au format papier, mais +devraient être inclus dans le paquetage de documentation pour votre +plateforme. + +@itemize @bullet +@item +@iftex +Référence du programme +@end iftex +@ifnottex +@ref{Top,Program reference,,lilypond-internals}. +@end ifnottex + +La référence du programme est un groupe de pages HTML étroitement +liées entre elles, qui documente tous les petits détails de chaque +classe, objet et fonction de LilyPond. Elle est produite directement +à partir des définitions de formatage utilisées. + +Presque toutes les fonctions de formatage utilisées en interne sont +directement disponibles pour l'utilisateur. Par exemple, toutes les +variables qui contrôlent les épaisseurs, les distances etc., peuvent +être modifiées dans les fichiers d'entrée. Il y a un grand nombre +d'options de formatage, et elles sont toutes décrites dans ce +document. Chaque section du manuel de notation a une section @b{Voir +aussi} qui réfère à la documentation générée automatiquement. Dans la +documentation au format HTML, ces sous-sections ont des liens +cliquables. + +@cindex snippets +@item +@ifnothtml +Exemples de source divers. +@end ifnothtml +@ifhtml +@c Works, but link name is not so nice; so write-out macro +@c @inputfileref{input/test,Various input examples}. +@uref{source/input/test/collated-files.html,Exemples de source divers}. +@end ifhtml + +Cette ensemble de fichiers montre des trucs et astuces variés, sous +la forme d'un large fichier HTML, avec des images et des textes +explicatifs. + +@item +@ifnothtml +Les tests de régression. +@end ifnothtml +@ifhtml +@c Works, but link name is not so nice; so write-out macro +@c @inputfileref{input/regression,The regression tests}. +@uref{source/input/regression/collated-files.html,Les tests de régression}. +@end ifhtml + +Cet ensemble de fichiers teste chaque fonctionnalité de notation et de +gravure de Lilypond en un seul fichier. L'ensemble est surtout +présent pour nous aider à deboguer les problèmes, mais peut également +être instructif pour voir comment nous testons le logiciel. Le format +est identique au document de trucs et astuces. +@end itemize + + +Dans tous les documents HTML qui incluent des fragments musicaux, +le code Lilypond utilisé pour produire l'image peut être vu en +cliquant l'image. + +L'emplacement des fichiers de documentation mentionné ici peut varier +d'un système à l'autre. De temps en temps, ce manuel fait référence +aux fichiers d'exemple et d'initialisation. Tout au long de ce +manuel, nous donnons les emplacements des fichiers d'entrée +relativement au répértoire racine de l'archive source. Par exemple, +@file{input/@/test/@/bla@/.ly} peut référer au fichier +@file{lilypond@/-2.8.0/@/input/@/test/@/bla@/.ly}. Dans les paquets +binaires pour les plateformes Unix, la documentation et les exemples +se trouvent généralement sous @file{/usr/@/share/@/doc/@/lilypond/}. +Les fichiers d'initialisation, par exemple @file{scm/@/lily@/.scm}, ou +@file{ly/@/engraver@/-init@/.ly}, se trouvent généralement dans le +répértoire @file{/usr/@/share/@/lilypond/}. + +@cindex adjusting output +@cindex variables +@cindex properties +@cindex lilypond-internals +@cindex internal documentation +@cindex Scheme +@cindex extending lilypond +@cindex index + +Pour finir, ce manuel et les autres sont disponibles en ligne, à la +fois aux formats PDF et HTML, à partir du site de LilyPond, accessible +à l'adresse @uref{http://@/www@/.lilypond@/.org/}. diff --git a/Documentation/fr/user/lilypond-book.itely b/Documentation/fr/user/lilypond-book.itely index a01caad7e5..5f740da1ab 100644 --- a/Documentation/fr/user/lilypond-book.itely +++ b/Documentation/fr/user/lilypond-book.itely @@ -1,5 +1,14 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node LilyPond-book -@chapter +@chapter @command{lilypond-book}: Integrating text and music UNTRANSLATED NODE: IGNORE ME @@ -13,6 +22,7 @@ UNTRANSLATED NODE: IGNORE ME * Invoking lilypond-book:: * Filename extensions:: * Many quotes of a large score:: +* Inserting LilyPond output into OpenOffice.org:: * Inserting LilyPond output into other programs:: @end menu @node An example of a musicological document @@ -64,6 +74,11 @@ UNTRANSLATED NODE: IGNORE ME UNTRANSLATED NODE: IGNORE ME +@node Inserting LilyPond output into OpenOffice.org +@section Inserting LilyPond output into OpenOffice.org + +UNTRANSLATED NODE: IGNORE ME + @node Inserting LilyPond output into other programs @section Inserting LilyPond output into other programs diff --git a/Documentation/fr/user/lilypond.tely b/Documentation/fr/user/lilypond.tely index 6b65254191..b173f38eed 100644 --- a/Documentation/fr/user/lilypond.tely +++ b/Documentation/fr/user/lilypond.tely @@ -1,4 +1,11 @@ -\input texinfo @c -*- coding: utf-8; mode: texinfo; -*- +\input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @setfilename lilypond.info @settitle GNU LilyPond @iftex @@ -83,7 +90,7 @@ Free Documentation License''. @top GNU LilyPond --- The music typesetter @c HJJ: Info needs `@top', which is a synonym for `@unnumbered' in TeX. -Ce document est le manuel de l'utilisateur pour GNU LilyPond 2.8.X. +Ce document est le manuel de l'utilisateur pour GNU LilyPond 2.10.x. @ifhtml (Allez au bas de la page pour voir le numéro de version exact). @end ifhtml @@ -112,7 +119,7 @@ Manuel d'apprentissage Manuel de référence * Basic notation:: notation musicale standard. -* Instrument-specific notation:: +* Instrument-specific notation:: notation spécifique à un instrument. * Advanced notation:: notation plus rarement utilisée. * Changing defaults:: retoucher la mise en forme. * Non-musical notation:: aspects autres que la notation musicale. @@ -174,11 +181,15 @@ Annexes @node LilyPond command index @appendix LilyPond command index +UNTRANSLATED NODE: IGNORE ME + @printindex ky @node LilyPond index @appendix LilyPond index +UNTRANSLATED NODE: IGNORE ME + @printindex cp @bye diff --git a/Documentation/fr/user/literature.itely b/Documentation/fr/user/literature.itely index 1400e5288a..5a5a043469 100644 --- a/Documentation/fr/user/literature.itely +++ b/Documentation/fr/user/literature.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Literature list @appendix Literature list diff --git a/Documentation/fr/user/non-music.itely b/Documentation/fr/user/non-music.itely index 38977cad04..9e28ccf00f 100644 --- a/Documentation/fr/user/non-music.itely +++ b/Documentation/fr/user/non-music.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Non-musical notation @chapter Non-musical notation diff --git a/Documentation/fr/user/notation-appendices.itely b/Documentation/fr/user/notation-appendices.itely index 21642c5fe8..e47578ee54 100644 --- a/Documentation/fr/user/notation-appendices.itely +++ b/Documentation/fr/user/notation-appendices.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Notation manual tables @appendix Notation manual tables diff --git a/Documentation/fr/user/preface.itely b/Documentation/fr/user/preface.itely index 91a0b4235b..d0bef0dbef 100644 --- a/Documentation/fr/user/preface.itely +++ b/Documentation/fr/user/preface.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Preface @unnumbered Preface diff --git a/Documentation/fr/user/programming-interface.itely b/Documentation/fr/user/programming-interface.itely index 2417124af9..27ae074aa0 100644 --- a/Documentation/fr/user/programming-interface.itely +++ b/Documentation/fr/user/programming-interface.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Interfaces for programmers @chapter Interfaces for programmers @@ -22,6 +31,7 @@ UNTRANSLATED NODE: IGNORE ME * Paired substitution functions:: * Mathematics in functions:: * Void functions:: +* Functions without arguments:: @end menu @node Overview of music functions @subsection Overview of music functions @@ -48,6 +58,11 @@ UNTRANSLATED NODE: IGNORE ME UNTRANSLATED NODE: IGNORE ME +@node Functions without arguments +@subsection Functions without arguments + +UNTRANSLATED NODE: IGNORE ME + @node Programmer interfaces @section Programmer interfaces diff --git a/Documentation/fr/user/putting.itely b/Documentation/fr/user/putting.itely index 16d2054dfb..e7b309bed7 100644 --- a/Documentation/fr/user/putting.itely +++ b/Documentation/fr/user/putting.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Putting it all together @chapter Putting it all together diff --git a/Documentation/fr/user/running.itely b/Documentation/fr/user/running.itely index 438c5bf072..f996d6152c 100644 --- a/Documentation/fr/user/running.itely +++ b/Documentation/fr/user/running.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Running LilyPond @chapter Running LilyPond diff --git a/Documentation/fr/user/scheme-tutorial.itely b/Documentation/fr/user/scheme-tutorial.itely index d89fb346fd..08b5616aa5 100644 --- a/Documentation/fr/user/scheme-tutorial.itely +++ b/Documentation/fr/user/scheme-tutorial.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: 64f0d86a7c0987b311bfdfdfeddfa063e1f2d6e7 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Scheme tutorial @appendix Scheme tutorial diff --git a/Documentation/fr/user/spacing.itely b/Documentation/fr/user/spacing.itely index bb9119890e..fa19990b91 100644 --- a/Documentation/fr/user/spacing.itely +++ b/Documentation/fr/user/spacing.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Spacing issues @chapter Spacing issues @@ -10,7 +19,8 @@ UNTRANSLATED NODE: IGNORE ME * Horizontal spacing:: * Breaks:: * Displaying spacing:: -@end menu +@end menu + @node Paper and pages @section Paper and pages @@ -19,7 +29,8 @@ UNTRANSLATED NODE: IGNORE ME @menu * Paper size:: * Page formatting:: -@end menu +@end menu + @node Paper size @subsection Paper size diff --git a/Documentation/fr/user/templates.itely b/Documentation/fr/user/templates.itely index bd3c4228a0..efe7bcec0b 100644 --- a/Documentation/fr/user/templates.itely +++ b/Documentation/fr/user/templates.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: ac7d0e72b32b6a11470f598f2bee180b11402fe8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Example templates @appendix Example templates diff --git a/Documentation/fr/user/tutorial.itely b/Documentation/fr/user/tutorial.itely index b8869424a5..e6a7199792 100644 --- a/Documentation/fr/user/tutorial.itely +++ b/Documentation/fr/user/tutorial.itely @@ -1,5 +1,11 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- @c This file is part of lilypond.tely +@ignore + Translation of GIT committish: 64f0d86a7c0987b311bfdfdfeddfa063e1f2d6e7 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @c TODO: @c * more details about running lilypond; error messages, @@ -14,10 +20,10 @@ @node Tutorial @chapter Tutorial -Ce tutoriel commence par une courte introduction au langage utilisé -par LilyPond pour représenter la musique. Après ce premier contact, -nous verrons comment produire une partition à imprimer. Vous serez -alors capable de créer et d'imprimer vos propres partitions. +Ce tutoriel commence par une introduction au langage musical utilisé +par LilyPond, qui vous permettra de faire fonctionner le logiciel pour +prosuire une partition. Après ce premier contact, nous verrons comment +créer des partitions utilisant une notation musicale courante. @ifhtml Beaucoup de gens apprennent à utiliser les programmes en les essayant @@ -43,7 +49,7 @@ pour une consultation rapide. @menu * First steps:: -* Running LilyPond for the first time:: +* Second steps:: * More about pitches:: * Entering ties:: * Automatic and manual beams:: @@ -75,15 +81,17 @@ entrez @example @{ -c d e f g a b +c' d' e' f' g' a' b' c'' @} @end example @noindent le résultat ressemblera à -@lilypond[fragment,quote,notime,relative=1] -c d e f g a b +@lilypond[quote] +{ +c' d' e' f' g' a' b' c'' +} @end lilypond @c DIV specific @@ -92,10 +100,116 @@ re mi fa sol la si}, en insérant au début du fichier la ligne @samp{\include "catalan.ly"} @c END DIV -Tout extrait de code LilyPond doit être entouré d'une @{paire -d'accolades@}. Bien que la plupart des exemples de ce manuel n'en -comportent pas, ne les oubliez pas dans vos compositions ! +@emph{Attention :} tout extrait de code LilyPond doit être entouré +d'une @{paire d'accolades@}. De plus, pour éviter toute ambiguïté, il +est préférable d'entourer les accolades par des espaces ou retours à +la ligne. Bien que certains exemples de ce manuel ne comportent pas +d'accolades, ne les oubliez pas dans vos partitions ! + +@cindex Case sensitive +De plus, LilyPond est sensible à la casse. @code{ @{ c d e @} } est +un code valide ; @code{ @{ C D E @} } produira un message d'erreur. + +@unnumberedsubsec Entering music and viewing output + +Dans cette section nous expliquerons quelles commandes exécuter et +comment voir ou imprimer le résultat de LilyPond. + +@unnumberedsubsubsec MacOS X + +Si vous double-cliquez sur LilyPond.app, un fichier d'exemple sera +ouvert. Sauvegardez-le, par exemple, sous @file{test.ly} sur votre +bureau, et traitez-le ensuite avec la commande du menu @samp{Compile > +Typeset File}. Le fichier PDF résultant est alors affiché sur votre +écran. + +Pour l'utilisation future de LilyPond, vous commencerez certainement +en sélectionnant « Nouveau » ou « Ouvrir ». + +Notez que le premier démarrage peut prendre une minute ou deux, car +toutes les polices systèmes doivent être d'abord analysées. + +@unnumberedsubsubsec Windows + +Sous Windows, démarrez un éditeur de texte @footnote{N'importe quel +éditeur simple ou orienté programmation, qui prend en charge le codage +de caractères UTF-8, fera l'affaire, par exemple Notepad. N'utilisez +pas de traitement de texte car ceux-ci insèrent des codes de formatage +qui posent problème à LilyPond.} et saisissez + +@verbatim +{ c' e' g' c'' } +@end verbatim + +Enregistrez-le sur le bureau sous @file{test.ly} et vérifiez bien +qu'il ne s'appelle pas @file{test.ly.TXT}. Double-cliquez sur le +fichier @file{test.ly} pour le traiter et afficher le fichier +PDF résultant. + + +@unnumberedsubsubsec Unix + +Commencez par ouvrir une fenêtre de terminal et un éditeur de +texte. Par exemple, vous pouvez ouvrir un xterm et exécuter +@code{joe}. @footnote{Des fichiers de macros pour les fans de VIM et un +@code{LilyPond-mode} pour les fans d'Emacs existent. S'ils ne sont pas +encore installés, consultez le fichier @file{INSTALL.txt}.} Dans votre +éditeur, entrez le texte suivant et sauvegardez le fichier sous +@file{test.ly} + +@verbatim +{ c' e' g' c'' } +@end verbatim + +@noindent +Pour traiter @file{test.ly}, procédez comme ceci : + +@example +lilypond test.ly +@end example + +@noindent +Vous verrez quelque chose ressemblant à : + +@example +lilypond test.ly +GNU LilyPond 2.10.0 +Processing `test.ly' +Parsing... +Interpreting music... [1] +Preprocessing graphical objects... +Calculating line breaks... [2] +Layout output to `test.ps'... +Converting to `test.pdf'... +@end example + +@c DIV specific +Suivant votre installation, les messages peuvent être traduits. +@c END DIV + +@cindex PDF file +@cindex Viewing music + +@noindent +Le résultat est le fichier @file{test.pdf}, que vous pouvez imprimer +ou visualiser avec les outils standards de votre système +d'exploitation. @footnote{Si votre système ne dispose pas des outils +nécessaires, vous pouvez essayer +@uref{http://@/www@/.cs@/.wisc@/.edu/@/~ghost/,Ghostscript}, un +programme pour voir et imprimer les fichiers PDF et PostScript.} + + +@node Second steps +@section Second steps + +@emph{N'oubliez pas :} tout extrait de musique source LilyPond doit +être entouré d'@{accolades@}. Pour éviter toute ambiguïté, il +est préférable d'entourer les accolades par des espaces ou retours à +la ligne. Bien que certains exemples de ce manuel ne comportent pas +d'accolades, ne les oubliez pas dans vos partitions ! +@c will be removed once the tutorial either explains \relative or +@c examples are fixed so they don't use it. -gp De plus, de nombreux exemples utilisent le mode @code{relative}. Ceci est expliqué à la section @ref{Octave entry} ; sachez dès à présent que certains exemples devraient être libellés sous la forme @@ -108,6 +222,10 @@ De nombreux exemples ont aussi été compressés horizontalement pour Enfin, LilyPond est sensible à la casse. @code{ @{ c d e @} } est un code valide ; @code{ @{ C D E @} } produira un message d'erreur. +@c End of latest re-write. Since I have no life, I may do more +@c work on this, but I'd really like to have a Doc Helper take +@c over this task. -gp + La durée (@rglos{duration}) d'une note est spécifiée par un nombre qui suit le nom de cette note : @samp{1} pour une ronde (@rglos{whole note}), @samp{2} pour une blanche (@rglos{half note}), @samp{4} pour @@ -225,98 +343,6 @@ voir @ref{Time signature}. @end quotation -@node Running LilyPond for the first time -@section Running LilyPond for the first time - -@c cheesy title to avoid clash with chapter name. - -Dans la section précédente, nous avons vu quelles sortes d'éléments -peut contenir un fichier LilyPond. Dans cette section nous -expliquerons quelles commandes exécuter et comment voir ou imprimer le -résultat de LilyPond. Si vous n'avez jamais utilisé -LilyPond, voulez tester votre installation ou souhaitez compiler -vous-même un fichier d'exemple, lisez cette section. - -@unnumberedsubsec MacOS X - -Si vous double-cliquez sur LilyPond.app, un fichier d'exemple sera -ouvert. Sauvegardez-le, par exemple, sous @file{test.ly} sur votre -bureau, et traitez-le ensuite avec la commande du menu -@samp{Compile > Typeset File}. -Le fichier PDF résultant est alors affiché sur votre écran. - -Prenez note que le premier démarrage prend une minute ou deux , -car toutes les polices systèmes doivent être d'abord analysées. - -@unnumberedsubsec Windows - -Sous Windows, démarrez un éditeur de texte @footnote{N'importe quel -éditeur simple ou orienté programmation, qui prend en charge le -codage de caractères UTF-8, fera l'affaire, par exemple -Notepad. N'utilisez pas de traitement de texte car ceux-ci insèrent -des codes de formatage qui posent problème à LilyPond.} et saisissez - -@verbatim -@{ c'4 e' g' @} -@end verbatim - -Enregistrez le sur le bureau sous @file{test.ly} et vérifiez bien -qu'il ne s'appelle pas @file{test.ly.TXT}. Double-cliquez sur le -fichier @file{test.ly} pour le traiter et afficher le fichier -PDF résultant. - - -@unnumberedsubsec Unix - -Commencez par ouvrir une fenêtre de terminal et un éditeur de -texte. Par exemple, vous pouvez ouvrir un xterm et exécuter -@code{joe}. @footnote{Des fichiers de macros pour les fans de VIM et un -@code{LilyPond-mode} pour les fans d'Emacs existent. S'ils ne sont pas -encore installés, consultez le fichier @file{INSTALL.txt}.} Dans votre -éditeur, entrez le texte suivant et sauvegardez le fichier sous -@file{test.ly} - -@verbatim -@{ c'4 e' g' @} -@end verbatim - -@noindent -Pour traiter @file{test.ly}, procédez comme ceci : - -@example -lilypond test.ly -@end example - -@noindent -Vous verrez quelque chose ressemblant à : - -@example -lilypond test.ly -GNU LilyPond 2.10.0 -Processing `test.ly' -Parsing... -Interpreting music... [1] -Preprocessing graphical objects... -Calculating line breaks... [2] -Layout output to `test.ps'... -Converting to `test.pdf'... -@end example - -@c DIV specific -Suivant votre installation, les messages peuvent être traduits. -@c END DIV - -@cindex DVI file -@cindex Viewing music -@cindex xdvi -@noindent -Le résultat est le fichier @file{test.pdf} que vous pouvez imprimer ou -visualiser avec les outils standards de votre système d'exploitation. -@footnote{Si votre système ne dispose pas des outils nécessaires, -vous pouvez essayer -@uref{http://@/www@/.cs@/.wisc@/.edu/@/~ghost/,Ghostscript}, un -programme pour voir et imprimer les fichiers PDF et PostScript.} - @node More about pitches @section More about pitches diff --git a/Documentation/fr/user/tweaks.itely b/Documentation/fr/user/tweaks.itely index ca79cdefce..032f76c453 100644 --- a/Documentation/fr/user/tweaks.itely +++ b/Documentation/fr/user/tweaks.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: 64f0d86a7c0987b311bfdfdfeddfa063e1f2d6e7 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Tweaking output @chapter Tweaking output @@ -10,6 +19,7 @@ UNTRANSLATED NODE: IGNORE ME * Default files:: * Fitting music onto fewer pages:: * Advanced tweaks with Scheme:: +* Avoiding tweaks with slower processing:: @end menu @node Moving objects @section Moving objects @@ -41,3 +51,7 @@ UNTRANSLATED NODE: IGNORE ME UNTRANSLATED NODE: IGNORE ME +@node Avoiding tweaks with slower processing +@section Avoiding tweaks with slower processing + +UNTRANSLATED NODE: IGNORE ME diff --git a/Documentation/fr/user/working.itely b/Documentation/fr/user/working.itely index a05a3bc433..f3e00af868 100644 --- a/Documentation/fr/user/working.itely +++ b/Documentation/fr/user/working.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: 64f0d86a7c0987b311bfdfdfeddfa063e1f2d6e7 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Working on LilyPond projects @chapter Working on LilyPond projects diff --git a/Documentation/po/fr.po b/Documentation/po/fr.po index c6307b7017..56a829cb7c 100644 --- a/Documentation/po/fr.po +++ b/Documentation/po/fr.po @@ -3,13 +3,13 @@ # Copyright (C) 2006 Han-Wen Nienhuys, Jan Nieuwenhuizen # This file is distributed under the same license as the lilypond package. # -# John Mandereau , 2006. +# John Mandereau , 2006, 2007. msgid "" msgstr "" "Project-Id-Version: fr\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-12-23 14:50+0100\n" -"PO-Revision-Date: 2006-12-23 15:02+0100\n" +"POT-Creation-Date: 2007-01-07 16:10+0100\n" +"PO-Revision-Date: 2007-01-07 16:33+0100\n" "Last-Translator: John Mandereau \n" "Language-Team: Français \n" "MIME-Version: 1.0\n" @@ -71,8 +71,8 @@ msgstr "Tutoriel" msgid "First steps" msgstr "Premiers pas" -msgid "Running LilyPond for the first time" -msgstr "Lancer LilyPond pour la première fois" +msgid "Entering music and viewing output" +msgstr "Saisir la musique et visualiser la partition produite" msgid "MacOS X" msgstr "MacOS X" @@ -83,6 +83,9 @@ msgstr "Windows" msgid "Unix" msgstr "Unix" +msgid "Second steps" +msgstr "Initiation à la notation de base" + msgid "More about pitches" msgstr "Les hauteurs en détail" @@ -197,6 +200,9 @@ msgstr "Réduire le nombre de pages de la partition" msgid "Advanced tweaks with Scheme" msgstr "Retouches avancées avec Scheme" +msgid "Avoiding tweaks with slower processing" +msgstr "" + msgid "Basic notation" msgstr "Notation de base" @@ -279,7 +285,7 @@ msgid "Staff notation" msgstr "Notation sur la portée" msgid "Clef" -msgstr "Clé" +msgstr "Clés" msgid "Key signature" msgstr "Armure" @@ -382,160 +388,160 @@ msgid "Measure repeats" msgstr "Répétitions de mesure" msgid "Instrument-specific notation" -msgstr "" +msgstr "Notation spécifique" msgid "Piano music" -msgstr "" +msgstr "Musique pour piano" msgid "Automatic staff changes" -msgstr "" +msgstr "Changements de portée automatiques" msgid "Manual staff switches" -msgstr "" +msgstr "Changements de portée manuels" msgid "Pedals" -msgstr "" +msgstr "Pédales" msgid "Staff switch lines" -msgstr "" +msgstr "Lignes de changement de portée" msgid "Cross staff stems" -msgstr "" +msgstr "Accords sur plusieurs portées" msgid "Chord names" -msgstr "" +msgstr "Accords nommés" msgid "Introducing chord names" -msgstr "" +msgstr "Introduction aux noms d'accords" msgid "Chords mode" -msgstr "" +msgstr "Mode accords" msgid "Printing chord names" -msgstr "" +msgstr "Imprimer des noms d'accords" msgid "Vocal music" -msgstr "" +msgstr "Musique vocale" msgid "Setting simple songs" -msgstr "" +msgstr "Écrire des chansons simples¿" msgid "Entering lyrics" -msgstr "" +msgstr "Saisie des paroles" msgid "Hyphens and extenders" -msgstr "" +msgstr "Traits d'union et de prolongation" msgid "The Lyrics context" -msgstr "" +msgstr "Le contexte de paroles (Lyrics)" msgid "Melismata" -msgstr "" +msgstr "Mélismes" msgid "Another way of entering lyrics" -msgstr "" +msgstr "Une autre manière de saisir des paroles" msgid "Flexibility in placement" -msgstr "" +msgstr "Flexibilité dans le placement" msgid "Lyrics to multiple notes of a melisma" -msgstr "" +msgstr "Paroles sur plusieurs notes d'un mélisme" msgid "Divisi lyrics" -msgstr "" +msgstr "Paroles alternatives" msgid "Switching the melody associated with a lyrics line" -msgstr "" +msgstr "Changer la voix associée à une ligne de paroles" msgid "Specifying melismata within the lyrics" -msgstr "" +msgstr "Indiquer les mélismes au sein des paroles" msgid "Lyrics independent of notes" -msgstr "" +msgstr "Paroles indépendantes des notes" msgid "Spacing lyrics" -msgstr "" +msgstr "Espacement des paroles" msgid "More about stanzas" -msgstr "" +msgstr "Plus à propos des strophes" msgid "Ambitus" -msgstr "" +msgstr "Ambitus" msgid "Other vocal issues" -msgstr "" +msgstr "Autres éléments relatifs à la voix" msgid "Rhythmic music" -msgstr "" +msgstr "Musique rythmique" msgid "Showing melody rhythms" -msgstr "" +msgstr "Graver des lignes rythmiques" msgid "Entering percussion" -msgstr "" +msgstr "Notation de percussions" msgid "Percussion staves" -msgstr "" +msgstr "Portée de percussions" msgid "Ghost notes" -msgstr "" +msgstr "Notes fantômes" msgid "Guitar" -msgstr "" +msgstr "Guitare" msgid "String number indications" -msgstr "" +msgstr "Indications de numéro de corde" msgid "Tablatures basic" -msgstr "" +msgstr "Base des tablatures" msgid "Non-guitar tablatures" -msgstr "" +msgstr "Tablatures autres que pour la guitare" msgid "Banjo tablatures" -msgstr "" +msgstr "Tablatures pour banjo" msgid "Fret diagrams" -msgstr "" +msgstr "Tablatures" msgid "Right hand fingerings" -msgstr "" +msgstr "Doigtés pour la main droite" msgid "Other guitar issues" -msgstr "" +msgstr "Autres éléments relatifs à la guitare" msgid "Bagpipe" -msgstr "" +msgstr "Cornemuse" msgid "Bagpipe definitions" -msgstr "" +msgstr "Définitions pour la cornemuse" msgid "Bagpipe example" -msgstr "" +msgstr "Exemple pour la cornemuse" msgid "Ancient notation" -msgstr "" +msgstr "Notations anciennes" msgid "Ancient note heads" -msgstr "" +msgstr "Têtes de note anciennes" msgid "Ancient accidentals" -msgstr "" +msgstr "Altérations anciennes" msgid "Ancient rests" -msgstr "" +msgstr "Silences anciens" msgid "Ancient clefs" -msgstr "" +msgstr "Clefs anciennes" msgid "Ancient flags" -msgstr "" +msgstr "Crochets anciens" msgid "Ancient time signatures" -msgstr "" +msgstr "Métriques anciennes" msgid "Ancient articulations" -msgstr "" +msgstr "Articulations anciennes" msgid "Custodes" msgstr "" @@ -562,19 +568,19 @@ msgid "Musica ficta accidentals" msgstr "" msgid "Figured bass" -msgstr "" +msgstr "Basse chiffrée" msgid "Other instrument specific notation" -msgstr "" +msgstr "Autres notations spécifique à des instruments" msgid "Artificial harmonics (strings)" -msgstr "" +msgstr "Harmoniques artificiels (cordes)" msgid "Advanced notation" -msgstr "" +msgstr "Notation avancée" msgid "Text" -msgstr "" +msgstr "Texte" msgid "Text scripts" msgstr "" @@ -699,9 +705,12 @@ msgstr "" msgid "Parentheses" msgstr "" -msgid "Changing defaults" +msgid "Grid lines" msgstr "" +msgid "Changing defaults" +msgstr "Changer les réglages prédéfinis" + msgid "Automatic notation" msgstr "" @@ -735,6 +744,9 @@ msgstr "" msgid "Defining new contexts" msgstr "" +msgid "Aligning contexts" +msgstr "" + msgid "The \\override command" msgstr "" @@ -760,7 +772,7 @@ msgid "Difficult tweaks" msgstr "" msgid "Non-musical notation" -msgstr "" +msgstr "Objets non musicaux" msgid "Input files" msgstr "" @@ -814,7 +826,7 @@ msgid "Skipping corrected music" msgstr "" msgid "Spacing issues" -msgstr "" +msgstr "Questions d'espacement" msgid "Paper and pages" msgstr "" @@ -828,7 +840,7 @@ msgstr "" msgid "Music layout" msgstr "" -msgid "Setting global staff size" +msgid "Setting the staff size" msgstr "" msgid "Score layout" @@ -889,7 +901,7 @@ msgid "Displaying spacing" msgstr "" msgid "Interfaces for programmers" -msgstr "" +msgstr "Interfaces pour les programmeurs" msgid "Music functions" msgstr "" @@ -909,6 +921,9 @@ msgstr "" msgid "Void functions" msgstr "" +msgid "Functions without arguments" +msgstr "" + msgid "Programmer interfaces" msgstr "" @@ -958,7 +973,7 @@ msgid "Scheme procedures as properties" msgstr "" msgid "Running LilyPond" -msgstr "" +msgstr "Lancer LilyPond" msgid "Invoking lilypond" msgstr "" @@ -975,7 +990,7 @@ msgstr "" msgid "Updating files with convert-ly" msgstr "" -msgid "Updating with" +msgid "Updating with @command{convert-ly}" msgstr "" msgid "Reporting bugs" @@ -991,7 +1006,10 @@ msgid "Point and click" msgstr "" msgid "LilyPond-book" -msgstr "" +msgstr "LilyPond-book" + +msgid "@command{lilypond-book}: Integrating text and music" +msgstr "@command{lilypond-book} : associer de la musique et du texte" msgid "An example of a musicological document" msgstr "" @@ -999,7 +1017,7 @@ msgstr "" msgid "Integrating LaTeX and music" msgstr "" -msgid "Integrating La" +msgid "Integrating La@TeX{} and music" msgstr "" msgid "Integrating Texinfo and music" @@ -1029,7 +1047,7 @@ msgstr "" msgid "Invoking lilypond-book" msgstr "" -msgid "Invoking" +msgid "Invoking @command{lilypond-book}" msgstr "" msgid "Filename extensions" @@ -1038,35 +1056,50 @@ msgstr "" msgid "Many quotes of a large score" msgstr "" +msgid "Inserting LilyPond output into OpenOffice.org" +msgstr "" + msgid "Inserting LilyPond output into other programs" msgstr "" msgid "Converting from other formats" -msgstr "" +msgstr "Convertir à partir d'autres formats" msgid "Invoking midi2ly" msgstr "" +msgid "Invoking @command{midi2ly}" +msgstr "" + msgid "Invoking etf2ly" msgstr "" +msgid "Invoking @command{etf2ly}" +msgstr "" + msgid "Invoking musicxml2ly" msgstr "" +msgid "Invoking @code{musicxml2ly}" +msgstr "" + msgid "Invoking abc2ly" msgstr "" +msgid "Invoking @code{abc2ly}" +msgstr "" + msgid "Generating LilyPond files" msgstr "" msgid "Literature list" -msgstr "" +msgstr "Bibliographie" msgid "Scheme tutorial" -msgstr "" +msgstr "Tutoriel Scheme" msgid "Notation manual tables" -msgstr "" +msgstr "Tables du manuel de notation" msgid "Chord name chart" msgstr "" @@ -1096,7 +1129,7 @@ msgid "The Feta font" msgstr "" msgid "Example templates" -msgstr "" +msgstr "Modèles-exemples" msgid "Single staff" msgstr "" @@ -1143,6 +1176,9 @@ msgstr "" msgid "SATB vocal score and automatic piano reduction" msgstr "" +msgid "SATB with aligned contexts" +msgstr "" + msgid "Ancient notation templates" msgstr "" @@ -1165,7 +1201,7 @@ msgid "Texinfo" msgstr "" msgid "Cheat sheet" -msgstr "" +msgstr "Feuille aide-mémoire" msgid "GNU Free Documentation License" msgstr "" @@ -1186,5 +1222,5 @@ msgid "Appendix" msgstr "Annexe" msgid "Footnotes" -msgstr "Notes" +msgstr "Notes de bas de page" diff --git a/Documentation/po/lilypond-doc.pot b/Documentation/po/lilypond-doc.pot index 2ff82cea77..158f295350 100644 --- a/Documentation/po/lilypond-doc.pot +++ b/Documentation/po/lilypond-doc.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-12-23 14:50+0100\n" +"POT-Creation-Date: 2007-01-07 16:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -70,7 +70,7 @@ msgstr "" msgid "First steps" msgstr "" -msgid "Running LilyPond for the first time" +msgid "Entering music and viewing output" msgstr "" msgid "MacOS X" @@ -82,6 +82,9 @@ msgstr "" msgid "Unix" msgstr "" +msgid "Second steps" +msgstr "" + msgid "More about pitches" msgstr "" @@ -196,6 +199,9 @@ msgstr "" msgid "Advanced tweaks with Scheme" msgstr "" +msgid "Avoiding tweaks with slower processing" +msgstr "" + msgid "Basic notation" msgstr "" @@ -697,6 +703,9 @@ msgstr "" msgid "Parentheses" msgstr "" +msgid "Grid lines" +msgstr "" + msgid "Changing defaults" msgstr "" @@ -733,6 +742,9 @@ msgstr "" msgid "Defining new contexts" msgstr "" +msgid "Aligning contexts" +msgstr "" + msgid "The \\override command" msgstr "" @@ -826,7 +838,7 @@ msgstr "" msgid "Music layout" msgstr "" -msgid "Setting global staff size" +msgid "Setting the staff size" msgstr "" msgid "Score layout" @@ -907,6 +919,9 @@ msgstr "" msgid "Void functions" msgstr "" +msgid "Functions without arguments" +msgstr "" + msgid "Programmer interfaces" msgstr "" @@ -973,7 +988,7 @@ msgstr "" msgid "Updating files with convert-ly" msgstr "" -msgid "Updating with" +msgid "Updating with @command{convert-ly}" msgstr "" msgid "Reporting bugs" @@ -991,13 +1006,16 @@ msgstr "" msgid "LilyPond-book" msgstr "" +msgid "@command{lilypond-book}: Integrating text and music" +msgstr "" + msgid "An example of a musicological document" msgstr "" msgid "Integrating LaTeX and music" msgstr "" -msgid "Integrating La" +msgid "Integrating La@TeX{} and music" msgstr "" msgid "Integrating Texinfo and music" @@ -1027,7 +1045,7 @@ msgstr "" msgid "Invoking lilypond-book" msgstr "" -msgid "Invoking" +msgid "Invoking @command{lilypond-book}" msgstr "" msgid "Filename extensions" @@ -1036,6 +1054,9 @@ msgstr "" msgid "Many quotes of a large score" msgstr "" +msgid "Inserting LilyPond output into OpenOffice.org" +msgstr "" + msgid "Inserting LilyPond output into other programs" msgstr "" @@ -1045,15 +1066,27 @@ msgstr "" msgid "Invoking midi2ly" msgstr "" +msgid "Invoking @command{midi2ly}" +msgstr "" + msgid "Invoking etf2ly" msgstr "" +msgid "Invoking @command{etf2ly}" +msgstr "" + msgid "Invoking musicxml2ly" msgstr "" +msgid "Invoking @code{musicxml2ly}" +msgstr "" + msgid "Invoking abc2ly" msgstr "" +msgid "Invoking @code{abc2ly}" +msgstr "" + msgid "Generating LilyPond files" msgstr "" @@ -1141,6 +1174,9 @@ msgstr "" msgid "SATB vocal score and automatic piano reduction" msgstr "" +msgid "SATB with aligned contexts" +msgstr "" + msgid "Ancient notation templates" msgstr "" diff --git a/Documentation/topdocs/INSTALL.texi b/Documentation/topdocs/INSTALL.texi index 52d8d8cf76..616eed6010 100644 --- a/Documentation/topdocs/INSTALL.texi +++ b/Documentation/topdocs/INSTALL.texi @@ -116,7 +116,7 @@ software @item @uref{http://www.freetype.org/,FontConfig} (version 2.2). @item @uref{http://www.pango.org/,Pango} (version 1.12 or newer). @item @uref{http://www.gnu.org/software/guile/guile.html,GUILE} -(version 1.8.2 or newer), or patch 1.8.x with +(version 1.8.2 or newer), or patch 1.8.1 with @uref{http://lilypond.org/vc/gub.darcs/patches/guile-1.8-rational.patch}. @item @uref{http://www.python.org,Python} (version 2.4 or newer). @item @uref{http://www.ghostscript.com,Ghostscript} (version 8.15 or @@ -157,6 +157,45 @@ make out=www web-install @end example @end quotation +@section Testing LilyPond + +LilyPond comes with an extensive suite that excercises the entire +program. This suite can be used to automatically check the impact of a +change. This is done as follows + +@example + make test-baseline + @emph{## apply your changes, compile} + make check +@end example + +This will leave an HTML page @file{out/test-results/index.html}. This +page shows all the important differences that your change introduced, +whether in the layout, MIDI, performance or error reporting. + +To rerun tests, use + +@example + make test-redo @emph{## redo files differing from baseline} + make test-clean @emph{## remove all test results} +@end example + +@noindent +and then run @code{make check} again. + +For tracking memory usage as part of this test, you will need GUILE +CVS; especially the following patch: +@uref{http://lilypond.org/vc/gub.darcs/patches/guile-1.9-gcstats.patch}. + +For checking the coverage of the test suite, do the following + +@example + ./buildscripts/build-coverage.sh + @emph{# uncovered files, least covered first} + python ./buildscripts/coverage.py --summary out-cov/*.cc + @emph{# consecutive uncovered lines, longest first} + python ./buildscripts/coverage.py --uncovered out-cov/*.cc +@end example @section Building LilyPond diff --git a/Documentation/topdocs/NEWS.tely b/Documentation/topdocs/NEWS.tely index 3a59f03536..e7b58fc71f 100644 --- a/Documentation/topdocs/NEWS.tely +++ b/Documentation/topdocs/NEWS.tely @@ -20,7 +20,6 @@ See user manual, \NAME\ @end macro @end ifnothtml - @macro textanchor{NAME} @html @@ -66,6 +65,32 @@ which scares away people. @end ignore +@item +Notes or rests, such as a typical end note, that fill an entire +measure are preceded by some more space. + +@lilypond[ragged-right] +\relative c' { + \time 4/4 + s1 + c2. c4 + \time 3/4 + c2. +} +@end lilypond + +@item All @code{\score}s in a lilypond-book fragment are now inserted +into the document. Also, toplevel markups don't result in an entire +page. + +@item Alterations (such as a sharp and flat) may now be arbitrary +fractions. This allows some forms of microtonal music. For example, +Turkish makam music uses 1/9th tone alterations. + +@lilypondfile{makam.ly} + + + @item Tie directions may be set with @code{^~} and @code{_~} @item Tablature now supports harmonics and slides, diff --git a/Documentation/topdocs/README.texi b/Documentation/topdocs/README.texi index 2d6e26b99e..e0e7a16503 100644 --- a/Documentation/topdocs/README.texi +++ b/Documentation/topdocs/README.texi @@ -32,12 +32,12 @@ For compiling and running LilyPond see the installation instructions. These instructions can be found when you unpack lilypond, as @file{lilypond-x.y.z/INSTALL.txt}. They are also available on the web at -@uref{http://lilypond.org/doc/v2.1/Documentation/topdocs/out-www/INSTALL.html}. +@uref{http://lilypond.org/doc/v2.10/Documentation/topdocs/INSTALL.html}. @section Documentation The documentation is available online at -@uref{http://www.lilypond.org/doc/}. +@uref{http://lilypond.org/doc/}. You can also build it locally: follow the instructions under `Building documentation' in the installation instructions. diff --git a/Documentation/user/README.txt b/Documentation/user/README.txt index ba2f98793a..b10f6607f1 100644 --- a/Documentation/user/README.txt +++ b/Documentation/user/README.txt @@ -1,7 +1,7 @@ Info for Documentation ---------------------- -Current version of the manual: 2.9.13 +Current version of the manual: 2.11.10 ? *** Please update this whenever you run convert-ly on the docs. convert-ly --from=... --to=... --no-version *.itely @@ -133,6 +133,10 @@ GENERAL GUIDELINES * Lines should be less than 80 characters long. +* Use @q instead of `...' and @qq instead of ``...''. The latter macro + should be used with care since we use `...' as the default quoting + throughout the manual, except for things related to direct speech. + %%%%% HINTS FOR TECHNICAL WRITING STYLE diff --git a/Documentation/user/advanced-notation.itely b/Documentation/user/advanced-notation.itely index 30042de160..42cdb7bdae 100644 --- a/Documentation/user/advanced-notation.itely +++ b/Documentation/user/advanced-notation.itely @@ -1,5 +1,11 @@ @c -*- coding: utf-8; mode: texinfo; -*- @c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @c A menu is needed before every deeper *section nesting of @node's; run @c M-x texinfo-all-menus-update @@ -621,7 +627,7 @@ individual parts. @cindex whole rests for a full measure @funindex R -Rests for one full measure (or many bars) are entered using `@code{R}'. It +Rests for one full measure (or many bars) are entered using @samp{R}. It is specifically meant for full bar rests and for entering parts: the rest can expand to fill a score with rests, or it can be printed as a single multi-measure rest. This expansion is controlled by the property @@ -650,7 +656,7 @@ R1*13/8*12 | An @code{R} spanning a single measure is printed as either a whole rest or a breve, centered in the measure regardless of the time signature. -If there are only a few measures of rest, LilyPond prints ``church rests'' +If there are only a few measures of rest, LilyPond prints @q{church rests} (a series of rectangles) in the staff. To replace that with a simple rest, use @code{MultiMeasureRest.expand-limit}. @@ -804,8 +810,8 @@ c1 \mark \default @end lilypond @noindent -The letter@tie{}`I' is skipped in accordance with engraving traditions. -If you wish to include the letter `I', then use +The letter@tie{}@q{I} is skipped in accordance with engraving traditions. +If you wish to include the letter @q{I}, then use @example \set Score.markFormatter = #format-mark-alphabet @@ -842,6 +848,20 @@ You may use @code{format-mark-barnumbers}, @code{format-mark-box-barnumbers}, and @code{format-mark-circle-barnumbers} to get bar numbers instead of incremented numbers or letters. +Other styles of rehearsal mark can be specified manually + +@example +\mark "A1" +@end example + +@noindent +@code{Score.markFormatter} does not affect marks specified in this manner. +However, it is possible to apply a @code{\markup} to the string. + +@example +\mark \markup@{ \box A1 @} +@end example + @cindex segno @cindex coda @cindex D.S al Fine @@ -887,6 +907,8 @@ appears at that point in the music. @seealso +This manual: @ref{Text marks}. + Program reference: @internalsref{RehearsalMark}. Init files: @file{scm/@/translation@/-functions@/.scm} contains the @@ -1051,6 +1073,19 @@ be added to that context. More information about adding and removing engravers can be found in @ref{Modifying context plug-ins}. +Instrument names may be changed in the middle of a piece, + +@lilypond[quote,fragment,verbatim,ragged-right] +\set Staff.instrumentName = "First" +\set Staff.shortInstrumentName = "one" +c1 c c c \break +c1 c c c \break +\set Staff.instrumentName = "Second" +\set Staff.shortInstrumentName = "two" +c1 c c c \break +c1 c c c \break +@end lilypond + @seealso @@ -1116,7 +1151,7 @@ c'4^"in G" @node Ottava brackets @subsection Ottava brackets -`Ottava' brackets introduce an extra transposition of an octave for +@q{Ottava} brackets introduce an extra transposition of an octave for the staff. They are created by invoking the function @code{set-octavation} @@ -1288,8 +1323,8 @@ The first @code{g} appears only once, although it was specified twice (once in each part). Stem, slur, and tie directions are set automatically, depending whether there is a solo or unisono. The first part (with context called @code{one}) always gets up stems, and -`Solo', while the second (called @code{two}) always gets down stems and -`Solo II'. +@q{Solo}, while the second (called @code{two}) always gets down stems and +@q{Solo II}. If you just want the merging parts, and not the textual markings, you may set the property @code{printPartCombineTexts} to false @@ -1360,7 +1395,7 @@ will be ignored. @cindex Hiding staves In orchestral scores, staff lines that only have rests are usually -removed; this saves some space. This style is called `French Score'. +removed; this saves some space. This style is called @q{French Score}. For @internalsref{Lyrics}, @internalsref{ChordNames} and @internalsref{FiguredBass}, this is switched on by default. When the lines of these contexts turn out @@ -1408,19 +1443,19 @@ staff. With quotations, fragments of other parts can be inserted into a part directly. Before a part can be quoted, it must be marked especially as -quotable. This is done with the @code{\addquote} command. +quotable. This is done with the @code{\addQuote} command. @example -\addquote @var{name} @var{music} +\addQuote @var{name} @var{music} @end example @noindent Here, @var{name} is an identifying string. The @var{music} is any kind -of music. Here is an example of @code{\addquote} +of music. Here is an example of @code{\addQuote} @example -\addquote clarinet \relative c' @{ +\addQuote clarinet \relative c' @{ f4 fis g gis @} @end example @@ -1428,7 +1463,7 @@ of music. Here is an example of @code{\addquote} This command must be entered at toplevel, i.e., outside any music blocks. -After calling @code{\addquote}, the quotation may then be done with +After calling @code{\addQuote}, the quotation may then be done with @code{\quoteDuring} or @code{\cueDuring}, @example @@ -1448,7 +1483,7 @@ the previously added @code{clarinet} voice. More precisely, it takes the current time-step of the part being printed, and extracts the notes at the corresponding point of the -@code{\addquote}d voice. Therefore, the argument to @code{\addquote} +@code{\addQuote}d voice. Therefore, the argument to @code{\addQuote} should be the entire part of the voice to be quoted, including any rests at the beginning. @@ -1456,7 +1491,7 @@ Quotations take into account the transposition of both source and target instruments, if they are specified using the @code{\transposition} command. @lilypond[quote,ragged-right,verbatim] -\addquote clarinet \relative c' { +\addQuote clarinet \relative c' { \transposition bes f4 fis g gis } @@ -1483,12 +1518,15 @@ will quote notes (but no rests), together with scripts and dynamics. @refbugs Only the contents of the first @internalsref{Voice} occurring in an -@code{\addquote} command will be considered for quotation, so +@code{\addQuote} command will be considered for quotation, so @var{music} can not contain @code{\new} and @code{\context Voice} statements that would switch to a different Voice. Quoting grace notes is broken and can even cause LilyPond to crash. +Quoting nested triplets may result in poor notation. + + @seealso In this manual: @ref{Instrument transpositions}. @@ -1530,7 +1568,7 @@ smaller = { \override Beam #'length-fraction = #0.8 } -\addquote clarinet \relative { +\addQuote clarinet \relative { R1*20 r2 r8 c f f } @@ -1581,6 +1619,34 @@ the original clef should be stated once again. @end itemize +The macro @code{\transposedCueDuring} is +useful to add cues to instruments which use a completely different +octave range (for example, having a cue of a piccolo flute within +a contra bassoon part). + +@lilypond[verbatim,ragged-right,quote] +picc = \relative c''' { + \clef "treble^8" + R1 | + c8 c c e g2 | + a4 g g2 | +} +\addQuote "picc" { \picc } + +cbsn = \relative c, { + \clef "bass_8" + c4 r g r + \transposedCueDuring #"picc" #UP c,, { R1 } | + c4 r g r | +} + +<< + \context Staff = "picc" \picc + \context Staff = "cbsn" \cbsn +>> +@end lilypond + + @node Aligning to cadenzas @subsection Aligning to cadenzas @@ -1619,7 +1685,7 @@ cadenza = \relative c' { In the 20th century, composers have greatly expanded the musical vocabulary. With this expansion, many innovations in musical notation -have been tried. The book ``Music Notation in the 20th century'' by +have been tried. The book @q{Music Notation in the 20th century} by Kurt Stone gives a comprehensive overview (see @ref{Literature list}). @@ -1645,6 +1711,11 @@ see those sections of the documentation. @node Polymetric notation @subsection Polymetric notation +@cindex double time signatures +@cindex signatures, polymetric +@cindex polymetric signatures +@cindex meter, polymetric + Double time signatures are not supported explicitly, but they can be faked. In the next example, the markup for the time signature is created with a markup text. This markup text is inserted in the @@ -1656,7 +1727,7 @@ created with a markup text. This markup text is inserted in the tsMarkup =\markup { \override #'(baseline-skip . 2) \number { \column { "2" "4" } - \lower #1 "+" + \vcenter "+" \bracket \column { "5" "8" } } } @@ -1933,7 +2004,7 @@ accurately. Use @code{8 8} instead. @cindex note heads, special Different noteheads are used by various instruments for various -meanings -- crosses are used for ``parlato'' with vocalists, stopped +meanings -- crosses are used for @q{parlato} with vocalists, stopped notes on guitar; diamonds are used for harmonics on string instruments, etc. There is a shorthand (@code{\harmonic}) for diamond shapes; the other notehead styles are produced by tweaking the property @@ -2079,6 +2150,7 @@ teaching tools in addition to great musical scores. * Analysis brackets:: * Coloring objects:: * Parentheses:: +* Grid lines:: @end menu @node Balloon help @@ -2214,7 +2286,7 @@ combinations are possible, e.g. @cindex easy notation @cindex Hal Leonard -The `easy play' note head includes a note name inside the head. It is +The @q{easy play} note head includes a note name inside the head. It is used in music for beginners @lilypond[quote,ragged-right,verbatim,fragment,staffsize=26] @@ -2372,3 +2444,11 @@ This only functions inside chords, even for single notes @end example +@node Grid lines +@subsection Grid lines + +Vertical lines can be drawn between staves synchronized with +the notes. + +Examples: @inputfileref{input/@/regression,grid@/-lines@/.ly}. + diff --git a/Documentation/user/basic-notation.itely b/Documentation/user/basic-notation.itely index b7b8721e8e..da60b0e06c 100644 --- a/Documentation/user/basic-notation.itely +++ b/Documentation/user/basic-notation.itely @@ -1,5 +1,12 @@ @c -*- coding: utf-8; mode: texinfo; -*- @c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @c A menu is needed before every deeper *section nesting of @node's; run @c M-x texinfo-all-menus-update @@ -13,7 +20,7 @@ This chapter explains how to use basic notation features. @menu * Pitches:: * Rhythms:: -* Multiple notes at once:: +* Polyphony:: * Staff notation:: * Connecting notes:: * Expressive marks:: @@ -32,7 +39,7 @@ This section discusses how to specify the pitch of notes. * Accidentals:: * Cautionary accidentals:: * Micro tones:: -* Notes names in other languages:: +* Note names in other languages:: * Relative octaves:: * Octave check:: * Transpose:: @@ -68,9 +75,9 @@ c1 @funindex , The optional octave specification takes the form of a series of -single quote (`@code{'}') characters or a series of comma -(`@code{,}') characters. Each @code{'} raises the pitch by one -octave; each @code{,} lowers the pitch by an octave. +single quote (@samp{'}) characters or a series of comma +(@samp{,}) characters. Each @samp{'} raises the pitch by one +octave; each @samp{,} lowers the pitch by an octave. @lilypond[quote,ragged-right,fragment,verbatim] \clef treble @@ -117,11 +124,11 @@ suffix; a natural pitch is shown as a simple note name a4 aes a2 @end lilypond -The input @code{d e f} is interpreted as ``print a D-natural, -E-natural, and an F-natural,'' regardless of the key +The input @code{d e f} is interpreted as @q{print a D-natural, +E-natural, and an F-natural,} regardless of the key signature. For more information about the distinction between musical content and the presentation of that content, see -@ref{More about pitches}. +@ref{Accidentals and key signatures}. @lilypond[fragment,quote,ragged-right,verbatim,relative] \key d \major @@ -167,7 +174,7 @@ print them manually. A reminder accidental can be forced by adding an exclamation mark @code{!} after the pitch. A cautionary accidental (i.e., an accidental within parentheses) can be obtained by adding the -question mark `@code{?}' after the pitch. These extra accidentals +question mark @samp{?} after the pitch. These extra accidentals can be used to produce natural signs, too. @lilypond[quote,ragged-right,fragment,verbatim,relative=1] @@ -205,8 +212,8 @@ three-quarter flats, so LilyPond's symbol does not conform to any standard. -@node Notes names in other languages -@subsection Notes names in other languages +@node Note names in other languages +@subsection Note names in other languages There are predefined sets of note names for various other languages. To use them, include the language specific init file. For @@ -422,7 +429,7 @@ mus = { \key d \major cis d fis g } @code{\transpose} may also be used to input written notes for a transposing instrument. Pitches are normally entered into LilyPond -in C (or ``concert pitch''), but they may be entered in another +in C (or @q{concert pitch}), but they may be entered in another key. For example, when entering music for a B-flat trumpet which begins on concert D, one would write @@ -499,8 +506,8 @@ Program reference: @internalsref{Rest}. @funindex \skip @funindex s -An invisible rest (also called a `skip') can be entered like a note -with note name `@code{s}' or with @code{\skip @var{duration}} +An invisible rest (also called a @q{skip}) can be entered like a note +with note name @samp{s} or with @code{\skip @var{duration}} @lilypond[fragment,quote,ragged-right,verbatim,relative=2] a4 a4 s4 a4 \skip 1 a4 @@ -616,7 +623,7 @@ duration. The default for the first note is a quarter note. @funindex . -To obtain dotted note lengths, simply add a dot (`@code{.}') to +To obtain dotted note lengths, simply add a dot (@samp{.}) to the number. Double-dotted notes are produced in a similar way. @lilypond[quote,ragged-right,fragment,verbatim] @@ -753,7 +760,7 @@ Examples: @inputfileref{input/@/regression,tuplet@/-nest@/.ly}. @subsection Scaling durations You can alter the length of duration by a fraction @var{N/M} -appending `@code{*}@var{N/M}' (or `@code{*}@var{N}' if @var{M=1}). This +appending @samp{*@var{N/M}} (or @samp{*@var{N}} if @var{M=1}). This will not affect the appearance of the notes or rests produced. In the following example, the first three notes take up exactly two @@ -779,7 +786,7 @@ This manual: @ref{Tuplets} @funindex | Bar checks help detect errors in the durations. A bar check is -entered using the bar symbol, `@code{|}'. Whenever it is encountered +entered using the bar symbol, @samp{|}. Whenever it is encountered during interpretation, it should fall on a measure boundary. If it does not, a warning is printed. In the next example, the second bar check will signal an error @@ -877,8 +884,8 @@ Examples: @inputfileref{input/@/regression,completion@/-heads@/.ly}. Program reference: @internalsref{Completion_heads_engraver}. -@node Multiple notes at once -@section Multiple notes at once +@node Polyphony +@section Polyphony Polyphony in music refers to having more than one voice occurring in a piece of music. Polyphony in LilyPond refers to having more than @@ -962,7 +969,7 @@ them simultaneously, separating the voices with @code{\\} @end lilypond The separator causes @internalsref{Voice} contexts@footnote{Polyphonic -voices are sometimes called ``layers'' in other notation packages} +voices are sometimes called @q{layers} in other notation packages} @cindex layers to be instantiated. They bear the names @code{"1"}, @code{"2"}, etc. In each of these contexts, vertical direction of slurs, stems, etc., is set @@ -1140,6 +1147,10 @@ Similarly, you can merge half note heads with eighth notes, by setting c8 c4. } \\ { c2 c2 } >> @end lilypond +@noindent +@code{merge-differently-headed} and @code{merge-differently-dotted} +only apply to opposing stem directions (ie. Voice 1 & 2). + LilyPond also vertically shifts rests that are opposite of a stem, for example @@ -1373,7 +1384,7 @@ command Here, @var{type} should be @code{\major} or @code{\minor} to get @var{pitch}-major or @var{pitch}-minor, respectively. You may also -use the standard mode names (also called ``church modes''): @code{\ionian}, +use the standard mode names (also called @q{church modes}): @code{\ionian}, @code{\locrian}, @code{\aeolian}, @code{\mixolydian}, @code{\lydian}, @code{\phrygian}, and @code{\dorian}. @@ -1383,7 +1394,7 @@ can be specified by setting this property directly. Accidentals and key signatures often confuse new users, because unaltered notes get natural signs depending on the key signature. For -more information, see @ref{Accidentals} or @ref{More about pitches}. +more information, see @ref{Accidentals} or @ref{Accidentals and key signatures}. @lilypond[quote,ragged-right,verbatim,relative=2,fragment] \key g \major @@ -1533,7 +1544,7 @@ This is internally translated into The property @code{measurePosition} contains a rational number indicating how much of the measure has passed at this point. Note that this is a negative number; @code{\partial 4} is internally -translated to mean ``there is a quarter note left in the bar''. +translated to mean @qq{there is a quarter note left in the bar.} @refbugs @@ -1746,13 +1757,31 @@ in every context, and that type is determined by the property @internalsref{systemStartDelimiter}. +@commonprop + +System start delimiters may be deeply nested, + +@lilypond[quote,ragged-right,verbatim] +\new StaffGroup +\relative << + \set StaffGroup.systemStartDelimiterHierarchy + = #'(SystemStartSquare (SystemStartBracket a (SystemStartSquare b)) d) + \new Staff { c1 } + \new Staff { c1 } + \new Staff { c1 } + \new Staff { c1 } + \new Staff { c1 } +>> +@end lilypond + + @node Staff symbol @subsection Staff symbol @cindex adjusting staff symbol Notes, dynamic signs, etc., are grouped -with a set of horizontal lines, called a staff (plural `staves'). In +with a set of horizontal lines, called a staff (plural @q{staves}). In LilyPond, these lines are drawn using a separate layout object called @code{staff symbol}. @@ -1885,7 +1914,7 @@ This section deals with notation that affects groups of notes. A tie connects two adjacent note heads of the same pitch. The tie in effect extends the length of a note. Ties should not be confused with slurs, which indicate articulation, or phrasing slurs, which indicate -musical phrasing. A tie is entered using the tilde symbol `@code{~}' +musical phrasing. A tie is entered using the tilde symbol @samp{~} @lilypond[quote,ragged-right,fragment,verbatim] e' ~ e' ~ @@ -1942,13 +1971,25 @@ notes need not be consecutive. This can be achieved by setting the @code{tieWaitForNote} property to true. The same feature is also useful, for example, to tie a tremolo to a chord. For example, -@lilypond[fragment,verbatim,relative=1,ragged-right] +@lilypond[fragment,verbatim,relative=1,ragged-right,quote] \set tieWaitForNote = ##t \grace { c16[~ e~ g]~ } 2 \repeat "tremolo" 8 { c32~ c'~ } 1 e8~ c~ a~ f~ 2 @end lilypond +Ties may be engraved manually by changing the @code{tie-configuration} +property. The first number indicates the distance from the center +of the staff in staff-spaces, and the second number indicates the +direction (1=up, -1=down). + +@lilypond[fragment,verbatim,relative=1,ragged-right,quote] +2~ | +\override TieColumn #'tie-configuration = + #'((0.0 . 1) (-2.0 . 1) (-4.0 . 1)) +~ | +@end lilypond + @refcommands @@ -2251,7 +2292,7 @@ c4 \grace c16 c4 Unlike @code{\acciaccatura} and @code{\appoggiatura}, the @code{\grace} command does not start a slur. -Internally, timing for grace notes is done using a second, `grace' +Internally, timing for grace notes is done using a second, @q{grace} timing. Every point in time consists of two rational numbers: one denotes the logical time, one denotes the grace timing. The above example is shown here with timing tuples @@ -2297,7 +2338,7 @@ following the main note. c1 \afterGrace d1 { c16[ d] } c4 @end lilypond -This will put the grace notes after a ``space'' lasting 3/4 of the +This will put the grace notes after a @q{space} lasting 3/4 of the length of the main note. The fraction 3/4 can be changed by setting @code{afterGraceFraction}, ie. @@ -3005,6 +3046,10 @@ declared within a @code{Voice} context. @node Repeat syntax @subsection Repeat syntax +@cindex volta +@cindex prima volta +@cindex seconda volta + LilyPond has one syntactic construct for specifying different types of repeats. The syntax is @@ -3046,7 +3091,7 @@ c1 In the following example, the first ending is not a complete bar (it only had 3 beats). The beginning of the second ending -contains the 4th beat from the first ending. This ``extra'' +contains the 4th beat from the first ending. This @q{extra} beat in the second ending is due to the first time ending, and has nothing to do with the @code{\partial} at the beginning of the example. @@ -3246,7 +3291,7 @@ Example files: @inputfileref{input/@/regression,chord@/-tremolo@/.ly}, @funindex tremoloFlags Tremolo marks can be printed on a single note by adding -`@code{:}[@var{number}]' after the note. The number indicates the +@q{@code{:}[@var{number}]} after the note. The number indicates the duration of the subdivision, and it must be at least 8. A @var{length} value of 8 gives one line across the note stem. If the length is omitted, the last value (stored in @code{tremoloFlags}) is diff --git a/Documentation/user/changing-defaults.itely b/Documentation/user/changing-defaults.itely index 3b681cb22d..d88bf68915 100644 --- a/Documentation/user/changing-defaults.itely +++ b/Documentation/user/changing-defaults.itely @@ -1,4 +1,12 @@ @c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Changing defaults @chapter Changing defaults @@ -6,7 +14,7 @@ The purpose of LilyPond's design is to provide the finest output quality as a default. Nevertheless, it may happen that you need to change this default layout. The layout is controlled through a large -number of proverbial ``knobs and switches.'' This chapter does not +number of proverbial @q{knobs and switches.} This chapter does not list each and every knob. Rather, it outlines what groups of controls are available and explains how to lookup which knob to use for a particular effect. @@ -25,8 +33,8 @@ Program reference manual. That manual lists all different variables, functions and options available in LilyPond. It is written as a HTML document, which is available -@uref{http://@/lilypond@/.org/@/doc/@/v2.8/@/Documentation/@/user/@/ -lilypond@/-internals/,on@/-line}, +@c leave the @uref as one long line. +@uref{http://@/lilypond@/.org/@/doc/@/stable/@/Documentation/@/user/@/lilypond@/-internals/,on@/-line}, but is also included with the LilyPond documentation package. There are four areas where the default settings may be changed: @@ -146,7 +154,7 @@ cis' c'' cis'2 | c'' c' @item @code{modern-cautionary} @funindex modern-cautionary -This rule is similar to @code{modern}, but the ``extra'' accidentals +This rule is similar to @code{modern}, but the @q{extra} accidentals (the ones not typeset by @code{default}) are typeset as cautionary accidentals. They are printed in reduced size or with parentheses @lilypond[quote,ragged-right,fragment,verbatim] @@ -184,7 +192,7 @@ accidentals typeset as cautionaries. @item no-reset @funindex no-reset accidental style This is the same as @code{default} but with accidentals lasting -``forever'' and not only until the next measure +@q{forever} and not only until the next measure @lilypond[quote,ragged-right,fragment,verbatim,relative=1] #(set-accidental-style 'no-reset) c1 cis cis c @@ -428,6 +436,7 @@ This section describes what contexts are, and how to modify them. * Layout tunings within contexts:: * Changing context default settings:: * Defining new contexts:: +* Aligning contexts:: @end menu @@ -686,7 +695,7 @@ R1*2 Contexts are hierarchical, so if a bigger context was specified, for example @context{Staff}, then the change would also apply to all @context{Voice}s in the current stave. The change is applied -`on-the-fly', during the music, so that the setting only affects the +@q{on-the-fly}, during the music, so that the setting only affects the second group of eighth notes. @funindex \unset @@ -762,7 +771,7 @@ Translation @arrow{} Tunable context properties. Notation contexts (like @code{Score} and @code{Staff}) not only store properties, -they also contain plug-ins called ``engravers'' that create notation +they also contain plug-ins called @q{engravers} that create notation elements. For example, the @code{Voice} context contains a @code{Note_head_engraver} and the @code{Staff} context contains a @code{Key_signature_engraver}. @@ -878,7 +887,7 @@ The syntax for this is Here @var{name} is the name of a graphical object, like @code{Stem} or @code{NoteHead}, and @var{property} is an internal variable of the -formatting system (`grob property' or `layout property'). The latter is a +formatting system (@q{grob property} or @q{layout property}). The latter is a symbol, so it must be quoted. The subsection @ref{Constructing a tweak} explains what to fill in for @var{name}, @var{property}, and @var{value}. Here we only discuss the functionality of this command. @@ -944,7 +953,7 @@ affects settings that were made in the same context. In other words, the \revert Staff.Stem #'thickness @end example -Some tweakable options are called ``subproperties'' and reside inside +Some tweakable options are called @q{subproperties} and reside inside properties. To tweak those, use commands of the form @c leave this as a long long @@ -1206,6 +1215,30 @@ Then the output at the start of this subsection can be entered as @end example +@node Aligning contexts +@subsection Aligning contexts + +New contexts may be aligned above or below exisiting contexts. This +could be useful in setting up a vocal staff (@ref{Vocal ensembles}) and +in ossia, + +@cindex ossia +@findex alignAboveContext +@findex alignBelowContext + +@lilypond[quote,ragged-right] +ossia = { f4 f f f } +\score{ + \relative c' \new Staff = "main" { + c4 c c c + << + \new Staff \with {alignAboveContext=main} \ossia + { d8 f d f d f d f } + >> + } +} +@end lilypond + @node The \override command @@ -1247,7 +1280,7 @@ This means that we must determine these bits of information: @item a sensible value: here @code{3.0}. @end itemize -Some tweakable options are called ``subproperties'' and reside inside +Some tweakable options are called @q{subproperties} and reside inside properties. To tweak those, use commands in the form @example @@ -1436,13 +1469,13 @@ This object supports the following interfaces: Clicking any of the links will take you to the page of the respective object interface. Each interface has a number of properties. Some of -them are not user-serviceable (``Internal properties''), but others +them are not user-serviceable (@q{Internal properties}), but others can be modified. We have been talking of @emph{the} @code{Fingering} object, but actually it does not amount to much. The initialization file (see @ref{Default files}) -@file{scm/@/define@/-grobs@/.scm} shows the soul of the `object', +@file{scm/@/define@/-grobs@/.scm} shows the soul of the @q{object}, @example (Fingering @@ -1604,7 +1637,7 @@ this. Context properties are modified with @code{\set}. There is a special type of context property: the element description. These properties are named in @code{StudlyCaps} (starting with capital letters). They contain the -``default settings'' for said graphical object as an +@q{default settings} for said graphical object as an association list. See @file{scm/@/define@/-grobs@/.scm} to see what kind of settings there are. Element descriptions may be modified with @code{\override}. diff --git a/Documentation/user/cheatsheet.itely b/Documentation/user/cheatsheet.itely index ced3e2efd0..1bef3ccfeb 100644 --- a/Documentation/user/cheatsheet.itely +++ b/Documentation/user/cheatsheet.itely @@ -1,4 +1,12 @@ @c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @c TODO: add tablature. @@ -115,7 +123,7 @@ c c, @tab @lilypond[fragment,relative=2] \set Score.timing = ##f -\override Staff.TimeSignature #'break-visibility = #all-invisible +\set Staff.implicitTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f c( d e) @end lilypond @@ -126,7 +134,7 @@ c( d e) @tab @lilypond[fragment,relative=2] \set Score.timing = ##f -\override Staff.TimeSignature #'break-visibility = #all-invisible +\set Staff.implicitTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f c\( c( d) e\) @end lilypond @@ -137,7 +145,7 @@ c\( c( d) e\) @tab @lilypond[fragment,relative=2] \set Score.timing = ##f -\override Staff.TimeSignature #'break-visibility = #all-invisible +\set Staff.implicitTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a8-[ b-] @end lilypond @@ -156,7 +164,7 @@ a8-[ b-] @tab articulations @tab @lilypond[fragment,relative=2] -\override Staff.TimeSignature #'break-visibility = #all-invisible +\set Staff.implicitTimeSignatureVisibility = #all-invisible c-> c-. @end lilypond @@ -165,7 +173,7 @@ c-> c-. @tab dynamics @tab @lilypond[fragment,relative=2] -\override Staff.TimeSignature #'break-visibility = #all-invisible +\set Staff.implicitTimeSignatureVisibility = #all-invisible c\mf c\sfz @end lilypond @@ -175,7 +183,7 @@ c\mf c\sfz @tab @lilypond[fragment,relative=2] \set Score.timing = ##f -\override Staff.TimeSignature #'break-visibility = #all-invisible +\set Staff.implicitTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a\< a a\! @end lilypond @@ -185,7 +193,7 @@ a\< a a\! @tab @lilypond[fragment,relative=2] \set Score.timing = ##f -\override Staff.TimeSignature #'break-visibility = #all-invisible +\set Staff.implicitTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a\> a a\! @end lilypond diff --git a/Documentation/user/converters.itely b/Documentation/user/converters.itely index 7ba2816ab2..35cf314b20 100644 --- a/Documentation/user/converters.itely +++ b/Documentation/user/converters.itely @@ -1,4 +1,11 @@ @c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @node Converting from other formats @chapter Converting from other formats @@ -10,11 +17,11 @@ sequencers and XML converters. Refer to the @uref{http://@/lilypond@/.org,website} for more details. These are separate programs from lilypond itself, and are run -on the command-line. By ``command-line'', we mean the command +on the command-line. By @q{command-line}, we mean the command line in the operating system. Windows users -might be more familiar with the terms ``DOS shell'' or -``command shell''; OSX users might be more familiar with the -terms ``terminal'' or ``console''. OSX users should also +might be more familiar with the terms @q{DOS shell} or +@q{command shell}; OSX users might be more familiar with the +terms @q{terminal} or @q{console}. OSX users should also consult @ref{Notes for the MacOS X app}. Describing how to use @@ -67,7 +74,7 @@ It is invoked from the command-line as follows, midi2ly [@var{option}]@dots{} @var{midi-file} @end example -Note that by ``command-line'', we mean the command line of the +Note that by @q{command-line}, we mean the command line of the operating system. See @ref{Converting from other formats} for more information about this. @@ -139,7 +146,7 @@ It is invoked from the command-line as follows. etf2ly [@var{option}]@dots{} @var{etf-file} @end example -Note that by ``command-line'', we mean the command line of the +Note that by @q{command-line}, we mean the command line of the operating system. See @ref{Converting from other formats} for more information about this. @@ -169,7 +176,7 @@ for representing music notation. @command{musicxml2ly} extracts the notes from part-wise MusicXML files, and writes it to a .ly file. It is invoked from the command-line. -Note that by ``command-line'', we mean the command line of the +Note that by @q{command-line}, we mean the command line of the operating system. See @ref{Converting from other formats} for more information about this. @@ -219,7 +226,7 @@ source file. If you say: %%LY voices \set autoBeaming = ##f @end example -This will cause the text following the keyword ``voices'' to be inserted +This will cause the text following the keyword @q{voices} to be inserted into the current voice of the LilyPond output file. Similarly, @@ -228,13 +235,13 @@ Similarly, %%LY slyrics more words @end example -will cause the text following the ``slyrics'' keyword to be inserted +will cause the text following the @q{slyrics} keyword to be inserted into the current line of lyrics. @refbugs -The ABC standard is not very ``standard''. For extended features +The ABC standard is not very @q{standard}. For extended features (e.g., polyphonic music) different conventions exist. Multiple tunes in one file cannot be converted. diff --git a/Documentation/user/dedication.itely b/Documentation/user/dedication.itely index cc5b1fc081..59cae48337 100644 --- a/Documentation/user/dedication.itely +++ b/Documentation/user/dedication.itely @@ -1,3 +1,11 @@ +@c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @quotation We want to dedicate this program to all the friends that we diff --git a/Documentation/user/fdl.itexi b/Documentation/user/fdl.itexi index a497bbae7c..46ebfc3fb5 100644 --- a/Documentation/user/fdl.itexi +++ b/Documentation/user/fdl.itexi @@ -25,7 +25,7 @@ this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. -This License is a kind of ``copyleft'', which means that derivative +This License is a kind of @q{copyleft}, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. @@ -43,15 +43,15 @@ APPLICABILITY AND DEFINITIONS This License applies to any manual or other work that contains a notice placed by the copyright holder saying it can be distributed -under the terms of this License. The ``Document'', below, refers to any +under the terms of this License. The @q{Document}, below, refers to any such manual or work. Any member of the public is a licensee, and is -addressed as ``you''. +addressed as @q{you}. -A ``Modified Version'' of the Document means any work containing the +A @q{Modified Version} of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. -A ``Secondary Section'' is a named appendix or a front-matter section of +A @q{Secondary Section} is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly @@ -62,15 +62,15 @@ connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. -The ``Invariant Sections'' are certain Secondary Sections whose titles +The @q{Invariant Sections} are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. -The ``Cover Texts'' are certain short passages of text that are listed, +The @q{Cover Texts} are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. -A ``Transparent'' copy of the Document means a machine-readable copy, +A @q{Transparent} copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, whose contents can be viewed and edited directly and straightforwardly with generic text editors or (for images composed of @@ -80,7 +80,7 @@ for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent modification by readers is not Transparent. A copy that is -not ``Transparent'' is called ``Opaque''. +not @q{Transparent} is called @q{Opaque}. Examples of suitable formats for Transparent copies include plain @sc{ascii} without markup, Texinfo input format, La@TeX{} input format, @@ -93,10 +93,10 @@ the @acronym{DTD} and/or processing tools are not generally available, and the machine-generated @acronym{HTML} produced by some word processors for output purposes only. -The ``Title Page'' means, for a printed book, the title page itself, +The @q{Title Page} means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in -formats which do not have any title page as such, ``Title Page'' means +formats which do not have any title page as such, @q{Title Page} means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. @@ -202,10 +202,10 @@ and required Cover Texts given in the Document's license notice. Include an unaltered copy of this License. @item -Preserve the section entitled ``History'', and its title, and add to +Preserve the section entitled @q{History}, and its title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If -there is no section entitled ``History'' in the Document, create one +there is no section entitled @q{History} in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. @@ -214,13 +214,13 @@ Version as stated in the previous sentence. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions -it was based on. These may be placed in the ``History'' section. +it was based on. These may be placed in the @q{History} section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. @item -In any section entitled ``Acknowledgments'' or ``Dedications'', +In any section entitled @q{Acknowledgments} or @q{Dedications}, preserve the section's title, and preserve in the section all the substance and tone of each of the contributor acknowledgments and/or dedications given therein. @@ -231,11 +231,11 @@ unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. @item -Delete any section entitled ``Endorsements''. Such a section +Delete any section entitled @q{Endorsements}. Such a section may not be included in the Modified Version. @item -Do not retitle any existing section as ``Endorsements'' +Do not retitle any existing section as @q{Endorsements} or to conflict in title with any Invariant Section. @end enumerate @@ -246,7 +246,7 @@ of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. -You may add a section entitled ``Endorsements'', provided it contains +You may add a section entitled @q{Endorsements}, provided it contains nothing but endorsements of your Modified Version by various parties---for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a @@ -285,11 +285,11 @@ author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. -In the combination, you must combine any sections entitled ``History'' +In the combination, you must combine any sections entitled @q{History} in the various original documents, forming one section entitled -``History''; likewise combine any sections entitled ``Acknowledgments'', -and any sections entitled ``Dedications''. You must delete all sections -entitled ``Endorsements.'' +@q{History}; likewise combine any sections entitled @q{Acknowledgments}, +and any sections entitled @q{Dedications}. You must delete all sections +entitled @q{Endorsements.} @item COLLECTIONS OF DOCUMENTS @@ -312,7 +312,7 @@ A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modified Version of the Document, provided no compilation copyright is claimed for the -compilation. Such a compilation is called an ``aggregate'', and this +compilation. Such a compilation is called an @q{aggregate}, and this License does not apply to the other self-contained works thus compiled with the Document, on account of their being thus compiled, if they are not themselves derivative works of the Document. @@ -359,7 +359,7 @@ differ in detail to address new problems or concerns. See Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this -License ``or any later version'' applies to it, you have the option of +License @q{or any later version} applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version @@ -382,15 +382,15 @@ license notices just after the title page: or any later version published by the Free Software Foundation; with the Invariant Sections being @var{list their titles}, with the Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. - A copy of the license is included in the section entitled ``GNU - Free Documentation License''. + A copy of the license is included in the section entitled @q{GNU + Free Documentation License}. @end group @end smallexample -If you have no Invariant Sections, write ``with no Invariant Sections'' +If you have no Invariant Sections, write @q{with no Invariant Sections} instead of saying which ones are invariant. If you have no -Front-Cover Texts, write ``no Front-Cover Texts'' instead of -``Front-Cover Texts being @var{list}''; likewise for Back-Cover Texts. +Front-Cover Texts, write @q{no Front-Cover Texts} instead of +@q{Front-Cover Texts being @var{list}}; likewise for Back-Cover Texts. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of diff --git a/Documentation/user/instrument-notation.itely b/Documentation/user/instrument-notation.itely index e7e1b1aa89..6685470527 100644 --- a/Documentation/user/instrument-notation.itely +++ b/Documentation/user/instrument-notation.itely @@ -1,5 +1,12 @@ @c -*- coding: utf-8; mode: texinfo; -*- @c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @c A menu is needed before every deeper *section nesting of @node's; run @c M-x texinfo-all-menus-update @@ -44,7 +51,7 @@ handle this cross-staffing behavior. In this section we discuss the @refbugs Dynamics are not centered, but workarounds do exist. See the -``piano centered dynamics'' template in @ref{Piano templates}. +@q{piano centered dynamics} template in @ref{Piano templates}. @cindex cross staff stem @cindex stem, cross staff @@ -197,7 +204,7 @@ b\sustainUp\sustainDown b g \sustainUp a \sustainDown \bar "|." @end lilypond -The default `*Ped.' style for sustain and damper pedals corresponds to +The default @q{*Ped.} style for sustain and damper pedals corresponds to style @code{#'text}. The sostenuto pedal uses @code{mixed} style by default. @@ -356,7 +363,7 @@ modifier (which may include a number if desired) @lilypond[quote,fragment,verbatim] \chordmode { e1:m e1:7 e1:m7 } @end lilypond -The first number following the root is taken to be the `type' of the +The first number following the root is taken to be the @q{type} of the chord, thirds are added to the root until it reaches the specified number @lilypond[quote,fragment,verbatim] @@ -580,7 +587,7 @@ separators, e.g., @item chordRootNamer The root of a chord is usually printed as a letter with an optional alteration. The transformation from pitch to letter is done by this -function. Special note names (for example, the German ``H'' for a +function. Special note names (for example, the German @q{H} for a B-chord) can be produced by storing a new function in this property. @funindex chordNoteNamer @@ -592,9 +599,9 @@ base can be printed in lower case. @funindex chordPrefixSpacer @item chordPrefixSpacer -The ``m'' for minor chords is usually printed right after the root of +The @q{m} for minor chords is usually printed right after the root of the chord. By setting @code{chordPrefixSpacer}, you can fix a spacer -between the root and ``m''. The spacer is not used when the root +between the root and @q{m}. The spacer is not used when the root is altered. @end table @@ -673,7 +680,7 @@ way is to use the @code{\addlyrics} function. @menu * Setting simple songs:: * Entering lyrics:: -* Hyphens and extenders:: +* Hyphens and extenders:: * The Lyrics context:: * Melismata:: * Another way of entering lyrics:: @@ -801,7 +808,7 @@ between syllables, or use tilde symbol (@code{~}) to get a lyric tie. \relative { c2 e4 g2 e4 } \addlyrics { gran- de_a- mi- go } \addlyrics { pu- "ro y ho-" nes- to } -\addlyrics { pu- ro~yho- nes- to } +\addlyrics { pu- ro~y~ho- nes- to } @end lilypond The lyric ties is implemented with the Unicode character U+203F, so be @@ -866,7 +873,7 @@ Program reference: @internalsref{LyricText}, @internalsref{LyricSpace}. @cindex hyphens -Centered hyphens are entered as `@code{--}' between syllables. +Centered hyphens are entered as @samp{--} between syllables. The hyphen will have variable length depending on the space between the syllables and it will be centered between the syllables. @@ -876,7 +883,7 @@ the syllables and it will be centered between the syllables. When a lyric is sung over many notes (this is called a melisma), this is indicated with a horizontal line centered between a syllable and the next one. Such a line is called an extender line, and it is entered as -`@code{__}'. +@samp{__}. In tighly engraved music, hyphens can be removed. Whether this happens can be controlled with the @code{minimum-distance} (minimum @@ -1134,8 +1141,8 @@ in the text, as shown here, @end lilypond -The @code{ignoreMelismata} applies to the syllable ``fas'', so it -should be entered before ``go''. +The @code{ignoreMelismata} applies to the syllable @q{fas}, so it +should be entered before @q{go}. The reverse is also possible: making a lyric line slower than the standard. This can be achieved by insert @code{\skip}s into the @@ -1241,7 +1248,7 @@ done by setting the @code{associatedVoice} property. In the example @end lilypond @noindent -the text for the first stanza is set to a melody called ``lahlah'', +the text for the first stanza is set to a melody called @q{lahlah}, @example \new Lyrics \lyricsto "lahlah" @{ @@ -1251,7 +1258,7 @@ the text for the first stanza is set to a melody called ``lahlah'', The second stanza initially is set to the @code{lahlah} context, but -for the syllable ``ran'', it switches to a different melody. +for the syllable @q{ran}, it switches to a different melody. This is achieved with @example \set associatedVoice = alternative @@ -1261,7 +1268,7 @@ This is achieved with Here, @code{alternative} is the name of the @code{Voice} context containing the triplet. -Again, the command must be one syllable too early, before ``Ty'' in +Again, the command must be one syllable too early, before @q{Ty} in this case. @example @@ -1374,12 +1381,11 @@ layout. @node More about stanzas @subsection More about stanzas +@c what's this doing here? @cindex phrasing, in lyrics - @cindex stanza number -@cindex singer's names -@cindex name of singer +@subsubsection Adding stanza numbers Stanza numbers can be added by setting @code{stanza}, e.g., @@ -1395,7 +1401,57 @@ Stanza numbers can be added by setting @code{stanza}, e.g., } @end lilypond -These numbers are put just before the start of first syllable. +@noindent +These numbers are put just before the start of the first syllable. + + +@subsubsection Adding dynamics marks + +Stanzas differing in loudness may be indicated by putting a +dynamics mark before each stanza. In Lilypond, everthing coming in +front of a stanza goes into the @code{StanzaNumber} object; dynamics marks +are no different. For technical reasons, you have to set the stanza +outside @code{\lyricmode}: + +@lilypond[quote,ragged-right,verbatim] +text = { + \set stanza = \markup { \dynamic "ff" "1. " } + \lyricmode { + Big bang + } +} + +<< + \new Voice = "tune" { + \time 3/4 + g'4 c'2 + } +\new Lyrics \lyricsto "tune" \text +>> +@end lilypond + +@cindex singer name +@cindex name of singer +@subsubsection Adding singer names + +Names of singers can also be added. They are printed at the start of +the line, just like instrument names. They are created by setting +@code{vocalName}. A short version may be entered as @code{shortVocalName}. + +@lilypond[fragment,ragged-right,quote,verbatim,relative=2] +\new Voice { + \time 3/4 g2 e4 a2 f4 g2. +} \addlyrics { + \set vocalName = "Bert " + Hi, my name is Bert. +} \addlyrics { + \set vocalName = "Ernie " + Oh, che -- ri, je t'aime +} +@end lilypond + + +@subsubsection Printing stanzas at the end Sometimes it is appropriate to have one stanza set to the music, and the rest added in verse form at @@ -1441,23 +1497,7 @@ its fleece was white as snow. @end lilypond -Names of singers can also be added. They are printed at the start of -the line, just like instrument names. They are created by setting -@code{vocalName}. A short version may be entered as @code{shortVocalName}. - - -@lilypond[fragment,ragged-right,quote,verbatim,relative=2] -\new Voice { - \time 3/4 g2 e4 a2 f4 g2. -} \addlyrics { - \set vocalName = "Bert " - Hi, my name is Bert. -} \addlyrics { - \set vocalName = "Ernie " - Oh, che -- ri, je t'aime -} -@end lilypond - +@subsubsection Printing stanzas at the end in multiple columns When a piece of music has many verses, they are often printed in multiple columns across the page. An outdented verse number often @@ -1636,7 +1676,7 @@ can ask them for specific instructions about where to move these examples, and that might get them more involved in the docs. -gp @end ignore -``Parlato'' is spoken without pitch but still with rhythm; it is +@q{Parlato} is spoken without pitch but still with rhythm; it is notated by cross noteheads. This is demonstrated in @ref{Special noteheads}. @@ -2526,9 +2566,9 @@ overview over all available note head styles. @cindex accidentals -Use the @code{style} property of grob @internalsref{Accidental} to -select ancient accidentals. Supported styles are -@code{mensural}, @code{vaticana}, @code{hufnagel}, and @code{medicaea}. +Use the @code{glyph-name-alist} property of grob +@internalsref{Accidental} and @internalsref{KeySignature} to select +ancient accidentals. @lilypond[quote,ragged-right,staffsize=26] \score { @@ -2575,7 +2615,7 @@ different style, as demonstrated in @inputfileref{input/@/test,ancient@/-accidentals@/.ly}. Similarly to local accidentals, the style of the key signature can be -controlled by the @code{style} property of the +controlled by the @code{glyph-name-alist} property of the @internalsref{KeySignature} grob. @seealso @@ -2841,16 +2881,16 @@ historic style hufnagel combined do/fa clef -@emph{Modern style} means ``as is typeset in contemporary editions of -transcribed mensural music''. +@emph{Modern style} means @qq{as is typeset in contemporary editions of +transcribed mensural music.} -@emph{Petrucci style} means ``inspired by printings published by the -famous engraver Petrucci (1466-1539)''. +@emph{Petrucci style} means @qq{inspired by printings published by the +famous engraver Petrucci (1466-1539).} -@emph{Historic style} means ``as was typeset or written in historic -editions (other than those of Petrucci)''. +@emph{Historic style} means @qq{as was typeset or written in historic +editions (other than those of Petrucci).} -@emph{Editio XXX style} means ``as is/was printed in Editio XXX''. +@emph{Editio XXX style} means @qq{as is/was printed in Editio XXX.} Petrucci used C clefs with differently balanced left-side vertical beams, depending on which staff line it is printed. @@ -3056,7 +3096,7 @@ the right end of the episem line is often too far to the right. @cindex custos @cindex custodes -A @emph{custos} (plural: @emph{custodes}; Latin word for `guard') is a +A @emph{custos} (plural: @emph{custodes}; Latin word for @q{guard}) is a symbol that appears at the end of a staff. It anticipates the pitch of the first note(s) of the following line thus helping the performer to manage line breaks during performance. @@ -3137,7 +3177,7 @@ Examples: @inputfileref{input/@/regression,custos@/.ly}. @cindex finalis A @emph{divisio} (plural: @emph{divisiones}; Latin word for -`division') is a staff context symbol that is used to structure +@q{division}) is a staff context symbol that is used to structure Gregorian music into phrases and sections. The musical meaning of @emph{divisio minima}, @emph{divisio maior}, and @emph{divisio maxima} can be characterized as short, medium, and long pause, somewhat like @@ -4353,7 +4393,7 @@ entering the chant, as the following excerpt demonstrates In European music from before about 1600, singers were often expected to chromatically alter notes at their own initiative. This is called -``Musica Ficta''. In modern transcriptions, these accidentals are +@q{Musica Ficta}. In modern transcriptions, these accidentals are usually printed over the note. @cindex Accidental, musica ficta diff --git a/Documentation/user/introduction.itely b/Documentation/user/introduction.itely index 2ac91d0867..101772c95d 100644 --- a/Documentation/user/introduction.itely +++ b/Documentation/user/introduction.itely @@ -1,5 +1,11 @@ @c -*- coding: utf-8; mode: texinfo; -*- @c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @node Introduction @chapter Introduction @@ -104,10 +110,10 @@ LilyPond Feta font (2003) @c introduce illustrating aspects of engraving, spacing... In spacing, the distribution of space should reflect the durations between notes. However, many modern scores adhere to the durations -with mathematical precision, which leads to poor results. In the -next example a motive is printed twice. It is printed once using -exact mathematical spacing, and once with corrections. Can you -spot which fragment is which? +with mathematical precision, which leads to poor results. In the next +example a motive is printed twice: once using exact mathematical +spacing, and once with corrections. Can you spot which fragment is +which? @cindex optical spacing @c file spacing-optical. @@ -168,42 +174,42 @@ music = { @cindex regular rhythms @cindex regular spacing -Each bar in the fragment only uses notes that are played in a -constant rhythm. The spacing should reflect that. Unfortunately, the -eye deceives us a little; not only does it notice the distance between +Each bar in the fragment only uses notes that are played in a constant +rhythm. The spacing should reflect that. Unfortunately, the eye +deceives us a little; not only does it notice the distance between note heads, it also takes into account the distance between consecutive stems. As a result, the notes of an up-stem/@/down-stem combination should be put farther apart, and the notes of a -down-stem/@/up-stem -combination should be put closer together, all depending on the -combined vertical positions of the notes. The upper two measures are -printed with this correction, the lower two measures without, forming -down-stem/@/up-stem clumps of notes. +down-stem/@/up-stem combination should be put closer together, all +depending on the combined vertical positions of the notes. The upper +two measures are printed with this correction, the lower two measures +without, forming down-stem/@/up-stem clumps of notes. @cindex typography Musicians are usually more absorbed with performing than with studying -the looks of a piece of music, so nitpicking about typographical details -may seem academical. But it is not. In larger pieces with monotonous -rhythms, spacing corrections lead to subtle variations in the layout -of every line, giving each one a distinct visual signature. Without -this signature all lines would look the same, and they become like a -labyrinth. If a musician looks away once or has a lapse in +the looks of a piece of music, so nitpicking about typographical +details may seem academical. But it is not. In larger pieces with +monotonous rhythms, spacing corrections lead to subtle variations in +the layout of every line, giving each one a distinct visual signature. +Without this signature all lines would look the same, and they become +like a labyrinth. If a musician looks away once or has a lapse in concentration, the lines might lose their place on the page. Similarly, the strong visual look of bold symbols on heavy staff lines -stands out better when the music is far away from the reader, for example, -if it is on a music stand. A careful distribution of white space allows -music to be set very tightly without cluttering symbols together. The -result minimizes the number of page turns, which is a great advantage. +stands out better when the music is far away from the reader, for +example, if it is on a music stand. A careful distribution of white +space allows music to be set very tightly without cluttering symbols +together. The result minimizes the number of page turns, which is a +great advantage. This is a common characteristic of typography. Layout should be pretty, not only for its own sake, but especially because it helps the -reader in her task. For performance material like sheet music, this is -of double importance: musicians have a limited amount of attention. The -less attention they need for reading, the more they can focus on -playing the music. In other words, better typography translates to better -performances. +reader in her task. For performance material like sheet music, this +is of double importance: musicians have a limited amount of attention. +The less attention they need for reading, the more they can focus on +playing the music. In other words, better typography translates to +better performances. These examples demonstrate that music typography is an art that is subtle and complex, and that producing it requires considerable @@ -311,8 +317,8 @@ Formatting rules are also preset variables: each object has variables containing procedures. These procedures perform the actual formatting, and by substituting different ones, we can change the appearance of objects. In the following example, the rule which note -head objects are used to produce their symbol is changed during the music -fragment. +head objects are used to produce their symbol is changed during the +music fragment. @lilypond[quote,ragged-right] #(set-global-staff-size 30) @@ -361,17 +367,17 @@ fragment. @cindex engraving @cindex typography -The formatting process decides where to place -symbols. However, this can only be done once it is decided @emph{what} -symbols should be printed, in other words what notation to use. +The formatting process decides where to place symbols. However, this +can only be done once it is decided @emph{what} symbols should be +printed, in other words what notation to use. Common music notation is a system of recording music that has evolved over the past 1000 years. The form that is now in common use dates -from the early renaissance. Although the basic form (i.e., note heads on a -5-line staff) has not changed, the details still evolve to express the -innovations of contemporary notation. Hence, it encompasses some 500 -years of music. Its applications range from monophonic melodies to -monstrous counterpoints for large orchestras. +from the early renaissance. Although the basic form (i.e., note heads +on a 5-line staff) has not changed, the details still evolve to +express the innovations of contemporary notation. Hence, it +encompasses some 500 years of music. Its applications range from +monophonic melodies to monstrous counterpoints for large orchestras. How can we get a grip on such a many-headed beast, and force it into the confines of a computer program? Our solution is to break up the @@ -379,8 +385,8 @@ problem of notation (as opposed to engraving, i.e., typography) into digestible and programmable chunks: every type of symbol is handled by a separate module, a so-called plug-in. Each plug-in is completely modular and independent, so each can be developed and improved -separately. Such plug-ins are called @code{engraver}s, by analogy with -craftsmen who translate musical ideas to graphic symbols. +separately. Such plug-ins are called @code{engraver}s, by analogy +with craftsmen who translate musical ideas to graphic symbols. In the following example, we see how we start out with a plug-in for note heads, the @code{Note_heads_engraver}. @@ -526,8 +532,8 @@ polyphony? In polyphonic notation, many voices can share a staff. In this situation, the accidentals and staff are shared, but the stems, slurs, beams, etc., are private to each voice. Hence, engravers should be grouped. The engravers for note heads, stems, slurs, etc., go into a -group called `Voice context,' while the engravers for key, accidental, -bar, etc., go into a group called `Staff context.' In the case of +group called @q{Voice context,} while the engravers for key, accidental, +bar, etc., go into a group called @q{Staff context.} In the case of polyphony, a single Staff context contains more than one Voice context. Similarly, multiple Staff contexts can be put into a single Score context. The Score context is the top level notation context. @@ -674,7 +680,7 @@ presentations. This manual also shows an application: the input format is text, and can therefore be easily embedded in other text-based formats such as -La@TeX{}, HTML, or in the case of this manual, Texinfo. By means of a +@LaTeX{}, HTML, or in the case of this manual, Texinfo. By means of a special program, the input fragments can be replaced by music images in the resulting PDF or HTML output files. This makes it easy to mix music and text in documents. @@ -695,15 +701,20 @@ The gives a gentle introduction to typesetting music. First time users should start here. +@item +@emph{@ref{Putting it all together}} +explains some general concepts about the lilypond file format. If +you are not certain where to place a command, read this chapter! + @item @emph{@ref{Working on LilyPond projects}} -demonstrates practical uses of LilyPond. +discusses practical uses of LilyPond and how to avoid some common +problems. @item -@emph{@ref{Running LilyPond}} -shows how to run LilyPond and its helper -programs. In addition, this section explains how to upgrade input -files from previous versions of LilyPond. +@emph{@ref{Tweaking output}} +shows how to change the default engraving that LilyPond +produces. @item @emph{@ref{Basic notation}} @@ -736,14 +747,24 @@ and how to select which MIDI instruments to use. discusses issues which affect the global output, such as selecting paper size or specifying page breaks. +@item +@emph{@ref{Interfaces for programmers}} +explains how to create music functions. + +@item +@emph{@ref{Running LilyPond}} +shows how to run LilyPond and its helper programs. In addition, this +section explains how to upgrade input files from previous versions of +LilyPond. + @item @emph{@ref{LilyPond-book}} explains the details behind creating documents with in-line music examples, like this manual. @item @emph{@ref{Converting from other formats}} -explains how to run the conversion programs. These programs -are supplied with the LilyPond package, and convert a variety of music +explains how to run the conversion programs. These programs are +supplied with the LilyPond package, and convert a variety of music formats to the @code{.ly} format. @item @@ -755,10 +776,36 @@ contains a set of useful reference books for those who wish to know more on notation and engraving. @item -@emph{@ref{Example templates}} -provides templates of LilyPond pieces. Just cut and paste a +The +@emph{@ref{Scheme tutorial}} +presents a short introduction to Scheme, the programming +language that music functions use. + +@item +@emph{@ref{Notation manual tables}} +are a set of tables showing the chord names, MIDI instruments, +a list of color names, and the Feta font. + +@item +@emph{@ref{Templates}} +of LilyPond pieces. Just cut and paste a template into a file, add notes, and you're done! +@item +The +@emph{@ref{Cheat sheet}} +is a handy reference of the most common LilyPond commands. + +@item +The +@emph{@ref{LilyPond command index}} +is an index of all LilyPond @code{\commands}. + +@item +The +@emph{@ref{LilyPond index}} +is a complete index. + @end itemize @@ -822,10 +869,10 @@ Almost all formatting functionality that is used internally, is available directly to the user. For example, all variables that control thickness values, distances, etc., can be changed in input files. There are a huge number of formatting options, and all of them -are described in this document. Each section of the -notation manual has a @b{See also} subsection, which refers to the -generated documentation. In the HTML document, these subsections -have clickable links. +are described in this document. Each section of the notation manual +has a @b{See also} subsection, which refers to the generated +documentation. In the HTML document, these subsections have clickable +links. @cindex snippets @item @@ -868,7 +915,7 @@ vary from system to system. On occasion, this manual refers to initialization and example files. Throughout this manual, we refer to input files relative to the top-directory of the source archive. For example, @file{input/@/test/@/bla@/.ly} may refer to the file -@file{lilypond@/-2.8.0/@/input/@/test/@/bla@/.ly}. On binary packages +@file{lilypond@/2.x.y/@/input/@/test/@/bla@/.ly}. On binary packages for the Unix platform, the documentation and examples can typically be found somewhere below @file{/usr/@/share/@/doc/@/lilypond/}. Initialization files, for example @file{scm/@/lily@/.scm}, or diff --git a/Documentation/user/lilypond-book.itely b/Documentation/user/lilypond-book.itely index 9bb00d3fa5..543a4cdd42 100644 --- a/Documentation/user/lilypond-book.itely +++ b/Documentation/user/lilypond-book.itely @@ -1,4 +1,11 @@ -c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @ignore @@ -35,11 +42,12 @@ This procedure may be applied to La@TeX{}, HTML, Texinfo or DocBook documents. * Integrating LaTeX and music:: * Integrating Texinfo and music:: * Integrating HTML and music:: -* Integrating DocBook and music:: +* Integrating DocBook and music:: * Music fragment options:: * Invoking lilypond-book:: * Filename extensions:: * Many quotes of a large score:: +* Inserting LilyPond output into OpenOffice.org:: * Inserting LilyPond output into other programs:: @end menu @@ -538,7 +546,7 @@ For HTML (HTML Help, JavaHelp etc.) generation you can use the official DocBook @node Music fragment options @section Music fragment options -In the following, a ``LilyPond command'' refers to any command described +In the following, a @q{LilyPond command} refers to any command described in the previous sections which is handled by @command{lilypond-book} to produce a music snippet. For simplicity, LilyPond commands are only shown in La@TeX{} syntax. @@ -610,7 +618,7 @@ LilyPond, not the text layout. Since no indentation is the default, @item quote Reduce line length of a music snippet by @math{2*0.4}@dmn{in} and put -the output into a quotation block. The value `0.4@dmn{in}' can be +the output into a quotation block. The value @q{0.4@dmn{in}} can be controlled with the @code{exampleindent} option. @item exampleindent @@ -775,6 +783,17 @@ cd out ... @end example +@itemx --padding=@var{amount} +Pad EPS boxes by this much. @var{amount} is measured in milimeters, +and is 3.0 by default. This option should be used if the lines of +music stick out of the right margin. + +The width of a tightly clipped systems can vary, due to notation +elements that stick into the left margin, such as bar numbers and +instrument names. This option will shorten each line and move each +line to the right by the same amount. + + @item -P @var{process} @itemx --process=@var{command} Process LilyPond snippets using @var{command}. The default command is @@ -829,12 +848,23 @@ output format based on the input filename's extension. @end multitable @end quotation + @node Many quotes of a large score @section Many quotes of a large score If you need to quote many fragments of a large score, you can also use the clip systems feature, see @ref{Extracting fragments of notation}. + +@node Inserting LilyPond output into OpenOffice.org +@section Inserting LilyPond output into OpenOffice.org + +@cindex OpenOffice.org + +LilyPond notation can be added to OpenOffice.org with +@uref{http://@/ooolilypond@/.sourceforge@/.net@/,OOoLilyPond} + + @node Inserting LilyPond output into other programs @section Inserting LilyPond output into other programs diff --git a/Documentation/user/lilypond.tely b/Documentation/user/lilypond.tely index 2b0b3091e4..7e5f049185 100644 --- a/Documentation/user/lilypond.tely +++ b/Documentation/user/lilypond.tely @@ -1,4 +1,10 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; -*- +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @setfilename lilypond.info @settitle GNU LilyPond @iftex @@ -178,7 +184,7 @@ Appendices * Literature list:: Reference works about music notation. * Scheme tutorial:: Programming inside LilyPond. * Notation manual tables:: Tables and charts. -* Example templates:: Ready-made templates. +* Templates:: Ready-made templates. * Cheat sheet:: Summary of LilyPond syntax. * GNU Free Documentation License:: License of this document. * LilyPond command index:: diff --git a/Documentation/user/literature.itely b/Documentation/user/literature.itely index 2e7f3f7c2c..9501d7949d 100644 --- a/Documentation/user/literature.itely +++ b/Documentation/user/literature.itely @@ -1,3 +1,12 @@ +@c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Literature list @appendix Literature list diff --git a/Documentation/user/macros.itexi b/Documentation/user/macros.itexi index 68b52bb513..0274641da2 100644 --- a/Documentation/user/macros.itexi +++ b/Documentation/user/macros.itexi @@ -70,6 +70,20 @@ @ref{\NAME\,,,music-glossary} @end macro +@c to get decent quotes in `foo' +@macro q{TEXT} +@html +‘\TEXT\’ +@end html +@end macro + +@c to get decent quotes in ``foo'' +@macro qq{TEXT} +@html +“\TEXT\” +@end html +@end macro + @end ifhtml @@ -90,6 +104,20 @@ @ref{\NAME\,,,music-glossary} @end macro +@c to get decent quotes in `foo' +@macro q{TEXT} +@xml +‘\TEXT\’ +@end xml +@end macro + +@c to get decent quotes in ``foo'' +@macro qq{TEXT} +@xml +“\TEXT\” +@end xml +@end macro + @end ifdocbook @@ -114,6 +142,16 @@ @inforef{\NAME\} @end macro +@c to get decent quotes in `foo' +@macro q{TEXT} +`\TEXT\' +@end macro + +@c to get decent quotes in ``foo'' +@macro qq{TEXT} +``\TEXT\'' +@end macro + @end ifinfo @@ -142,8 +180,19 @@ internals document, @internalsref{\NAME\} user manual, @internalsref{\NAME\} @end macro +@c to get decent quotes in `foo' +@macro q{TEXT} +`\TEXT\' +@end macro + +@c to get decent quotes in ``foo'' +@macro qq{TEXT} +``\TEXT\'' +@end macro + @end iftex + @ifnottex @c **** not TEX **** @@ -168,6 +217,11 @@ user manual, @internalsref{\NAME\} @end macro +@macro moreinfo +@subheading More information + +@end macro + @macro seealso @noindent @subsubheading See also @@ -201,4 +255,4 @@ user manual, @internalsref{\NAME\} @kindex \WORD\ @end macro - +@c EOF diff --git a/Documentation/user/music-glossary.tely b/Documentation/user/music-glossary.tely index 55e07d2b2a..97d118294b 100644 --- a/Documentation/user/music-glossary.tely +++ b/Documentation/user/music-glossary.tely @@ -150,10 +150,12 @@ Languages in this order. * alto:: * alto clef:: * ambit:: +* anacrusis:: * ancient minor scale:: * andante:: * appoggiatura:: * arpeggio:: +* articulation:: * ascending interval:: * augmented interval:: * autograph:: @@ -576,6 +578,15 @@ The term ambit (from latin: ambitus, plural: ambitus) denotes a range of pitches for a given voice in a part of music. It may also denote the pitch range that a musical instrument is capable of playing. +@node anacrusis +@section anacrusis + +@c TODO: add more languages for anacrusis +F: anacrouse + +An anacrusis (also known as pickup or upbeat) is an incomplete measure +of music before a section of music. + @node ancient minor scale @section ancient minor scale @@ -701,6 +712,15 @@ FI: arpeggio, murtosointu. >> @end lilypond +@node articulation +@section articulation + +@c TODO: add languages for articulation. +Articulation refers to notation which indicates how a note or notes should +be played. Slurs, accents, staccato, and legato are all examples of +articulartion. + + @node ascending interval @section ascending interval @@ -1348,6 +1368,7 @@ music of the baroque era, has been one of the most popular polyphonic composition methods. @lilypond[fragment,staffsize=12,line-width=13.0\cm] +\set Score.implicitTimeSignatureVisibility = #all-invisible \override Score.TimeSignature #'break-visibility = #all-invisible \context PianoStaff << \context Staff = SA \relative c' { @@ -1419,7 +1440,7 @@ S: crescendo, FI: cresendo, voimistuen. Increasing volume. Indicated by a rightwards opening horizontal wedge or the -abbreviation ``cresc.''. +abbreviation @q{cresc.}. @lilypond[fragment,ragged-right] \key g \major \time 4/4 @@ -1501,7 +1522,7 @@ S: da capo, FI: da capo, alusta. The term indicates repetition of the piece from the beginning to the end or -to a certain place marked @emph{fine}. Mostly abbreviated as ``D.C.''. +to a certain place marked @emph{fine}. Mostly abbreviated as @q{D.C.}. @node dal segno @section dal segno @@ -1515,7 +1536,7 @@ DK: dal segno, S: dal segno, FI: dal segno, lähtien merkistä. -Abbreviated ``d.s.''. Repetition, not from the beginning, but from +Abbreviated @q{d.s.}. Repetition, not from the beginning, but from another place frequently near the beginning marked by a sign: @lilypond[fragment,ragged-right] @@ -1543,7 +1564,7 @@ S: decrescendo, FI: decresendo, hiljentyen. Decreasing tone volume. Indicated by a leftwards opening horizontal wedge -or the abbreviation ``decresc.''. +or the abbreviation @q{decresc.}. @lilypond[fragment,ragged-right] \relative c'' { @@ -2809,7 +2830,7 @@ S: ledton, FI: johtosävel. The seventh @aref{scale degree}, a @aref{semitone} below -the tonic; so called because of its strong tendency to ``lead up'' (resolve +the tonic; so called because of its strong tendency to @q{lead up} (resolve upwards) to the tonic scale degree. @node ledger line @@ -3270,8 +3291,8 @@ subject. @lilypond[line-width=13.0\cm] \score{ \relative c'' { + \set Score.implicitTimeSignatureVisibility = #all-invisible \override Score.TimeSignature #'break-visibility = #all-invisible - %\override Score.TextScript #'font-style = #'large \time 4/4 \key g \major \partial 8 g16\startGroup fis | @@ -4233,7 +4254,7 @@ A form used frequently for single movements of the @aref{sonata}, falls into three sections called @emph{exposition}, @emph{development} and @emph{recapitulation}. In the exposition the composer introduces some musical ideas, consisting of a number of themes; in the development section the -composer `develops' this material, and in the recapitulation the composer +composer @q{develops} this material, and in the recapitulation the composer repeats the exposition, with certain modifications. The exposition contains a number of themes that fall into two groups, often called first and second subject. Other melodies occurring in each group are considered as diff --git a/Documentation/user/non-music.itely b/Documentation/user/non-music.itely index 9fb163d7c0..f167c6cb22 100644 --- a/Documentation/user/non-music.itely +++ b/Documentation/user/non-music.itely @@ -1,5 +1,11 @@ @c -*- coding: utf-8; mode: texinfo; -*- @c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @c A menu is needed before every deeper *section nesting of @node's; run @c M-x texinfo-all-menus-update @@ -24,7 +30,7 @@ specific notation. @section Input files The main format of input for LilyPond are text files. By convention, -these files end with ``@code{.ly}''. +these files end with @samp{.ly}. @menu * File structure (introduction):: @@ -277,6 +283,9 @@ A markup text, a verse for example Markup texts are rendered above, between or below the scores or music expressions, wherever they appear. +@cindex variables +@cindex identifiers + @item An identifier, such as @example @@ -378,7 +387,7 @@ file, use The line @code{\include "file.ly"} is equivalent to pasting the contents of file.ly into the current file at the place where you have the \include. For example, for a large project you might write separate files -for each instrument part and create a ``full score'' file which brings +for each instrument part and create a @q{full score} file which brings together the individual instrument files. The initialization of LilyPond is done in a number of files that are @@ -387,7 +396,7 @@ user. Run lilypond --verbose to see a list of paths and files that Lily finds. Files placed in directory @file{PATH/TO/share/lilypond/VERSION/ly/} (where -VERSION is in the form ``2.6.1'') are on the path and available to +VERSION is in the form @q{2.6.1}) are on the path and available to @code{\include}. Files in the current working directory are available to \include, but a file of the same name in LilyPond's installation takes precedence. Files are @@ -646,7 +655,7 @@ You may change this behavior (and print all the headers when defining The default footer is empty, except for the first page, where the @code{copyright} field from @code{\header} is inserted, and the last page, where @code{tagline} from @code{\header} is added. The default -tagline is ``Music engraving by LilyPond (@var{version})''.@footnote{Nicely +tagline is @qq{Music engraving by LilyPond (@var{version})}.@footnote{Nicely printed parts are good PR for us, so please leave the tagline if you can.} @@ -780,9 +789,20 @@ to a score, for example, @} @end example -The tempo is specified using the @code{\tempo} command. In this -example the tempo of quarter notes is set to 72 beats per minute. +The tempo can be specified using the @code{\tempo} command within the +actual music, see @ref{Metronome marks}. An alternative, which does not +result in a metronome mark in the printed score, is shown in the example +above. In this example the tempo of quarter notes is set to 72 beats per +minute. +This kind of tempo +specification can not take dotted note lengths as an argument. In this +case, break the dotted notes into smaller units. For example, a tempo +of 90 dotted quarter notes per minute can be specified as 270 eighth +notes per minute +@example +tempoWholesPerMinute = #(ly:make-moment 270 8) +@end example If there is a @code{\midi} command in a @code{\score}, only MIDI will be produced. When notation is needed too, a @code{\layout} block must @@ -824,7 +844,6 @@ in the @code{\midi@{@}} section. \context @{ \Voice \remove "Dynamic_performer" - \remove "Span_dynamic_performer" @} @} @end example diff --git a/Documentation/user/notation-appendices.itely b/Documentation/user/notation-appendices.itely index 32afbd6f1b..865cfd72b8 100644 --- a/Documentation/user/notation-appendices.itely +++ b/Documentation/user/notation-appendices.itely @@ -1,5 +1,11 @@ @c -*- coding: utf-8; mode: texinfo; -*- @c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @node Notation manual tables @appendix Notation manual tables @@ -97,12 +103,12 @@ darkcyan darkmagenta darkyellow X color names come several variants: Any name that is spelled as a single word with capitalisation -(e.g. ``LightSlateBlue'') can also be spelled as space separated -words without capitalisation (e.g. ``light slate blue''). +(e.g. @q{LightSlateBlue}) can also be spelled as space separated +words without capitalisation (e.g. @q{light slate blue}). -The word ``grey'' can always be spelled ``gray'' (e.g. ``DarkSlateGray''). +The word @q{grey} can always be spelled @q{gray} (e.g. @q{DarkSlateGray}). -Some names can take a numerical suffix (e.g. ``LightSalmon4''). +Some names can take a numerical suffix (e.g. @q{LightSalmon4}). @subsubheading Color Names without a numerical suffix: diff --git a/Documentation/user/point-and-click.itely b/Documentation/user/point-and-click.itely deleted file mode 100644 index 8d74e79a68..0000000000 --- a/Documentation/user/point-and-click.itely +++ /dev/null @@ -1,81 +0,0 @@ -@node Point and click -@appendix Point and click -@cindex point and click - - -Point and click lets you find notes in the input by clicking on them -in the PDF viewer. This makes it easier to find input that causes -some error in the sheet music. - -When this functionality is active, LilyPond adds hyperlinks to the PDF -file. These hyperlinks are sent to the web-browser, which opens a -text-editor with the cursor in the right place. - -To make this chain work, you should configure your PDF viewer to -follow hyperlinks using the @file{lilypond-invoke-editor} script -supplied with LilyPond. - -For Xpdf on Unix, the following should be present in -@file{xpdfrc}@footnote{On unix, this file is found either in -@file{/etc/xpdfrc} or as @file{.xpdfrc} in your home directory.} - -@example -urlCommand "lilypond-invoke-editor %s" -@end example - -The program @file{lilypond-invoke-editor} is a small helper -program. It will invoke an editor for the special @code{textedit} -URIs, and run a web browser for others. It tests the environment -variable @code{EDITOR} for the following patterns, - -@table @code -@item emacs - this will invoke -@example -emacsclient --no-wait +@var{line}:@var{column} @var{file} -@end example -@item vim - this will invoke -@example -gvim --remote +:@var{line}:norm@var{char} @var{file} -@end example - -@item nedit -this will invoke -@example - nc -noask +@var{line} @var{file}' -@end example -@end table - -The environment variable @code{LYEDITOR} is used to override this. It -contains the command line to start the editor, where @code{%(file)s}, -@code{%(column)s}, @code{%(line)s} is replaced with the file, column -and line respectively. The setting - -@example -emacsclient --no-wait +%(line)s:%(column)s %(file)s -@end example - -@noindent -for @code{LYEDITOR} is equivalent to the standard emacsclient -invocation. - - -@cindex file size, output - -The point and click links enlarge the output files significantly. For -reducing the size of PDF and PS files, point and click may be switched -off by issuing - -@example -#(ly:set-option 'point-and-click #f) -@end example - -@noindent -in a @file{.ly} file. Alternately, you may pass this as an command-line -option - -@example -lilypond -dno-point-and-click file.ly -@end example - diff --git a/Documentation/user/preface.itely b/Documentation/user/preface.itely index 09d561a6c0..a4d8f295ea 100644 --- a/Documentation/user/preface.itely +++ b/Documentation/user/preface.itely @@ -1,4 +1,11 @@ @c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @node Preface @unnumbered Preface diff --git a/Documentation/user/programming-interface.itely b/Documentation/user/programming-interface.itely index 3909b5b65c..431e029919 100644 --- a/Documentation/user/programming-interface.itely +++ b/Documentation/user/programming-interface.itely @@ -1,4 +1,12 @@ @c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Interfaces for programmers @chapter Interfaces for programmers @@ -75,7 +83,7 @@ The @code{parser} and @code{location} argument are mandatory, and are used in some advanced situations. The @code{parser} argument is used to access to the value of another LilyPond variable. The @code{location} argument -is used to set the ``origin'' of the music expression that is built +is used to set the @q{origin} of the music expression that is built by the music function, so that in case of a syntax error LilyPond can tell the user an appropriate place to look in the input file. @@ -325,7 +333,7 @@ traLaLa = @{ c'4 d'4 @} @noindent is internally converted to a Scheme definition @example -(define traLaLa @var{Scheme value of ``@code{... }''}) +(define traLaLa @var{Scheme value of `@code{... }'}) @end example This means that input variables and Scheme variables may be freely @@ -356,7 +364,7 @@ the dummy statement in the above example, the @code{newLa} definition is executed before @code{traLaLa} is defined, leading to a syntax error. -The above example shows how to `export' music expressions from the +The above example shows how to @q{export} music expressions from the input to the Scheme interpreter. The opposite is also possible. By wrapping a Scheme value in the function @code{ly:export}, a Scheme value is interpreted as if it were entered in LilyPond syntax. @@ -405,7 +413,7 @@ available is in the Program reference manual, under @internalsref{Music expressions}. @item -`type' or interface: Each music name has several `types' or +@q{type} or interface: Each music name has several @q{types} or interfaces, for example, a note is an @code{event}, but it is also a @code{note-event}, a @code{rhythmic-event}, and a @code{melodic-event}. All classes of music are listed in the @@ -425,7 +433,7 @@ under @internalsref{Music properties}. A compound music expression is a music object that contains other music objects in its properties. A list of objects can be stored in -the @code{elements} property of a music object, or a single `child' +the @code{elements} property of a music object, or a single @q{child} music object in the @code{element} object. For example, @internalsref{SequentialMusic} has its children in @code{elements}, and @internalsref{GraceMusic} has its single argument in @@ -581,7 +589,7 @@ d' @subsection Doubling a note with slurs (example) Suppose we want to create a function which translates -input like ``@code{a}'' into ``@code{a( a)}''. We begin +input like @samp{a} into @samp{a( a)}. We begin by examining the internal representation of the music we want to end up with. @@ -620,7 +628,7 @@ we want to end up with. @end example The bad news is that the @code{SlurEvent} expressions -must be added ``inside'' the note (or more precisely, +must be added @q{inside} the note (or more precisely, inside the @code{EventChord} expression). Now we examine the input, @@ -758,12 +766,12 @@ necessary, but just like clear variable names, it is good practice. (let ((result-event-chord (ly:music-deep-copy event-chord))) @end example -`@code{let}' is used to declare local variables. Here we use one local -variable, named `@code{result-event-chord}', to which we give the value -@code{(ly:music-deep-copy event-chord)}. `@code{ly:music-deep-copy}' is +@code{let} is used to declare local variables. Here we use one local +variable, named @code{result-event-chord}, to which we give the value +@code{(ly:music-deep-copy event-chord)}. @code{ly:music-deep-copy} is a function specific to LilyPond, like all functions prefixed by -`@code{ly:}'. It is use to make a copy of a music -expression. Here we copy `@code{event-chord} (the parameter of the +@code{ly:}. It is use to make a copy of a music +expression. Here we copy @code{event-chord} (the parameter of the function). Recall that our purpose is to add a marcato to an @code{EventChord} expression. It is better to not modify the @code{EventChord} which was given as an argument, because it may be @@ -797,7 +805,7 @@ former elements property, with an extra item: the (ly:music-property result-event-chord 'elements)) @end example -`@code{cons}' is used to add an element to a list without modifying the +@code{cons} is used to add an element to a list without modifying the original list. This is what we want: the same list as before, plus the new @code{ArticulationEvent} expression. The order inside the elements property is not important here. @@ -961,7 +969,7 @@ The arguments are @item argi-type? a type predicate for the i@var{th} argument @item layout -the `layout' definition +the @q{layout} definition @item props a list of alists, containing all active properties. @end table diff --git a/Documentation/user/putting.itely b/Documentation/user/putting.itely index 0cc5ecd908..1dd8222330 100644 --- a/Documentation/user/putting.itely +++ b/Documentation/user/putting.itely @@ -1,4 +1,12 @@ @c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Putting it all together @chapter Putting it all together @@ -10,6 +18,7 @@ create @code{\score} blocks. * Extending the templates:: * How LilyPond files work:: * Score is a single musical expression:: +* An orchestral part:: @end menu @@ -22,7 +31,7 @@ want something that isn't covered? Start off with the template that seems closest to what you want to end up with. Let's say that you want to write something for soprano and -cello. In this case, we would start with ``Notes and lyrics'' (for the +cello. In this case, we would start with @q{Notes and lyrics} (for the soprano part). @example @@ -52,7 +61,7 @@ text = \lyricmode @{ @} @end example -Now we want to add a cello part. Let's look at the ``Notes only'' example: +Now we want to add a cello part. Let's look at the @q{Notes only} example: @example \version "2.9.13" @@ -283,6 +292,9 @@ Some people put some of those commands outside the often placed above the @code{\score}. That's just another shorthand that LilyPond accepts. +@cindex variables +@cindex indentifiers + Another great shorthand is the ability to define variables. All the templates use this @@ -447,3 +459,136 @@ layer starts on the same horizontal position in your text editor! + + + + +@node An orchestral part +@section An orchestral part + +In orchestral music, all notes are printed twice. Once in a part for +the musicians, and once in a full score for the conductor. Identifiers can +be used to avoid double work. The music is entered once, and stored in +a variable. The contents of that variable is then used to generate +both the part and the full score. + +It is convenient to define the notes in a special file. For example, +suppose that the file @file{horn-music.ly} contains the following part +of a horn/@/bassoon duo + +@example +hornNotes = \relative c @{ + \time 2/4 + r4 f8 a cis4 f e d +@} +@end example + +@noindent +Then, an individual part is made by putting the following in a file + +@example +\include "horn-music.ly" +\header @{ + instrument = "Horn in F" +@} + +@{ + \transpose f c' \hornNotes +@} +@end example + +The line + +@example +\include "horn-music.ly" +@end example + +@noindent +substitutes the contents of @file{horn-music.ly} at this position in +the file, so @code{hornNotes} is defined afterwards. The command +@code{\transpose f@tie{}c'} indicates that the argument, being +@code{\hornNotes}, should be transposed by a fifth upwards. Sounding +@samp{f} is denoted by notated @code{c'}, which corresponds with the +tuning of a normal French Horn in@tie{}F. The transposition can be seen +in the following output + +@lilypond[quote,ragged-right] +\transpose f c' \relative c { + \time 2/4 + r4 f8 a cis4 f e d +} +@end lilypond + +In ensemble pieces, one of the voices often does not play for many +measures. This is denoted by a special rest, the multi-measure +rest. It is entered with a capital @samp{R} followed by a duration +(@code{1}@tie{}for a whole note, @code{2}@tie{}for a half note, +etc.). By multiplying the +duration, longer rests can be constructed. For example, this rest +takes 3@tie{}measures in 2/4 time + +@example +R2*3 +@end example + +When printing the part, multi-rests +must be condensed. This is done by setting a run-time variable + +@example +\set Score.skipBars = ##t +@end example + +@noindent +This command sets the property @code{skipBars} in the +@code{Score} context to true (@code{##t}). Prepending the rest and +this option to the music above, leads to the following result + +@lilypond[quote,ragged-right] +\transpose f c' \relative c { + \time 2/4 + \set Score.skipBars = ##t + R2*3 + r4 f8 a cis4 f e d +} +@end lilypond + + +The score is made by combining all of the music together. Assuming +that the other voice is in @code{bassoonNotes} in the file +@file{bassoon-music.ly}, a score is made with + +@example +\include "bassoon-music.ly" +\include "horn-music.ly" + +<< + \new Staff \hornNotes + \new Staff \bassoonNotes +>> +@end example + +@noindent +leading to + +@lilypond[quote,ragged-right] +\relative c << + \new Staff { + \time 2/4 R2*3 + r4 f8 a cis4 f e d + } + \new Staff { + \clef bass + r4 d,8 f | gis4 c | b bes | + a8 e f4 | g d | gis f + } +>> +@end lilypond + +More in-depth information on preparing parts and scores can be found +in the notation manual; see @ref{Orchestral music}. + +Setting run-time variables (@q{properties}) is discussed in +@ref{Changing context properties on the fly}. + + + diff --git a/Documentation/user/running.itely b/Documentation/user/running.itely index 81b6751d20..738bf68759 100644 --- a/Documentation/user/running.itely +++ b/Documentation/user/running.itely @@ -1,5 +1,12 @@ @c -*- coding: utf-8; mode: texinfo; -*- @c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Running LilyPond @chapter Running LilyPond @@ -7,11 +14,11 @@ This chapter details the technicalities of running LilyPond. Some of these commands are run from the command-line. By -``command-line'', we mean the command +@q{command-line}, we mean the command line in the operating system. Windows users -might be more familiar with the terms ``DOS shell'' or -``command shell''; OSX users might be more familiar with the -terms ``terminal'' or ``console''. OSX users should also +might be more familiar with the terms @q{DOS shell} or +@q{command shell}; OSX users might be more familiar with the +terms @q{terminal} or @q{console}. OSX users should also consult @ref{Notes for the MacOS X app}. Describing how to use @@ -87,11 +94,13 @@ on the command-line, and include at the top of the @code{.ly} file. @item -f,--format=@var{format} -which formats should be written. Choices are @code{svg}, @code{ps}, -@code{pdf}, @code{png}, @code{tex}, @code{dvi}. +which formats should be written. Choices for @code{format} are +@code{svg}, @code{ps}, @code{pdf}, @code{png}, @code{tex}, @code{dvi}. + +Example: @code{lilypond -fpng filename.ly} @item -b,--backend=@var{format} -the output format to use for the back-end. Choices are +the output format to use for the back-end. Choices for @code{format} are @table @code @item tex for @TeX{} output, to be processed with La@TeX{}. If present, the file @@ -130,6 +139,8 @@ This mode is used by default by lilypond-book. @cindex Scheme dump @end table +Example: @code{lilypond -bsvg filename.ly} + @cindex output format, setting @item -d,--define-default=@var{var}=@var{val} @@ -356,11 +367,36 @@ invoking them directly, e.g. The same is true of the other scripts in that directory, including lilypond-book, convert-ly, abc2ly, etc. -Alternatively, you may add this directory to your path. Modify (or create) +Alternatively, you may create scripts which add the path +automatically. Create a directory to store these scripts, + +@example +mkdir -p ~/bin +cd ~/bin +@end example + +Create a file called @code{lilypond} which contains + +@example +exec @var{path/to}/LilyPond.app/Contents/Resources/bin/lilypond "$@@" +@end example + +Create similar files @code{lilypond-book}, @code{convert-ly}, and +any other helper programs you use (@code{abc2ly}, @code{midi2ly}, +etc). Simply replace the @code{bin/lilypond} with +@code{bin/convert-ly} (or other program name) in the above file. + +Make the file executable, + +@example +chmod u+x lilypond +@end example + +Now, add this directory to your path. Modify (or create) a file called @code{.profile} in your home directory such that it contains @example -export PATH=$PATH:@var{path/to}/LilyPond.app/Contents/Resources/bin +export PATH=$PATH:~/bin @end example @noindent @@ -532,59 +568,15 @@ converted. @cindex reporting bugs If you have input that results in a crash or an erroneous output, then -that is a bug. We try to respond to bug-reports promptly, and fix them as -soon as possible. Help us by sending a defective input file, so we can -reproduce the problem. Send the report via: - -@example -@uref{http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs} -@end example - -A few tips: -@itemize @bullet +that is a bug. There is a list of current bugs on our google bug tracker, -@item Try to produce a very small input file which demonstrates the problem; -one or two bars is often sufficient to reproduce a bug. The smaller the -input file is, the easier it is for us to debug the problem. +@uref{http://code.google.com/p/lilypond/issues/list} -@item Don't forget to tell which version of LilyPond you use! +If you have discovered a bug which is not listed, please report the +bug by following the directions on -@item If possible, use @code{ragged-right} in your example. This makes sure -that the bug can be reproduced in all paper sizes. -@end itemize - -@ignore -@c the bug database is not up to date enough. - -When you've found a bug, have a look at our -@uref{http://@/lilypond@/.org/@/bugs/@/v2.8/@/,bug database} to see if -it has already been reported. You could also try to do a few searches -on the mailing list for the bug. Sometimes the bug will have already -been reported and a fix or workaround is already known. -@end ignore +@uref{http://lilypond.org/web/devel/participating/bugs} -Here is an example of a good bug report: - -@verbatim -It seems that placement of accidentals is broken. In the -following example, the accidental touches the note head. - -Using Mac OSX 10.3.7, lilypond 2.7.32 - -\version "2.9.13" -\layout { ragged-right = ##t } -\relative c'' { - a4 b cis d -} -@end verbatim - -@lilypond[quote] -\layout { ragged-right = ##t } -\relative c''{ - \override Accidental #'extra-offset = #'(1.0 . 0) - a4 b cis d -} -@end lilypond @node Error messages @section Error messages @@ -700,12 +692,14 @@ installation instructions. @end ifnothtml -@item JEdit +@item LilyPondTool -The @uref{http://@/www@/.jedit@/.org@/,jEdit} editor has a LilyPond plugin. -This plugin includes a DVI viewer, integrated help and viewing via -GhostScript. It can be installed by doing @key{Plugins > Plugin -Manager}, and selecting @code{LilyTool} from the @key{Install} tab. +Created as a plugin for the @uref{http://@/www@/.jedit@/.org@/,jEdit} text +editor, LilyPondTool is the most feature-rich text-based tool for editing +LilyPond scores. Its features include a Document Wizard with lyrics +support to set up documents easier, and embedded PDF viewer with advanced +point-and-click support. For screenshots, demos and installation +instructions, visit @uref{http://lilypondtool@/.organum@/.hu} @end table diff --git a/Documentation/user/scheme-tutorial.itely b/Documentation/user/scheme-tutorial.itely index 64f1ff6e18..1655535cb5 100644 --- a/Documentation/user/scheme-tutorial.itely +++ b/Documentation/user/scheme-tutorial.itely @@ -1,4 +1,11 @@ +@c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @node Scheme tutorial @appendix Scheme tutorial @@ -146,8 +153,8 @@ staff lines, so these stem lines will be @code{2.6} times the width of staff lines. This makes stems almost twice as thick as their normal size. To distinguish between variables defined in input files (like @code{twentyFour} in the example above) and variables of internal -objects, we will call the latter ``properties'' and the former -``identifiers.'' So, the stem object has a @code{thickness} property, +objects, we will call the latter @q{properties} and the former +@q{identifiers.} So, the stem object has a @code{thickness} property, while @code{twentyFour} is an identifier. @cindex properties vs. identifiers diff --git a/Documentation/user/spacing.itely b/Documentation/user/spacing.itely index b94c1da95a..a15df59045 100644 --- a/Documentation/user/spacing.itely +++ b/Documentation/user/spacing.itely @@ -1,5 +1,11 @@ @c -*- coding: utf-8; mode: texinfo; -*- @c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore @c A menu is needed before every deeper *section nesting of @node's; run @c M-x texinfo-all-menus-update @@ -15,8 +21,8 @@ This influences where line breaks are chosen, and thus ultimately, how many pages a piece of music takes. Globally speaking, this procedure happens in four steps: first, -flexible distances (``springs'') are chosen, based on durations. All -possible line breaking combinations are tried, and a ``badness'' score +flexible distances (@q{springs}) are chosen, based on durations. All +possible line breaking combinations are tried, and a @q{badness} score is calculated for each. Then the height of each possible system is estimated. Finally, a page breaking and line breaking combination is chosen so that neither the horizontal nor the vertical spacing is too cramped @@ -704,7 +710,7 @@ lilypond .ly @subsection Horizontal spacing overview The spacing engine translates differences in durations into stretchable -distances (``springs'') of differring lengths. Longer durations get +distances (@q{springs}) of differring lengths. Longer durations get more space, shorter durations get less. The shortest durations get a fixed amount of space (which is controlled by @code{shortest-duration-space} in the @internalsref{SpacingSpanner} @@ -1021,7 +1027,7 @@ for details. @refbugs -Line breaks can only occur if there is a ``proper'' bar line. A note +Line breaks can only occur if there is a @q{proper} bar line. A note which is hanging over a bar line is not proper, such as @lilypond[quote,ragged-right,relative=2,fragment,verbatim] @@ -1119,8 +1125,8 @@ the absence of notes. This is so that single-staff polyphony with rests in one of the parts does not throw off the @code{Page_turn_engraver}). When it finds a sufficiently long section without notes, the @code{Page_turn_engraver} will insert an @code{\allowPageTurn} at the final barline in that section, unless -there is a ``special'' barline (such as a double bar), in which case the -@code{\allowPageTurn} will be inserted at the final ``special'' barline in +there is a @q{special} barline (such as a double bar), in which case the +@code{\allowPageTurn} will be inserted at the final @q{special} barline in the section. @funindex minimumPageTurnLength diff --git a/Documentation/user/templates.itely b/Documentation/user/templates.itely index 3e7845709c..bc41f8d617 100644 --- a/Documentation/user/templates.itely +++ b/Documentation/user/templates.itely @@ -1,6 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; -*- -@node Example templates -@appendix Example templates +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + +@node Templates +@appendix Templates This section of the manual contains templates with the LilyPond score already set up for you. Just add notes, run LilyPond, and enjoy @@ -723,6 +731,120 @@ bassWords = \lyricmode { } @end lilypond +@appendixsubsec SATB with aligned contexts + +Here all the lyrics lines are placed using @code{alignAboveContext} +and @code{alignBelowContext}. + +@lilypond[quote,verbatim,ragged-right] +\version "2.10.0" +global = { + \key c \major + \time 4/4 +} + +sopMusic = \relative c'' { + c4 c c8[( b)] c4 +} +sopWords = \lyricmode { + hi hi hi hi +} + +altoMusic = \relative c' { + e4 f d e +} +altoWords =\lyricmode { + ha ha ha ha +} + +tenorMusic = \relative c' { + g4 a f g +} +tenorWords = \lyricmode { + hu hu hu hu +} + +bassMusic = \relative c { + c4 c g c +} +bassWords = \lyricmode { + ho ho ho ho +} + +\score { + \new ChoirStaff << + \new Staff = women << + \new Voice = + "sopranos" { \voiceOne << \global \sopMusic >> } + \new Voice = + "altos" { \voiceTwo << \global \altoMusic >> } + >> + \new Lyrics \with {alignAboveContext=women} \lyricsto sopranos \sopWords + \new Lyrics \with {alignBelowContext=women} \lyricsto altos \altoWords +% we could remove the line about this with the line below, since we want +% the alto lyrics to be below the alto Voice anyway. +% \new Lyrics \lyricsto altos \altoWords + + \new Staff = men << + \clef bass + \new Voice = + "tenors" { \voiceOne <<\global \tenorMusic >> } + \new Voice = + "basses" { \voiceTwo <<\global \bassMusic >> } + >> + + \new Lyrics \with {alignAboveContext=men} \lyricsto tenors \tenorWords + \new Lyrics \with {alignBelowContext=men} \lyricsto basses \bassWords +% again, we could replace the line above this with the line below. +% \new Lyrics \lyricsto basses \bassWords + >> + + \layout { + \context { + % a little smaller so lyrics + % can be closer to the staff + \Staff + \override VerticalAxisGroup #'minimum-Y-extent = #'(-3 . 3) + } + } +} + + +\score { + \new ChoirStaff << + \new Staff = women << + \new Voice = + "sopranos" { \voiceOne << \global \sopMusic >> } + \new Voice = + "altos" { \voiceTwo << \global \altoMusic >> } + >> + + \new Lyrics \with {alignAboveContext=women} \lyricsto sopranos \sopWords + \new Lyrics \lyricsto altos \altoWords + + \new Staff = men << + \clef bass + \new Voice = + "tenors" { \voiceOne <<\global \tenorMusic >> } + \new Voice = + "basses" { \voiceTwo <<\global \bassMusic >> } + >> + + \new Lyrics \with {alignAboveContext=men} \lyricsto tenors \tenorWords + \new Lyrics \lyricsto basses \bassWords + >> + + \layout { + \context { + % a little smaller so lyrics + % can be closer to the staff + \Staff + \override VerticalAxisGroup #'minimum-Y-extent = #'(-3 . 3) + } + } +} +@end lilypond + @c bad node name to avoid node name confict @node Ancient notation templates diff --git a/Documentation/user/tutorial.itely b/Documentation/user/tutorial.itely index 7170925f44..c0f622f789 100644 --- a/Documentation/user/tutorial.itely +++ b/Documentation/user/tutorial.itely @@ -1,6 +1,29 @@ @c -*- coding: utf-8; mode: texinfo; -*- @c This file is part of lilypond.tely - +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + +@ignore +Tutorial guidelines: +- unless you have a really good reason, use either + @l ilypond[quote,ragged-right,verbatim] + or + @l ilypond[quote,ragged-right,verbatim,fragment,relative=2] + (without spaces) + Don't use any other relative=X commands (make it a non-fragment + example), and don't use fragment without relative=2. +- use "aes" and "ees" instead of "as" and "aes". I know it's not + correct Dutch naming, but let's not confuse people with this until + we get to the Basic notation chapter. +@end ignore + + + +@c old info that will probably be removed. @c TODO: @c * more details about running lilypond; error messages, @c compiling/viewing (emacs?) @@ -14,10 +37,9 @@ @node Tutorial @chapter Tutorial -This tutorial starts with a short introduction to the LilyPond music -language. After this first contact we will show you how to produce -printed output. Then you will be able to create and print your own -sheets of music. +This tutorial starts with an introduction to the LilyPond music +language and how to produce printed music. After this first contact we +will explain how to create common musical notation. @ifhtml Many people learn programs by trying and fiddling around with the @@ -26,222 +48,106 @@ picture in the HTML version of this manual, you will see the exact LilyPond input that was used to generate that image. Try it on this image -@lilypond[fragment,quote,ragged-right,relative=2] -c-\markup { \bold \huge { Click here. } } +@c no verbatim here +@lilypond[quote,ragged-right] +\relative c'' { + c-\markup { \bold \huge { Click here. } } +} @end lilypond -@end ifhtml -By cutting and pasting the full input into a test file, you have a +By cutting and pasting everything in the @qq{ly snippet} section, you have a starting template for experiments. If you like learning in this way, -you will probably want to print out or bookmark -@ifhtml -the -@end ifhtml +you will probably want to print out or bookmark the @ref{Cheat sheet}, which is a table listing of the most common commands for quick reference. +@end ifhtml @menu * First steps:: -* Running LilyPond for the first time:: -* More about pitches:: -* Entering ties:: -* Automatic and manual beams:: -* Octave entry:: -* Music expressions explained:: -* More staves:: -* Adding articulation marks to notes:: -* Combining notes into chords:: -* Advanced rhythmic commands:: -* Commenting input files:: -* Printing lyrics:: -* A lead sheet:: -* Adding titles:: -* Single staff polyphony:: -* Piano staves:: -* Organizing larger pieces:: -* An orchestral part:: -* After the tutorial:: +* Single staff notation:: +* Multiple notes at once:: +* Songs:: +* Final touches:: @end menu @node First steps @section First steps -The first example demonstrates how to enter the most elementary piece -of music, a @rglos{scale}. A @rglos{note} can be entered by typing its -name, from @samp{a} through @samp{g}. So, if you enter +This section gives a basic introduction to working with LilyPond. + +@menu +* Compiling a file:: +* Simple notation:: +* Working on text files:: +* How to read the tutorial:: +@end menu + + +@node Compiling a file +@subsection Compiling a file + +The first example demonstrates how to start working with LilyPond. To +create sheet music, we write a text file that specifies the +notation. For example, if we write @example @{ -c d e f g a b + c' e' g' e' @} @end example @noindent the result looks like this -@lilypond[fragment,quote,notime,relative=1] -c d e f g a b +@c in this case we don't want verbatim +@lilypond[quote,ragged-right] +{ + c' e' g' e' +} @end lilypond -Every piece of LilyPond input needs to have @{curly braces@} placed -around the input. For the rest of this manual, most examples will -omit these braces, but don't forget them in your own music! - -In addition, many examples use @code{relative} mode. This is explained -in @ref{Octave entry}; for now simply be aware that some examples -should be placed inside @code{\relative @{ @emph{...music...} @}}. -Many example have also been compressed horizontally to save -space, using @code{\paper @{ ragged-right = ##t @}}. +@strong{Warning:} Every piece of LilyPond input needs to have @strong{@{ curly +braces @}} placed around the input. The braces should also be +surrounded by a space unless they are at the beginning or end of a +line to avoid ambiguities. These may be omitted in some examples in this +manual, but don't forget them in your own music! @cindex Case sensitive -Finally, LilyPond input is case sensitive. @code{ @{ c d e @} } is -valid input; @code{ @{ C D E @} } will produce an error message. - -The @rglos{duration} of a note is specified by a number after the note -name. @samp{1} for a @rglos{whole note}, @samp{2} for a @rglos{half note}, -@samp{4} for a @rglos{quarter note} and so on - -@example -a1 a2 a4 a16 a32 -@end example - -@lilypond[fragment,quote,notime,relative=2] -\set Staff.autoBeaming = ##f -{ a1 a2 a4 a16 a32 s16_" " } -@end lilypond - -If you do not specify a duration, the duration last entered is used -for the next notes. The duration of the first note in input defaults -to a quarter - -@example -a a8 a a2 a -@end example - -@lilypond[fragment,quote,notime,relative=2] -{ a a8 a a2 a s16_" " } -@end lilypond - - -A @rglos{rest} is entered just like a note, but with the name @samp{r} - -@example -r2 r4 r8 r16 -@end example - -@lilypond[fragment,quote,notime] -r2 r4 r8 r16 s16_" " -@end lilypond - -Add a dot @samp{.} after the duration to get a @rglos{dotted note} - -@example -a2. a4 a8. a16 -@end example - -@lilypond[fragment,quote,notime,relative=1] -{ a2. a4 a8. a16 s16_" " } -@end lilypond - -The (or @rglos{time signature}) can be set with the @code{\time} -command - -@example -\time 3/4 -\time 6/8 -\time 4/4 -@end example - -@c A clef here may lead to confusion, remove it. -@lilypond[fragment,quote] -\override Staff.Clef #'transparent = ##t -\time 3/4 -s4_" " -\time 6/8 -s4_" " -\time 4/4 -s16_" " -@end lilypond - -The @rglos{clef} can be set using the @code{\clef} command - -@example -\clef treble -\clef bass -\clef alto -\clef tenor -@end example - -@lilypond[fragment,quote,notime] -\clef treble -s4_" " -\clef bass -s4_" " -\clef alto -s4_" " -\clef tenor -s16_" " -@end lilypond - -Remember to enclose the notes and commands in curly braces -@code{@{@tie{}@dots{}@tie{}@}} to convert it to printable output. - -@c @li lypond[fragment,quote,noindent,line-width=55\staff-space] -@lilypond[fragment,quote,noindent,verbatim] -\time 3/4 -\clef bass -c2 e4 g2. -f4 e d c2 r4 -@end lilypond - -For more information on - -@quotation -@table @asis -@item Entering pitches and durations -see -@ref{Pitches}, and @ref{Durations}. -@item Clefs -see @ref{Clef}. -@item Rests -see @ref{Rests}. -@item Time signatures and other timing commands -see @ref{Time signature}. -@end table -@end quotation - +In addition, LilyPond input is @strong{case sensitive}. @code{ @{ c d e @} } +is valid input; @code{ @{ C D E @} } will produce an error message. -@node Running LilyPond for the first time -@section Running LilyPond for the first time +@sp 1 -@c cheesy title to avoid clash with chapter name. +@subheading Entering music and viewing output -In the last section we explained what kind of things you can enter in -a LilyPond file. In this section we will explain what commands to run -and how to view or print the output. If you have not used LilyPond -before, want to test your setup, or want to run an example file -yourself, read this section. +In this section we will explain what commands to run +and how to view or print the output. -@unnumberedsubsec MacOS X +@subsubheading MacOS X If you double click LilyPond.app, it will open with an example file. Save it, for example, to @file{test.ly} on your Desktop, and then process it with the menu command @samp{Compile > Typeset File}. The resulting PDF file will be displayed on your screen. -Be warned that the first-ever run will take a minute or two, because -all of the system fonts have to be analyzed first. +Be warned that the first time you ever run lilypond will take a minute +or two because all of the system fonts have to be analyzed first. -@unnumberedsubsec Windows +For future use of LilyPond, you should begin by selecting "New" +or "Open". + +@subsubheading Windows On Windows, start up a text-editor@footnote{Any simple or -programmer-oriented editor will do, for example Notepad. Do not use a -word processor, since these insert formatting codes that will confuse -LilyPond.} and enter +programmer-oriented editor with UTF-8 support will do, for example +Notepad. Do not use a word processor, since these insert formatting +codes that will confuse LilyPond.} and enter @verbatim -{ c'4 e' g' } +{ + c' e' g' e' +} @end verbatim Save it on the desktop as @file{test.ly} and make sure that it is not @@ -249,18 +155,22 @@ called @file{test.ly.TXT}. Double clicking @file{test.ly} will process the file and show the resulting PDF file. -@unnumberedsubsec Unix +@subsubheading Unix Begin by opening a terminal window and starting a text editor. For example, you could open an xterm and execute -@code{joe}.@footnote{There are macro files for VIM addicts, and there +@code{joe}@footnote{There are macro files for VIM addicts, and there is a @code{LilyPond-mode} for Emacs addicts. If they have not been -installed already, refer to the file @file{INSTALL.txt}.} In your +installed already, refer to the file @file{INSTALL.txt}. These +easiest editing environment is @file{LilyPondTool}. See +@ref{Editor support} for more information.}. In your text editor, enter the following input and save the file as @file{test.ly} @verbatim -{ c'4 e' g' } +{ + c' e' g' e' +} @end verbatim @noindent @@ -275,7 +185,7 @@ You will see something resembling @example lilypond test.ly -GNU LilyPond 2.6.0 +GNU LilyPond 2.10.0 Processing `test.ly' Parsing... Interpreting music... [1] @@ -285,461 +195,534 @@ Layout output to `test.ps'... Converting to `test.pdf'... @end example -@cindex DVI file +@cindex PDF file @cindex Viewing music -@cindex xdvi + @noindent The result is the file @file{test.pdf} which you can print or view with the standard facilities of your operating system.@footnote{If -your system does not have any tools installed, you can try +your system does not have any such tools installed, you can try @uref{http://@/www@/.cs@/.wisc@/.edu/@/~ghost/,Ghostscript}, a freely available package for viewing and printing PDF and PostScript files.} -@node More about pitches -@section More about pitches - -A @rglos{sharp} pitch is made by adding @samp{is} to -the name, a @rglos{flat} pitch by adding @samp{es}. As -you might expect, a @rglos{double sharp} or @rglos{double flat} is -made by adding @samp{isis} or @samp{eses}@footnote{This syntax -derived from note naming conventions in Nordic and Germanic languages, -like German and Dutch.} - -@example -cis1 ees fisis aeses -@end example - -@lilypond[fragment,quote,notime] -\set Score.timing = ##f -\transpose c c' { cis1 ees fisis aeses s16_" " } -@end lilypond -@cindex key signature, setting -The key signature is set with the command @code{\key}, followed by -a pitch and @code{\major} or @code{\minor} +@node Simple notation +@subsection Simple notation -@example -\key d \major -g1 -\key c \minor -g -@end example +LilyPond will add some notation elements automatically. In the next +example, we have only specified four pitches, but LilyPond has +added a clef, time signature, and rhythms. -@lilypond[fragment,quote,notime,fragment] -\key d \major -g'1 -\key c \minor -g' +@lilypond[quote,ragged-right,verbatim] +{ + c' e' g' e' +} @end lilypond @noindent -Key signatures together with the pitches (including alterations) are -used to determine when to print accidentals. This is a -feature that often causes confusion to newcomers, so let us explain it -in more detail. +This behavior may be altered, but in most cases these automatic values +are useful. -LilyPond makes a sharp distinction between musical content and -layout. The alteration (flat, natural or sharp) of a note is part of -the pitch, and is therefore musical content. Whether an accidental (a -flat, natural or sharp @emph{sign}) is printed in front of the -corresponding note is a question of layout. Layout is something that -follows rules, so accidentals are printed automatically according to -those rules. The pitches in your music are works of art, so they will -not be added automatically, and you must enter what you want to hear. +@subheading Pitches -In this example +The easiest way to enter notes is by using @code{\relative} mode. In +this mode, the @rglos{interval} between the previous note and the +current note is assumed to be within a @rglos{fourth}. We begin by +entering the most elementary piece of music, a @rglos{scale}. -@lilypond[quote,notime,fragment] -\key d \major -d' cis' fis' +@lilypond[quote,ragged-right,verbatim] +\relative c' { + c d e f + g a b c +} @end lilypond -@noindent -no note has an explicit accidental, but you still must enter +The initial note is @rglos{middle C}. Each successive note +is within a fourth of the previous note -- in other words, the first +@samp{c} is the closest C to middle C. This is followed by the closest +D to the previous note. We can create melodies which have larger intervals: -@example -\key d \major -d cis fis -@end example +@lilypond[quote,ragged-right,verbatim] +\relative c' { + d f a g + c b f d +} +@end lilypond @noindent -The code @samp{d} does not mean `print a black dot just below the -staff.' Rather, it means: `a note with pitch D-natural.' In the key -of A-flat major, it does get an accidental +As you may notice, this example does not start on middle C. The first +note -- the @samp{d} -- is the closest D to middle C. + +To add intervals that are larger than a fourth, we can raise the octave +by adding a single quote @code{'} (or apostrophe) to the note name. We can +lower the octave by adding a comma @code{,} to the note name. -@lilypond[quote,notime,fragment,relative=1,verbatim] -\key as \major -d +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + a a, c' f, + g g'' a,, f' +} @end lilypond -Adding all alterations explicitly might require a little more effort -when typing, but the advantage is that transposing is easier, and -accidentals can be printed according to different conventions. See -@ref{Automatic accidentals}, for some examples how accidentals can be printed -according to different rules. +@noindent +To change a note by two (or more!) octaves, we use multiple @code{''} or +@code{,,} -- but be careful that you use two single quotes @code{''} and +not one double quote @code{"}@tie{}! The initial value in +@code{\relative c'} may also be modified like this. -For more information on +@subheading Durations (rhythms) -@quotation -@table @asis -@item Accidentals -see @ref{Automatic accidentals}. +The @rglos{duration} of a note is specified by a number after the note +name. @samp{1} for a @rglos{whole note}, @samp{2} for a @rglos{half note}, +@samp{4} for a @rglos{quarter note} and so on. Beams are added +automatically. -@item Key signature -see @ref{Key signature}. -@end table -@end quotation +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + a1 + a2 a4 a8 a + a16 a a a a32 a a a a64 a a a a a a a a2 +} +@end lilypond -@node Entering ties -@section Entering ties +@noindent +If you do not specify a duration, the previous duration is used +for the next note. The duration of the first note defaults to a quarter. -@cindex tie -A @rglos{tie} is created by appending a tilde @samp{~} to the first -note being tied +To create @rglos{dotted notes}, add a dot @samp{.} to the duration number. -@lilypond[quote,notime,fragment,verbatim,relative=3] -g4~ g a2~ a4 +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + a a a4. a8 + a8. a16 a a8. a8 a4. +} @end lilypond -For more information on Ties see @ref{Ties}. +@subheading Rests +A @rglos{rest} is entered just like a note with the name @samp{r}: -@node Automatic and manual beams -@section Automatic and manual beams +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + a r r2 + r8 a r4 r4. r8 +} +@end lilypond -@cindex beams, by hand -All @rglos{beam}s are drawn automatically -@lilypond[quote,fragment,relative=2,verbatim] -a8 ais d es r d -@end lilypond +@subheading Time signature -@noindent -If you do not like where beams are put, they can be entered by -hand. Mark the first note to be beamed with @samp{[} and the last one -with @samp{]}. +The @rglos{time signature}) can be set with the @code{\time} command: -@lilypond[quote,fragment,relative=2,verbatim] -a8[ ais] d[ es r d] +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \time 3/4 + a4 a a + \time 6/8 + a4. a + \time 4/4 + a4 a a a +} @end lilypond -For more information on beams, see @ref{Manual beams}. +@subheading Clef -Here are key signatures, accidentals and ties in action +The @rglos{clef} can be set using the @code{\clef} command: -@lilypond[fragment,quote,noindent,line-width=50\staff-space,verbatim] -\relative c'' { - \time 4/4 - \key g \minor +@lilypond[quote,ragged-right,verbatim] +\relative c' { \clef treble - r4 r8 a8 gis4 b - a8 d4.~ d e,8 - fis4 fis8 fis8 eis4 a8 gis~ - gis2 r2 + c1 + \clef alto + c1 + \clef tenor + c1 + \clef bass + c1 } @end lilypond -@cindex accidentals +@subheading All together -@noindent -There are some interesting points to note in this example. Bar lines -and beams are drawn automatically. Line breaks are calculated -automatically; it does not matter where the line breaks are in the -source file. Finally, the order in which time, key, and clef changes -are entered is not relevant: in the printout, these are ordered -according to standard notation conventions. - +Here is a small example showing all these elements together: +@lilypond[quote,ragged-right,verbatim] +\relative c, { + \time 3/4 + \clef bass + c2 e8 c' g'2. + f4 e d c4 c, r4 +} +@end lilypond -@node Octave entry -@section Octave entry +@moreinfo +@quotation +@table @asis +@item Entering pitches and durations +see @ref{Pitches} and @ref{Durations}. +@item Rests +see @ref{Rests}. +@item Time signatures and other timing commands +see @ref{Time signature}. +@item Clefs +see @ref{Clef}. +@end table +@end quotation -@c Tim wants to move this quotes example just before the: quotes-do not-work -@c score, but we'd need to remove quotes from the other two (key and -@c tie) examples... +@node Working on text files +@subsection Working on text files -@c better to have this just before the `octaves are bad' snipped -@c but we'd need to remove the ', from \key and tie -To raise a note by an octave, add a high quote @code{'} (apostrophe) to -the note name, to lower a note one octave, add a `low quote' @code{,} -(comma). Middle C is @code{c'} +LilyPond input files are treated like files in most programming languages: +they are case sensitive, white-space insensitive, expressions are +formed with curly braces @{ @}, and comments are denoted with @code{%} or +@code{%@{ .. %@}}. -@lilypond[quote,notime,fragment,verbatim] -c'4 c'' c''' \clef bass c c, -@end lilypond +If the previous sentence sounds like nonsense, don't worry! We'll explain +what all these terms mean: -An example of the use of quotes is in the following Mozart fragment +@itemize -@lilypond[quote,ragged-right,fragment,verbatim] -\key a \major -\time 6/8 -cis''8. d''16 cis''8 e''4 e''8 -b'8. cis''16 b'8 d''4 d''8 -@end lilypond +@cindex Case sensitive +@item @strong{Case sensitive}: +it matters whether you enter a letter +in lower case (i.e. @code{a, b, s, t}) or upper case (i.e. +@code{A, B, S, T}). Notes are lower case: @code{ @{ c d e @} } +is valid input; @code{ @{ C D E @} } will produce an error message. + +@item @strong{Whitespace insensitive}: +it does not matter how many +spaces (or new lines) you add. @code{ @{ c d e @}} means the same thing +as @code{ @{ c @ @ @ @ @ d e @} } and +@example + @{ +c d + e @} +@end example @noindent -This example shows that music in a high register needs lots of quotes. -This makes the input less readable, and it is a source of errors. The -solution is to use `relative octave' mode. This is the -most convenient way to copy existing music. +Of course, the previous example is hard to read. A good rule of thumb +is to indent code blocks with either a tab or two spaces: +@example +@{ + c d e +@} +@end example -In relative mode, a note without octavation quotes (i.e., the @code{'} -or @code{,} after a note) is chosen so that it is closest to the -previous one. For example, @samp{c f} goes up while @samp{c g} goes -down. +@item @strong{Expressions:} +Every piece of LilyPond input needs to have +@strong{@{ curly braces @}} placed around the input. These braces tell +LilyPond that the input is a single music expression, just like +parenthesis @samp{()} in mathematics. The braces should +be surrounded by a space unless they are at the beginning or end of a +line to avoid ambiguities. -To use relative mode, add @code{\relative} before the piece of -music. The first note is taken relative to the middle C -@c no , for this sentence -(i.e., @code{c'}) +A function (such as @code{\relative @{ @}} ) also counts as a single +music expression. +@cindex comments +@cindex line comment +@cindex block comment +@item @strong{Comments}: +A comment is a remark for the human reader of the music input; it is +ignored while parsing, so it has no effect on the printed output. +There are two types of comments. The percent symbol @samp{%} +introduces a line comment; anything after @samp{%} on that line is +ignored. A block comment marks a whole section of music +input as a comment. Anything that is enclosed in @code{%@{} and @code{%@}} is +ignored. The following fragment shows possible uses for comments +@example +% notes for twinkle twinkle follow + c4 c g' g a a g2 -@lilypond[quote,notime,fragment,verbatim] -\relative { - c' f c g c -} -@end lilypond +%@{ + This line, and the notes below + are ignored, since they are in a + block comment. + g g f f e e d d c2 +%@} +@end example -Since most music has small intervals, pieces can be written almost -without octavation quotes in relative mode. The previous example is -entered as +@end itemize -@lilypond[quote,ragged-right,verbatim] -\relative { - \key a \major - \time 6/8 - cis'8. d16 cis8 e4 e8 - b8. cis16 b8 d4 d8 -} -@end lilypond +There are more tips for constructing input files in +@ref{Suggestions for writing LilyPond files}. -@c needed better, maybe even redundant explanation -@c added another example below. -@c grappig: Pa vond het heel logies, en slim toen-i eenmaal begreep. -@c in eerste instantie drong het `relative' niet door zonder extra uitleg. -Larger intervals are made by adding octavation quotes. -@lilypond[quote,notime,verbatim,fragment] -\relative c { - c'' f, f c' c g' c, -} -@end lilypond +@node How to read the tutorial +@subsection How to read the tutorial -In summary, quotes or commas no longer determine the absolute height -of a note in @code{\relative} mode. Rather, the height of a note is -relative to the previous one, and changing the octave of a single note -shifts all following notes an octave up or down. +As we saw in @ref{Working on text files}, LilyPond input must be +surrounded by @{ @} marks or a @code{\relative c'' @{ ... @}}. For the +rest of this manual, most examples will omit this. -For more information on relative octaves see @ref{Relative octaves}, -and @ref{Octave check}. +If you are reading the HTML documentation and wish to see the exact +exact LilyPond code that was used to create the example, simply click +on the picture. If you are not reading the HTML version, you could +copy and paste the displayed input, but you @strong{must} add the +@code{\relative c'' @{ @}} like this: +@example +\relative c'' @{ + ... example goes here... +@} +@end example -@node Music expressions explained -@section Music expressions explained +Why omit the braces? Most examples +in this manual can be inserted into the middle of a longer piece of +music. For these examples, it does not make sense to add +@code{\relative c'' @{ @}} -- you should not place a @code{\relative} +inside another @code{\relative}, so you would not be able to copy +a small documentation example and paste it inside a longer piece +of your own. -In input files, music is represent by so-called @emph{music -expression}s. We have already seen some in the previous examples; -a single note is a music expression +@node Single staff notation +@section Single staff notation -@lilypond[fragment,quote,verbatim,relative=3] -a4 -@end lilypond +This section introduces common notation that is used for one voice +on one staff. -Enclosing a group of notes in braces creates a new music -expression +@menu +* Relative note names:: +* Accidentals and key signatures:: +* Ties and slurs:: +* Articulation and dynamics:: +* Automatic and manual beams:: +* Advanced rhythmic commands:: +@end menu -@lilypond[fragment,quote,verbatim,relative=3] -{ a4 g4 } -@end lilypond -Putting a bunch of music expressions (e.g., notes) in braces, means that -they should be played in sequence. The result again is a music -expression, which can be grouped with other expressions sequentially. -Here, the expression from the previous example is combined with two -notes +@node Relative note names +@subsection Relative note names -@lilypond[fragment,quote,verbatim,relative=3] -{ { a4 g } f g } -@end lilypond +As we saw in @ref{Simple notation}, LilyPond calculates the pitch of +each note relative to the previous one@footnote{There is another mode of +entering pitches, @ref{Absolute note names}, but in practice relative +mode is much easier and safer to use.}. If no extra octave marks +(@code{'} and @code{,}) are added, it assumes that each pitch is within +a fourth of the previous note. -This technique is useful for non-monophonic music. To enter music -with more voices or more staves, we also combine expressions in -parallel. Two voices that should play at the same time, are entered -as a simultaneous combination of two sequences. A `simultaneous' -music expression is formed by enclosing expressions in @code{<<} and -@code{>>}. In the following example, three sequences (all containing -two separate notes) are combined simultaneously +LilyPond examines pitches based on the note names -- in other words, +an augmented fourth is @emph{not} the same as a diminished fifth. If we +begin at a C, then an F-sharp will be placed a higher than the C, while +a G-flat will be placed lower than the C. -@lilypond[fragment,quote,verbatim,relative=3] -<< - { a4 g } - { f e } - { d b } ->> +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +c2 fis +c2 ges @end lilypond -This mechanism is similar to mathematical -formulas: a big formula is created by composing small formulas. Such -formulas are called expressions, and their definition is recursive, so -you can make arbitrarily complex and large expressions. For example, +@moreinfo +@quotation +@table @asis +@item Relative octaves +see @ref{Relative octaves}. +@item Octave check +see @ref{Octave check}. +@end table +@end quotation -@example -1 -1 + 2 -(1 + 2) * 3 +@node Accidentals and key signatures +@subsection Accidentals and key signatures -((1 + 2) * 3) / (4 * 5) -@end example +@subheading Accidentals -@cindex expression -@cindex music expression -This is a sequence of expressions, where each expression is contained -in the next (larger) one. The simplest expressions are numbers, and larger -ones are made by combining expressions with operators (like @samp{+}, -@samp{*} and @samp{/}) and parentheses. Like mathematical expressions, -music expressions can be nested arbitrarily deep, which is necessary -for complex music like polyphonic scores. +A @rglos{sharp} pitch is made by adding @samp{is} to +the name, and a @rglos{flat} pitch by adding @samp{es}. As +you might expect, a @rglos{double sharp} or @rglos{double flat} is +made by adding @samp{isis} or @samp{eses}@footnote{This syntax +derived from note naming conventions in Nordic and Germanic languages, +like German and Dutch. To use other names for accidentals, see +@ref{Note names in other languages}.} -Note that this example only has one staff, whereas -the previous example had three separate staves. That is because this -example begins with a single note. To determine the number of staves, -LilyPond looks at the first element. If it is a single note, there is one -staff; if there is a simultaneous expression, there is more than one staff. +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +cis1 ees fisis, aeses +@end lilypond -@lilypond[fragment,quote,verbatim,relative=2] -{ - c <> - << { e f } { c <> } >> -} +@cindex key signature, setting +@subheading Key signatures + +The key signature is set with the command @code{\key} followed by +a pitch and @code{\major} or @code{\minor}. + +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +\key d \major +a1 +\key c \minor +a @end lilypond -Music files with deep nesting can be confusing to enter and -maintain. One convention that helps against this confusion is -indenting. When entering a file with deep nesting of braces and -angles, it is customary to use an indent that indicates the nesting -level. Formatting music like this eases reading and helps you insert -the right number of closing braces at the end of an expression. For -example, +@sp 1 -@example -<< - @{ - @dots{} - @} - @{ - @dots{} - @} ->> -@end example +@subheading Warning: key signatures and pitches -Some editors have special support for entering LilyPond, and can help -indenting source files. See @ref{Editor support} for more information. +To determine whether to print an accidental, LilyPond examines the +pitches and the key signature. The key signature only effects +the @emph{printed} accidentals, not the actual pitches! This is a +feature that often causes confusion to newcomers, so let us explain it +in more detail. -@node More staves -@section More staves +LilyPond makes a sharp distinction between musical content and +layout. The alteration (flat, natural or sharp) of a note is part of +the pitch, and is therefore musical content. Whether an accidental (a +@emph{printed} flat, natural or sharp sign) is printed in front of the +corresponding note is a question of layout. Layout is something that +follows rules, so accidentals are printed automatically according to +those rules. The pitches in your music are works of art, so they will +not be added automatically, and you must enter what you want to hear. -To print more than one staff, each piece of music that makes up a -staff is marked by adding @code{\new Staff} before it. These -@code{Staff} elements are then combined in parallel with @code{<<} and -@code{>>}, as demonstrated here +In this example -@lilypond[quote,fragment,verbatim] -<< - \new Staff { \clef treble c'' } - \new Staff { \clef bass c } ->> +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +\key d \major +d cis fis @end lilypond +@noindent +No note has a printed accidental, but you must still add the @samp{is} to +@code{cis} and @code{fis}. -The command @code{\new} introduces a `notation context.' A notation -context is an environment in which musical events (like notes or -@code{\clef} commands) are interpreted. For simple pieces, such -notation contexts are created automatically. For more complex pieces, it -is best to mark contexts explicitly. This ensures that each fragment -gets its own stave. +The code @samp{e} does not mean @qq{print a black dot just below the +first line of the staff.} Rather, it means: @qq{there is a note with +pitch E-natural.} In the key of A-flat major, it @emph{does} get an +accidental: -There are several types of contexts. @code{Staff}, @code{Voice} and -@code{Score} handle melodic notation, while @code{Lyrics} sets lyric -texts and @code{ChordNames} prints chord names. +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +\key aes \major +e +@end lilypond -In terms of syntax, prepending @code{\new} to a music expression -creates a bigger music expression. In this way it resembles the minus -sign in mathematics. The formula @math{(4+5)} is an expression, so -@math{-(4+5)} is a bigger expression. +Adding all alterations explicitly might require a little more effort +when typing, but the advantage is that transposing is easier, and +accidentals can be printed according to different conventions. See +@ref{Automatic accidentals} for some examples how accidentals can be printed +according to different rules. + +@moreinfo +@quotation +@table @asis +@item Accidentals +see @ref{Accidentals} and @ref{Automatic accidentals}. +@item Key signature +see @ref{Key signature}. +@end table +@end quotation -We can now typeset a melody with two staves -@c TODO: (c) status of this Paul McCartney (?) song (let's all stand together) +@node Ties and slurs +@subsection Ties and slurs -@lilypond[fragment,quote,verbatim,ragged-right] -\relative << - \new Staff { - \time 3/4 - \clef treble +@cindex ties +@subheading Ties +A @rglos{tie} is created by appending a tilde @samp{~} to the first +note being tied - e'2 d4 c2 b4 a8[ a] - b[ b] g[ g] a2. - } - \new Staff { - \clef bass - c,,2 e4 g2. - f4 e d c2. - } ->> +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +g4~ g c2~ +c4 ~ c8 a8 ~ a2 @end lilypond -For more information on contexts see the description in -@ref{Interpretation contexts}. +@cindex slurs +@subheading Slurs +A @rglos{slur} is a curve drawn across many notes. The starting note +and ending note are marked with @samp{(} and @samp{)} respectively. +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +d4( c16) cis( d e c cis d) e( d4) +@end lilypond + +@cindex slurs, phrasing +@cindex phrasing slurs +@subheading Phrasing slurs + +@cindex phrasing slurs +Slurs to indicate longer phrasing can be entered with @code{\(} and +@code{\)}. You can have both legato slurs and phrasing slurs at the +same time, but you cannot have simultaneous slurs or simultaneous +phrasing slurs. -@node Adding articulation marks to notes -@section Adding articulation marks to notes +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +a8(\( ais b c) cis2 b'2 a4 cis,\) +@end lilypond + +@sp 1 + +@cindex slurs versus ties +@subheading Warnings: slurs vs. ties + +A slur looks like a @rglos{tie}, but it has a different meaning. A +tie simply makes the first note longer, and can only be used on +pairs of notes with the same pitch. Slurs indicate the articulations +of notes, and can be used on larger groups of notes. Slurs and ties +can be nested. + +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +c2~( c8 fis fis4 ~ fis2 g2) +@end lilypond + +@moreinfo +@quotation +@table @asis +@item Ties +see @ref{Ties}. +@item Slurs +see @ref{Slurs}. +@item Phrasing slurs +see @ref{Phrasing slurs}. +@end table +@end quotation + + +@node Articulation and dynamics +@subsection Articulation and dynamics @cindex articulation @cindex accents @cindex staccato +@subheading Articulations -Common accents can be added to a note using a dash (@samp{-}) and a -single character +Common @rglos{articulations} can be added to a note using a dash @samp{-} +and a single character: -@lilypond[fragment,quote,verbatim,relative=2] -c-. c-- c-> c-^ c-+ c-_ +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +c-. c-- c-> c-^ c-+ c-_ @end lilypond @cindex fingering +@subheading Fingerings Similarly, fingering indications can be added to a note using a dash -(@samp{-}) and the digit to be printed +(@samp{-}) and the digit to be printed: -@lilypond[fragment,quote,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] c-3 e-5 b-2 a-1 @end lilypond Articulations and fingerings are usually placed automatically, but you can specify a direction using @samp{^} (up) or @samp{_} (down). You can -also use multiple articulations on the same note. In most cases, however, +also use multiple articulations on the same note. However, in most cases it is best to let LilyPond determine the articulation directions. -@lilypond[fragment,quote,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] c_-^1 d^. f^4_2-> e^-_+ @end lilypond +@subheading Dynamics Dynamic signs are made by adding the markings (with a backslash) to the note -@lilypond[fragment,quote,verbatim,relative=2] -c\ff c\mf +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +c\ff c\mf c\p c\pp @end lilypond @cindex dynamics @@ -750,286 +733,481 @@ Crescendi and decrescendi are started with the commands @code{\<} and @code{\>}. An ending dynamic, for example @code{\f}, will finish the (de)crescendo, or the command @code{\!} can be used -@lilypond[fragment,quote,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] c2\< c2\ff\> c2 c2\! @end lilypond - - -@cindex slur - -A @rglos{slur} is a curve drawn across many notes, and indicates -legato articulation. The starting note and ending note are marked -with @samp{(} and @samp{)}, respectively - -@lilypond[fragment,quote,fragment,relative=2,verbatim] -d4( c16) cis( d e c cis d) e( d4) -@end lilypond - -@cindex slurs versus ties -A slur looks like a @rglos{tie}, but it has a different meaning. A -tie simply makes the first note sound longer, and can only be used on -pairs of notes with the same pitch. Slurs indicate the articulations -of notes, and can be used on larger groups of notes. Slurs and ties -can be nested - -@lilypond[quote,fragment,relative=2] -c2~( c8 fis fis4 ~ fis2 g2) -@end lilypond - -@cindex phrasing slurs -Slurs to indicate phrasing can be entered with @code{\(} and -@code{\)}, so you can have both legato slurs and phrasing slurs at the -same time. You cannot have simultaneous slurs or simultaneous -phrasing slurs. - -@lilypond[quote,fragment,relative=2,verbatim] -a8(\( ais b c) cis2 b'2 a4 cis, c\) -@end lilypond - - -For more information on - +@moreinfo @quotation @table @asis -@item Fingering -see @ref{Fingering instructions}. @item Articulations see @ref{Articulations}. -@item Slurs -see @ref{Slurs}. -@item Phrasing slurs -see @ref{Phrasing slurs}. +@item Fingering +see @ref{Fingering instructions}. @item Dynamics see @ref{Dynamics}. @end table @end quotation -@node Combining notes into chords -@section Combining notes into chords +@node Automatic and manual beams +@subsection Automatic and manual beams -@cindex chords -Chords can be made by surrounding pitches with angle brackets. -Angle brackets are the symbols @samp{<} and @samp{>}. +@cindex beams, by hand +All @rglos{beam}s are drawn automatically: -@lilypond[quote,relative=1,fragment,verbatim] -r4 4 8 +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +a8 ais d ees r d c16 b a8 @end lilypond +@noindent +If you do not like the automatic beams, they may be overridden +manually. Mark the first note to be beamed with @samp{[} and the last one +with @samp{]}. -You can combine markings like beams and ties with chords. They must -be placed outside the angled brackets - -@lilypond[quote,relative=1,fragment,verbatim] -r4 8[ ]~ +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +a8[ ais] d[ ees r d] a b @end lilypond -@example -r4 8\>( \!) -@end example - -@lilypond[quote,relative=1,fragment] -\slurUp -r4 8\>( \!) -@end lilypond +@moreinfo +@quotation +@table @asis +@item Automatic beams +see @ref{Automatic beams}. +@item Manual beams +see @ref{Manual beams}. +@end table +@end quotation @node Advanced rhythmic commands -@section Advanced rhythmic commands +@subsection Advanced rhythmic commands @cindex pickup @cindex anacruse @cindex partial measure -A pickup is entered with the keyword @code{\partial}. It -is followed by a duration: @code{\partial 4} is a quarter note upstep -and @code{\partial 8} an eighth note +@subheading Partial measure + +A pickup (or @rglos{anacrusis}) is entered with the keyword +@code{\partial}. It is followed by a duration: @code{\partial 4} is +a quarter note pickup and @code{\partial 8} an eighth note. -@lilypond[quote,relative=2,verbatim,fragment] +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] \partial 8 -f8 c2 d e +f8 c2 d @end lilypond @cindex tuplets @cindex triplets +@subheading Tuplets + Tuplets are made with the @code{\times} keyword. It takes two arguments: a fraction and a piece of music. The duration of the piece of music is multiplied by the fraction. Triplets make notes occupy 2/3 of their notated duration, so a triplet has 2/3 as its fraction -@lilypond[quote,relative=1,verbatim,fragment] +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] \times 2/3 { f8 g a } \times 2/3 { c r c } +\times 2/3 { f,8 g16 a g a } +\times 2/3 { d4 a8 } @end lilypond @cindex grace notes @cindex acciaccatura -Grace notes are also made by prefixing a music expression with the -keyword @code{\appoggiatura} or @code{\acciaccatura} @cindex appoggiatura -@cindex acciaccatura +@subheading Grace notes -@lilypond[quote,relative=2,verbatim,fragment] -c4 \appoggiatura b16 c4 -c4 \acciaccatura b16 c4 +Grace notes are created with the @code{\grace} command, although they +can also be created by prefixing a music expression with the +keyword @code{\appoggiatura} or @code{\acciaccatura} + +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +c2 \grace { a32 b} c2 +c2 \appoggiatura b16 c2 +c2 \acciaccatura b16 c2 +@end lilypond + +@moreinfo +@quotation +@table @asis +@item Grace notes +see @ref{Grace notes}, +@item Tuplets +see @ref{Tuplets}, +@item Pickups +see @ref{Partial measures}. +@end table +@end quotation + + +@node Multiple notes at once +@section Multiple notes at once + +This section introduces having more than one note at the same time: +multiple instruments, multiple staves for a single instrument (i.e. piano), +and chords. + +Polyphony in music refers to having more than one voice occurring in +a piece of music. Polyphony in LilyPond refers to having more than +one voice on the same staff. + +@menu +* Music expressions explained:: +* Multiple staves:: +* Piano staves:: +* Single staff polyphony:: +* Combining notes into chords:: +@end menu + + +@node Music expressions explained +@subsection Music expressions explained + +In LilyPond input files, music is represented by @emph{music +expressions}. A single note is a music expression, although it is not +valid input all on its own. + +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +a4 +@end lilypond + +Enclosing a group of notes in braces creates a new music expression: + +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +{ a4 g4 } +@end lilypond + +Putting a group of music expressions (e.g. notes) in braces means that +are in sequence (i.e. each one follows the previous one). The result +is another music expression: + +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +{ { a4 g } f g } +@end lilypond + +@subheading Simultaneous music expressions: multiple staves + +This technique is useful for polyphonic music. To enter music +with more voices or more staves, we combine expressions in +parallel. To indicate that two voices should play at the same time +simple enter a simultaneous combination of music expressions. A +@q{simultaneous} music expression is formed by enclosing expressions inside +@code{<<} and @code{>>}. In the following example, three sequences (all +containing two separate notes) are combined simultaneously: + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + << + { a4 g } + { f e } + { d b } + >> +} +@end lilypond + +Note that we have indented each level of the input with a different +amount of space. LilyPond does not care how much (or little) space there +is at the beginning of a line, but indenting LilyPond code like this makes +it much easier for humans to read. + +@subheading Simultaneous music expressions: single staff + +To determine the number of staves in a piece, LilyPond looks at the first +exression. If it is a single note, there is one staff; if there is a +simultaneous expression, there is more than one staff. + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c2 <> + << { e f } { c <> } >> +} +@end lilypond + +@cindex expression +@cindex music expression +@subheading Analogy: mathematical expressions + +This mechanism is similar to mathematical +formulas: a big formula is created by composing small formulas. Such +formulas are called expressions, and their definition is recursive so +you can make arbitrarily complex and large expressions. For example, + +@example +1 + +1 + 2 + +(1 + 2) * 3 + +((1 + 2) * 3) / (4 * 5) +@end example + +This is a sequence of expressions, where each expression is contained +in the next (larger) one. The simplest expressions are numbers, and larger +ones are made by combining expressions with operators (like @samp{+}, +@samp{*} and @samp{/}) and parentheses. Like mathematical expressions, +music expressions can be nested arbitrarily deep, which is necessary +for complex music like polyphonic scores. + + +@node Multiple staves +@subsection Multiple staves + +As we saw in @ref{Music expressions explained}, LilyPond input files +are constructed out of music expressions. If the score begins with +simultaneous music expressions, LilyPond creates multiples staves. However, +it is easier to see what happens if we create each staff explicitly. + +To print more than one staff, each piece of music that makes up a +staff is marked by adding @code{\new Staff} before it. These +@code{Staff} elements are then combined in parallel with @code{<<} and +@code{>>}: + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + << + \new Staff { \clef treble c } + \new Staff { \clef bass c,, } + >> +} +@end lilypond + +The command @code{\new} introduces a @q{notation context.} A notation +context is an environment in which musical events (like notes or +@code{\clef} commands) are interpreted. For simple pieces, such +notation contexts are created automatically. For more complex pieces, it +is best to mark contexts explicitly. + +There are several types of contexts. @code{Score}, @code{Staff}, +and @code{Voice} handle melodic notation, while @code{Lyrics} sets lyric +texts and @code{ChordNames} prints chord names. + +In terms of syntax, prepending @code{\new} to a music expression +creates a bigger music expression. In this way it resembles the minus +sign in mathematics. The formula @math{(4+5)} is an expression, so +@math{-(4+5)} is a bigger expression. + +Time signatures entered in one staff affects all other staves, but +the key signature of one staff does @emph{not} affect other +staves@footnote{This behavior may be changed if desired; see +@ref{Changing defaults} for details.}. + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + << + \new Staff { \clef treble \time 3/4 c } + \new Staff { \clef bass \key d \major c,, } + >> +} +@end lilypond + + + + +@node Piano staves +@subsection Piano staves + +@cindex staff switch, manual +@cindex cross staff voice, manual +Piano music is typeset in two staves connected by a brace. Printing +such a staff is similar to the polyphonic example in @ref{Multiple staves}, +but now this entire expression is inserted inside a @code{PianoStaff}: + +@example +\new PianoStaff << + \new Staff @dots{} + \new Staff @dots{} +>> +@end example + +Here is a small example + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \new PianoStaff << + \new Staff { \time 2/4 c4 e g g, } + \new Staff { \clef bass c,, c' e c } + >> +} +@end lilypond + +@moreinfo +@quotation +See @ref{Piano music}. +@end quotation + + +@node Single staff polyphony +@subsection Single staff polyphony + +@cindex polyphony +@cindex multiple voices +@cindex voices, more -- on a staff +When different melodic lines are combined on a single staff they are +printed as polyphonic voices; each voice has its own stems, slurs and +beams, and the top voice has the stems up, while the bottom voice has +them down. + +Entering such parts is done by entering each voice as a sequence (with +@code{@{...@}}) and combining these simultaneously, separating the +voices with @code{\\} + +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +<< + { a4 g2 f4~ f4 } \\ + { r4 g4 f2 f4 } +>> +@end lilypond + +For polyphonic music typesetting, spacer rests can also be convenient; +these are rests that do not print. They are useful for filling up +voices that temporarily do not play. Here is the same example with a +spacer rest (@samp{s}) instead of a normal rest (@samp{r}), + +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +<< + { a4 g2 f4~ f4 } \\ + { s4 g4 f2 f4 } +>> +@end lilypond + +@noindent +Again, these expressions can be nested arbitrarily. + +@lilypond[quote,fragment,verbatim,relative=2,fragment] +<< + \new Staff << + { a4 g2 f4~ f4 } \\ + { s4 g4 f2 f4 } + >> + \new Staff << + \clef bass + { 1 ~ 4 } \\ + { e,,4 d e2 ~ e4} + >> +>> @end lilypond -@noindent - -For more information on - +@moreinfo @quotation -@table @asis -@item Grace notes -see @ref{Grace notes}, -@item Tuplets -see @ref{Tuplets}, -@item Pickups -see @ref{Partial measures}. -@end table +See @ref{Basic polyphony}. @end quotation -@node Commenting input files -@section Commenting input files +@node Combining notes into chords +@subsection Combining notes into chords -@cindex comments -@cindex line comment -@cindex block comment -A comment is a remark for the human reader of the music input; it is -ignored while parsing, so it has no effect on the printed output. -There are two types of comments. The percent symbol @samp{%} -introduces a line comment; after @code{%} the rest of the line is -ignored. A block comment marks a whole section of music -input. Anything that is enclosed in @code{%@{} and @code{%@}} is -ignored. The following fragment shows possible uses for comments +@cindex chords +Chords can be made by surrounding pitches with single angle brackets. Angle +brackets are the symbols @samp{<} and @samp{>}. -@example -% notes for twinkle twinkle follow - c4 c g' g a a g2 +@lilypond[quote,fragment,verbatim,relative=2,fragment] +r4 4 2 +@end lilypond -%@{ - This line, and the notes below - are ignored, since they are in a - block comment. +You can combine markings like beams and ties with chords. They must +be placed outside the angled brackets - g g f f e e d d c2 -%@} -@end example +@lilypond[quote,fragment,verbatim,relative=2,fragment] +r4 8[ ]~ 2 +@end lilypond -@c TODO post-2.6 reorg -@c This is good info, but I wouldn't call it a comment. IMO it should -@c be moved somewhere else. +@lilypond[quote,fragment,verbatim,relative=2,fragment] +r4 8\>( 4 \!) +@end lilypond -@cindex versioning -There is a special statement that is a kind of comment. The @code{\version} -statement marks for which version of LilyPond the file was written. -To mark a file for version 2.10.1, use +@node Songs +@section Songs -@example -\version "2.10.1" -@end example +This section introduces vocal music and simple song sheets. -@noindent -These annotations make future upgrades of LilyPond go more -smoothly. Changes in the syntax are handled with a special program, -@file{convert-ly} (see @ref{Updating files with convert-ly}), and it uses -@code{\version} to determine what rules to apply. +@menu +* Printing lyrics:: +* A lead sheet:: +@end menu @node Printing lyrics -@section Printing lyrics -@cindex lyrics - -@c TODO: (c) status of the Queen fragment. +@subsection Printing lyrics @cindex Lyrics @cindex Songs -Lyrics are entered by separating each syllable with a space - -@example -I want to break free -@end example +Consider a simple melody: -Consider the melody - -@lilypond[quote,verbatim,fragment,ragged-right] -\relative { - r4 c \times 2/3 { f g g } - \times 2/3 { g4( a2) } +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + a4 e c r4 + b2 c4( d) } @end lilypond The lyrics can be set to these notes, combining both with the -@code{\addlyrics} keyword +@code{\addlyrics} keyword. Lyrics are entered by separating each +syllable with a space. -@lilypond[quote,verbatim,fragment,ragged-right] +@lilypond[quote,ragged-right,verbatim] << - \relative { - r4 c \times 2/3 { f g g } - \times 2/3 { g4( a2) } + \relative c'' { + a4 e c r4 + b2 c4( d) } - \addlyrics { I want to break free } + \addlyrics { One day this shall be free } >> @end lilypond @cindex melisma @cindex extender line -@c synonyms? -This melody ends on a @rglos{melisma}, a single syllable (`free') +This melody ends on a @rglos{melisma}, a single syllable (@q{free}) sung to more than one note. This is indicated with an @emph{extender -line}. It is entered as two underscores, i.e., - -@example -@{ I want to break free __ @} -@end example +line}. It is entered as two underscores @code{__}: -@lilypond[fragment,quote,ragged-right] +@lilypond[quote,ragged-right,verbatim] << - \relative { - r4 c \times 2/3 { f g g } - \times 2/3 { g4( a2) } + \relative c'' { + a4 e c r4 + b2 c4( d) } - \addlyrics { I want to break free __ } + \addlyrics { One day this shall be free __ } >> @end lilypond Similarly, hyphens between words can be entered as two dashes, resulting in a centered hyphen between two syllables -@example -A -- le gri -- a -@end example - -@c no ragged-right here, because otherwise the hypens get lost. -@lilypond[fragment,quote] +@c no ragged-right here because otherwise the hypens get lost. +@lilypond[quote,verbatim] << - \relative { + \relative c' { \time 2/4 - f4 f c' c + f4 f c c } - \addlyrics { A -- le gri -- a } + \addlyrics { A -- le -- gri -- a } >> @end lilypond -More options, like putting multiple lines of lyrics below a melody are +@moreinfo +@quotation +More options, such as putting multiple stanzas below a melody, are discussed in @ref{Vocal music}. +@end quotation @node A lead sheet -@section A lead sheet +@subsection A lead sheet @cindex Lead sheets @cindex chords @cindex chord names @c TODO: revise this, \chords { } is shorter and more intuitive. +@c I need help for this. -gp -In popular music, it is common to denote accompaniment with chord names. +In popular music it is common to denote accompaniment with chord names. Such chords can be entered like notes, -@lilypond[quote,verbatim,ragged-right] +@lilypond[quote,ragged-right,verbatim] \chordmode { c2 f4. g8 } @end lilypond @@ -1058,16 +1236,8 @@ following result. When put together, chord names, lyrics and a melody form a lead sheet, for example, -@example -<< - \chords @{ @emph{chords} @} - @emph{the melody} - \addlyrics @{ @emph{the text} @} ->> -@} -@end example - -@lilypond[quote,ragged-right] +@lilypond[quote,verbatim,ragged-right] +% this melody needs to be changed. See my new example in 2.4.1. -gp << \chords { r2 c:sus4 f } \relative { @@ -1082,145 +1252,179 @@ A complete list of modifiers and other options for layout can be found in @ref{Chords}. +@node Final touches +@section Final touches + +This is the final section of the tutorial; it demonstrates how to add the +final touches to simple pieces, and provides an introduction to the rest +of the manual. + +@menu +* Version number:: +* Adding titles:: +* Absolute note names:: +* Organizing pieces with identifiers:: +* After the tutorial:: +* How to read the manual:: +@end menu + + +@node Version number +@subsection Version number + +@cindex versioning +The @code{\version} statement marks for which version of LilyPond the file +was written. To mark a file for version 2.10.1, place + +@example +\version "2.10.1" +@end example + +@noindent +at the top of your LilyPond file. + +These annotations make future upgrades of LilyPond go more +smoothly. Changes in the syntax are handled with a special program, +@file{convert-ly} (see @ref{Updating files with convert-ly}), and it uses +@code{\version} to determine what rules to apply. + + @node Adding titles -@section Adding titles +@subsection Adding titles -Bibliographic information is entered in a separate block, the -@code{\header} block. The name of the piece, its composer, etc., are -entered as an assignment, within @code{\header -@{@tie{}@dots{}@tie{}@}}. The @code{\header} block is usually put at -the top of the file. For example, +The title, composer, opus number, and similar information are entered +in the @code{\header} block. This exists outside of the main +music expression; the @code{\header} block is usually placed underneath +the @ref{Version number}. @example +\version "2.10.1" \header @{ - title = "Miniature" - composer = "Igor Stravinsky" + title = "Symphony" + composer = "Me" + opus = "Op. 9" @} -@{ @dots{} @} +@{ + @dots{} music @dots{} +@} @end example - When the file is processed, the title and composer are printed above the music. More information on titling can be found in @ref{Creating titles}. -@node Single staff polyphony -@section Single staff polyphony +@node Absolute note names +@subsection Absolute note names -@cindex polyphony -@cindex multiple voices -@cindex voices, more -- on a staff -When different melodic lines are combined on a single staff they are -printed as polyphonic voices; each voice has its own stems, slurs and -beams, and the top voice has the stems up, while the bottom voice has -them down. +So far we have always used @code{\relative} to define pitches. This is +the easiest way to enter most music, but another way of defining pitches +exists: absolute mode. -Entering such parts is done by entering each voice as a sequence (with -@code{@{...@}}), and combining these simultaneously, separating the -voices with @code{\\} +If you omit the @code{\relative}, LilyPond treats all pitches as +absolute values. A @code{c'} will always mean middle C, a @code{b} will +always mean the note one step below middle C, and a @code{g,} will +always mean the note on the bottom staff of the bass clef. -@lilypond[quote,verbatim,relative=2,fragment] -<< { a4 g2 f4~ f4 } \\ - { r4 g4 f2 f4 } >> +@lilypond[quote,verbatim,ragged-right] +{ + \clef bass + c' b g, g, + g, f, f c' +} @end lilypond -For polyphonic music typesetting, spacer rests can also be convenient; -these are rests that do not print. They are useful for filling up -voices that temporarily do not play. Here is the same example with a -spacer rest (@code{s}) instead of a normal rest (@code{r}), +Here is a four-octave scale: -@lilypond[quote,verbatim,relative=2,fragment] -<< { a4 g2 f4~ f4 } \\ - { s4 g4 f2 f4 } >> +@lilypond[quote,verbatim,ragged-right] +{ + \clef bass + c, d, e, f, + g, a, b, c + d e f g + a b c' d' + \clef treble + e' f' g' a' + b' c'' d'' e'' + f'' g'' a'' b'' + c'''1 +} @end lilypond -@noindent -Again, these expressions can be nested arbitrarily +As you can see, writing a melody in the treble clef involves a lot of +quote ' marks. Consider this fragment from Mozart: -@lilypond[quote,fragment,verbatim,relative=2,fragment] -<< - \new Staff << - { a4 g2 f4~ f4 } \\ - { s4 g4 f2 f4 } - >> - \new Staff << - \clef bass - { 1 ~ 4 } \\ - { e,,4 d e2 ~ e4} - >> ->> +@lilypond[quote,verbatim,ragged-right] +{ + \key a \major + \time 6/8 + cis''8. d''16 cis''8 e''4 e''8 + b'8. cis''16 b'8 d''4 d''8 +} @end lilypond -More features of polyphonic typesetting are described in this manual -in section @ref{Basic polyphony}. - - -@node Piano staves -@section Piano staves - -@cindex staff switch, manual -@cindex cross staff voice, manual -Piano music is typeset in two staves connected by a brace. Printing -such a staff is similar to the polyphonic example in @ref{More staves}, - -@example -<< \new Staff @{ @dots{} @} - \new Staff @{ @dots{} @} >> -@end example +All these quotes makes the input less readable and it is a source of +errors. With @code{\relative}, the previous example is much easier +to read: -@noindent -but now this entire expression must be interpreted as a -@code{PianoStaff} - -@example -\new PianoStaff << \new Staff @dots{} >> -@end example - -Here is a small example - -@lilypond[quote,verbatim,relative=1,fragment] -\new PianoStaff << - \new Staff { \time 2/4 c4 c g' g } - \new Staff { \clef bass c,, c' e c } ->> +@lilypond[quote,verbatim,ragged-right] +\relative c'' { + \key a \major + \time 6/8 + cis8. d16 cis8 e4 e8 + b8. cis16 b8 d4 d8 +} @end lilypond -More information on formatting piano music is given in @ref{Piano music}. +If you make a mistake with an octave mark (@code{'} or @code{,}) while +working in @code{\relative} mode, it is very obvious -- many notes will +be in the wrong octave. When working in absolute mode, a single mistake +will not be as visible, and will not be as easy to find. + +However, absolute mode is useful for music which has large intervals, and +is extremely useful for computer-generated LilyPond files. -@node Organizing larger pieces -@section Organizing larger pieces +@node Organizing pieces with identifiers +@subsection Organizing pieces with identifiers When all of the elements discussed earlier are combined to produce -larger files, the @code{\score} blocks get a lot bigger because the -music expressions are longer, and, in the case of polyphonic music, -more deeply nested. Such large expressions can become unwieldy. +larger files, the music expressions get a lot bigger. In polyphonic +music with many staves, the input files can become very confusing. We can +reduce this confusion by using @emph{identifiers}. -By using variables, also known as identifiers, it is possible to break -up complex music expressions. An identifier is assigned as follows +Identifiers (also known as variables or macros), we can break up +complex music expressions. An identifier is assigned as follows @example namedMusic = @{ @dots{} @} @end example -@noindent -The contents of the music expression @code{namedMusic}, can be used -later by preceding the name with a backslash, i.e., @code{\namedMusic}. -In the next example, a two-note motive is repeated two times by using -variable substitution - -@lilypond[quote,ragged-right,verbatim,nofragment] -seufzer = { - e'4( dis'4) +The contents of the music expression @code{namedMusic} can be used +later by placing a backslash in front of the name +(@code{\namedMusic}, just like a normal LilyPond command). Identifiers +must be defined @emph{before} the main music expression. + +@lilypond[quote,verbatim,ragged-right] +violin = \new Staff { \relative c'' { + a4 b c b +}} +cello = \new Staff { \relative c { + \clef bass + e2 d +}} +{ + << + \violin + \cello + >> } -{ \seufzer \seufzer } @end lilypond +@noindent The name of an identifier should have alphabetic characters only: no -numbers, underscores, or dashes. The assignment should be outside of -running music. +numbers, underscores, or dashes. It is possible to use variables for many other types of objects in the input. For example, @@ -1232,7 +1436,7 @@ aFivePaper = \paper @{ paperheight = 21.0 \cm @} @end example Depending on its contents, the identifier can be used in different -places. The following example uses the above variables +places. The following example uses the above variables: @example \paper @{ @@ -1242,148 +1446,16 @@ places. The following example uses the above variables @{ c4^\name @} @end example -More information on the possible uses of identifiers is given in the -technical manual, in @ref{Input variables and Scheme}. -@c fixme: the ref is too technical. - - -@node An orchestral part -@section An orchestral part - -In orchestral music, all notes are printed twice. Once in a part for -the musicians, and once in a full score for the conductor. Identifiers can -be used to avoid double work. The music is entered once, and stored in -a variable. The contents of that variable is then used to generate -both the part and the full score. - -It is convenient to define the notes in a special file. For example, -suppose that the file @file{horn-music.ly} contains the following part -of a horn/@/bassoon duo - -@example -hornNotes = \relative c @{ - \time 2/4 - r4 f8 a cis4 f e d -@} -@end example - -@noindent -Then, an individual part is made by putting the following in a file - -@example -\include "horn-music.ly" -\header @{ - instrument = "Horn in F" -@} - -@{ - \transpose f c' \hornNotes -@} -@end example - -The line - -@example -\include "horn-music.ly" -@end example - -@noindent -substitutes the contents of @file{horn-music.ly} at this position in -the file, so @code{hornNotes} is defined afterwards. The command -@code{\transpose f@tie{}c'} indicates that the argument, being -@code{\hornNotes}, should be transposed by a fifth upwards. Sounding -@samp{f} is denoted by notated @code{c'}, which corresponds with the -tuning of a normal French Horn in@tie{}F. The transposition can be seen -in the following output - -@lilypond[quote,ragged-right] -\transpose f c' \relative c { - \time 2/4 - r4 f8 a cis4 f e d -} -@end lilypond - -In ensemble pieces, one of the voices often does not play for many -measures. This is denoted by a special rest, the multi-measure -rest. It is entered with a capital @samp{R} followed by a duration -(@code{1}@tie{}for a whole note, @code{2}@tie{}for a half note, -etc.). By multiplying the -duration, longer rests can be constructed. For example, this rest -takes 3@tie{}measures in 2/4 time - -@example -R2*3 -@end example - -When printing the part, multi-rests -must be condensed. This is done by setting a run-time variable - -@example -\set Score.skipBars = ##t -@end example - -@noindent -This command sets the property @code{skipBars} in the -@code{Score} context to true (@code{##t}). Prepending the rest and -this option to the music above, leads to the following result - -@lilypond[quote,ragged-right] -\transpose f c' \relative c { - \time 2/4 - \set Score.skipBars = ##t - R2*3 - r4 f8 a cis4 f e d -} -@end lilypond - - -The score is made by combining all of the music together. Assuming -that the other voice is in @code{bassoonNotes} in the file -@file{bassoon-music.ly}, a score is made with - -@example -\include "bassoon-music.ly" -\include "horn-music.ly" - -<< - \new Staff \hornNotes - \new Staff \bassoonNotes ->> -@end example - -@noindent -leading to - -@lilypond[quote,ragged-right] -\relative c << - \new Staff { - \time 2/4 R2*3 - r4 f8 a cis4 f e d - } - \new Staff { - \clef bass - r4 d,8 f | gis4 c | b bes | - a8 e f4 | g d | gis f - } ->> -@end lilypond - -More in-depth information on preparing parts and scores can be found -in the notation manual; see @ref{Orchestral music}. - -Setting run-time variables (`properties') is discussed in -@ref{Changing context properties on the fly}. - @node After the tutorial -@section After the tutorial +@subsection After the tutorial After finishing the tutorial, you should probably try writing a -piece or two. Start with one of the @ref{Example templates} and +piece or two. Start with one of the @ref{Templates} and add notes. If you need any notation that was not covered in the tutorial, look at the Notation Reference, starting with @ref{Basic notation}. If you want to write for an instrument -ensemble which is not covered in the @ref{Example templates}, +ensemble which is not covered in the templates, take a look at @ref{Extending the templates}. Once you have written a few short pieces, read the rest of @@ -1394,3 +1466,24 @@ LilyPond input. You may wish to skim these chapters right now, and come back to them after you have more experience. +@node How to read the manual +@subsection How to read the manual + +As we saw in @ref{How to read the tutorial}, many examples in the +tutorial omitted a @code{\relative c'' @{ ... @}} around the printed +example. + +In the rest of the manual, we are much more lax about the +printed examples: sometimes they may have omitted a +@code{\relative c'' @{ ... @}}, but in other times a different initial +pitch may be used (such as @code{c'} or @code{c,,}), and in some cases +the whole example is in absolute note mode! However, ambiguities like +this only exist where the pitches are not important. In any example +where the pitch matters, we have explicitly stated our @code{\relative} +our our absolute-mode @code{@{ @}}. + +If you are still confused about the exact LilyPond input that was +used in an example, read the HTML version (if you are not already doing +so) and click on the picture of the music. This will display the exact +input that LilyPond used to generate this manual. + diff --git a/Documentation/user/tweaks.itely b/Documentation/user/tweaks.itely index b26704c13c..25a878120e 100644 --- a/Documentation/user/tweaks.itely +++ b/Documentation/user/tweaks.itely @@ -1,4 +1,12 @@ @c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Tweaking output @chapter Tweaking output @@ -13,6 +21,7 @@ configurable; virtually every fragment of output may be changed. * Default files:: * Fitting music onto fewer pages:: * Advanced tweaks with Scheme:: +* Avoiding tweaks with slower processing:: @end menu @@ -140,7 +149,7 @@ object. The same mechanism can be used to move other types of objects; simply replace @code{TextScript} with the name of another object. -To find the object name, look at the ``@strong{see also}'' at +To find the object name, look at the @q{@strong{see also}} at bottom of the relevant documentation page. For example, at the bottom of @ref{Dynamics}, we see @@ -243,9 +252,9 @@ f-5 f-5 @end lilypond - @item +@item Setting the @code{transparent} property will cause an object to be printed -in `invisible ink': the object is not printed, but all its other +in @q{invisible ink}: the object is not printed, but all its other behavior is retained. The object still takes up space, it takes part in collisions, and slurs, ties, and beams can be attached to it. @@ -389,7 +398,7 @@ require extra space. If these repeats are spread over two systems, they will take up more space than one system with the volta repeats and another system without. -Another example is moving dynamics which ``stick out'' of +Another example is moving dynamics which @q{stick out} of a system. @lilypond[verbatim,quote,fragment] @@ -485,3 +494,18 @@ pattern = #(define-music-function (parser location x y) (ly:music? ly:music?) } @end lilypond + +@node Avoiding tweaks with slower processing +@section Avoiding tweaks with slower processing + +LilyPond can perform extra checks while it processes files. These +commands will take extra time, but the result may require fewer +manual tweaks. + +@example +%% makes sure text scripts and lyrics are within the paper margins +\override Score.PaperColumn #'keep-inside-line = ##t +@end example + + + diff --git a/Documentation/user/working.itely b/Documentation/user/working.itely index ff343cf51e..97edb206c3 100644 --- a/Documentation/user/working.itely +++ b/Documentation/user/working.itely @@ -1,4 +1,12 @@ @c -*- coding: utf-8; mode: texinfo; -*- +@c This file is part of lilypond.tely +@ignore + Translation of GIT committish: FILL-IN-HEAD-COMMITTISH + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + @node Working on LilyPond projects @chapter Working on LilyPond projects @@ -71,7 +79,7 @@ which version of LilyPond you used. @item @strong{Include checks}: @ref{Bar check} and @ref{Octave check}. If you include checks every so often, then if you make a mistake, you can pinpoint -it quicker. How often is ``every so often''? It depends on the complexity +it quicker. How often is @q{every so often}? It depends on the complexity of the music. For very simple music, perhaps just once or twice. For very complex music, perhaps every bar. @@ -79,12 +87,12 @@ very complex music, perhaps every bar. either in the music itself or in the output you desire, it's often good to write only one bar per line. Saving screen space by cramming eight bars per line just isn't -worth it if you have to `debug' your files. +worth it if you have to @q{debug} your files. @item @strong{Comment your files}. Use either bar numbers (every so often) or -references to musical themes (``second theme in violins,'' ``fourth -variation'', etc). You may not need comments when you're writing the piece +references to musical themes (@q{second theme in violins,} @q{fourth +variation,} etc.). You may not need comments when you're writing the piece for the first time, but if you want to go back to change something two or three years later, or if you pass the source over to a friend, it will be much more @@ -181,6 +189,9 @@ g4\fthenp c'8. e16 @node Saving typing with identifiers and functions @section Saving typing with identifiers and functions +@cindex variables +@cindex identifiers + By this point, you've seen this kind of thing: @lilypond[quote,verbatim,ragged-right] @@ -520,7 +531,7 @@ prefers. The top of @file{music.ly} would then look like this: This approach can be useful even if you are only producing one set of parts. I use half a dozen different -``style sheet'' files for my projects. I begin every music +@q{style sheet} files for my projects. I begin every music file with @code{\include "../global.ly"}, which contains @example @@ -554,9 +565,9 @@ are listed in @ref{Updating files with convert-ly}. For example, in LilyPond 2.4 and earlier, accents and non-English letters were entered using LaTeX -- for example, -"@code{No\"el}" (this would print the French word for -`Christmas'). In LilyPond 2.6 and above, the special -"@code{ë}" must be entered directly into the LilyPond file as an +@samp{No\"el} (this would print the French word for +@q{Christmas}). In LilyPond 2.6 and above, the special +@samp{ë} must be entered directly into the LilyPond file as an UTF-8 character. @code{convert-ly} cannot change all the LaTeX special characters into UTF-8 characters; you must manually update your old LilyPond files. diff --git a/GNUmakefile.in b/GNUmakefile.in index 702eb6e902..4eea5f1791 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -35,7 +35,6 @@ include $(depth)/make/stepmake.make # # suggested settings # -# CHECK_SOURCE= # LILYPOND_JOBS= -djob-count=X ## for SMP/Multicore machine # include local.make @@ -101,14 +100,17 @@ local-WWW-post: rm -rf $(outdir)/offline-root $(PYTHON) $(buildscript-dir)/www_post.py $(PACKAGE_NAME) $(TOPLEVEL_VERSION) $(buildscript-dir) $(outdir) "$(WEB_TARGETS)" + tree-prefix = $(outdir) tree-bin = $(tree-prefix)/bin tree-lib = $(tree-prefix)/lib tree-share = $(tree-prefix)/share -tree-share-prefix = $(tree-share)/lilypond/$(TOPLEVEL_VERSION) -tree-share-prefix-current = $(tree-share)/lilypond/current -tree-lib-prefix = $(tree-lib)/lilypond/$(TOPLEVEL_VERSION) -tree-lib-prefix-current = $(tree-lib)/lilypond/current + +# Don't put version numbers here. During development +# they make no sense, and cause EPS files to become invalid. + +tree-share-prefix = $(tree-share)/lilypond/current +tree-lib-prefix = $(tree-lib)/lilypond/current C_DIRS = flower lily c-clean: @@ -133,9 +135,7 @@ $(tree-share-prefix)/lilypond-force link-tree: GNUmakefile $(outdir)/VERSION cd $(top-build-dir)/$(outbase) && rm -rf bin lib share mkdir -p $(tree-bin) mkdir -p $(tree-share-prefix) - ln -s $(TOPLEVEL_VERSION) $(tree-share-prefix-current) mkdir -p $(tree-lib-prefix) - ln -s $(TOPLEVEL_VERSION) $(tree-lib-prefix-current) mkdir -p $(tree-share-prefix)/elisp mkdir -p $(tree-share-prefix)/fonts mkdir -p $(tree-share-prefix)/fonts/otf @@ -206,18 +206,44 @@ $(config_h): config.hh.in @false -test-clean: - $(MAKE) -C input/regression/ out=test clean +################################################################ +# testing + +RESULT_DIR=$(top-build-dir)/out/test-results +OUT_TEST=test + test: -## no aa-scaling, no PDF - $(MAKE) -C input/regression/ out=test LILYPOND_BOOK_LILYPOND_FLAGS="--backend=eps --formats=ps,png $(LILYPOND_JOBS) -dinclude-eps-fonts -dgs-load-fonts --header=texidoc -I $(top-src-dir)/input/manual -dcheck-internal-types -ddump-signatures -danti-alias-factor=1" LILYPOND_BOOK_VERBOSE= out-test/collated-files.html - @find input ly -name '*.ly' |grep -v 'out.*/' | xargs grep '\\version' -L | sed 's/^/**** Missing version: /g' + rm -f input/regression/out-$(OUT_TEST)/collated-files.html + @echo -en 'For tracking crashes: use\n\n\t' + @echo 'grep sourcefilename `grep -L systems.texi input/regression/out-test/*log|sed s/log/ly/g`' + @echo + if test -d .git ; then \ + echo -e 'HEAD is:\n\n\t' ; \ + git log --max-count=1 --pretty=oneline ;\ + echo -e '\n\n\n' ; \ + git diff ; \ + fi > input/regression/out-test/tree.gittxt + $(MAKE) -C input/regression/ out=$(OUT_TEST) LILYPOND_BOOK_LILYPOND_FLAGS="--backend=eps --formats=ps $(LILYPOND_JOBS) -dseparate-log-files -dinclude-eps-fonts -dgs-load-fonts --header=texidoc -I $(top-src-dir)/input/manual -ddump-profile -dcheck-internal-types -ddump-signatures -danti-alias-factor=1" LILYPOND_BOOK_VERBOSE= out-$(OUT_TEST)/collated-files.html + @find input ly -name '*.ly' -print |grep -v 'out.*/' | xargs grep '\\version' -L | grep -v "standard input" |sed 's/^/**** Missing version: /g' +test-baseline: test + rm -rf input/regression/out-test-baseline + mv input/regression/out-test input/regression/out-test-baseline -RESULT_DIR=$(top-build-dir)/out/test-results/ -check-test: test +local-check: test rm -rf $(RESULT_DIR) mkdir -p $(RESULT_DIR) - $(PYTHON) $(buildscript-dir)/output-distance.py --output-dir $(RESULT_DIR) $(CHECK_SOURCE) input/regression/out-test/ + $(PYTHON) $(buildscript-dir)/output-distance.py --create-images --output-dir $(RESULT_DIR) input/regression/out-test-baseline input/regression/out-test/ + + +test-redo: + for a in `cat $(RESULT_DIR)/changed.txt` ; do \ + echo removing $$a* ; \ + rm -f $$a* ;\ + done + $(MAKE) check + +test-clean: + $(MAKE) -C input/regression/ out=$(OUT_TEST) clean diff --git a/THANKS b/THANKS index fcfed5e220..2e7cd7cf4a 100644 --- a/THANKS +++ b/THANKS @@ -1,4 +1,4 @@ -Release 2.10 +Release 2.11 ************ @@ -10,6 +10,7 @@ Jan Nieuwenhuizen - Core development Joe Neeman - Core development Graham Percival - Documentation Editor and Bug Meister Mats Bengtsson - Support Guru +John Mandereau - Translation Meister CONTRIBUTORS @@ -22,17 +23,48 @@ Mike Amundsen BUG HUNTERS/SUGGESTIONS +Alard de Boer +Arvid Grøtting Bertalan Fodor Benjamin Drung -David Bobroff Cameron Horsburgh +Carl Sorensen +Christian Hitz +David Bobroff +Daniel Johnson +Eduardo Vieira +Frédéric Chiasson +Georg Dummer +Jay Anderson +James Kilfinger +Jean-Marie Mouchel +Kazuhiro Suzuki +Laura Conrad +Luc Wehli Maarten Hijzelendoorn Matthijs Frankeno +Martijn Vromans +Marnen Laibow-Koser +Maximilian Albert +Mirosław Doroszewski +Nicolas Mayencourt +Nicolas Sceaux +Orm Finnendahl Phillip Kirlin +Ralph Palmer Rick Hansen +Roland Goretzki +Rune Zedeler +Ruud van Silfhout +Sean Reed +Steven Weber +Tomas Sauer Thomas Scharkowski Trevor Bača Werner Lemberg +Wilbert Berendsen +William Oram +Yota Moteuchi Release 2.10 diff --git a/VERSION b/VERSION index 30fb95aa47..1380565e9e 100644 --- a/VERSION +++ b/VERSION @@ -1,6 +1,6 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=2 MINOR_VERSION=11 -PATCH_LEVEL=5 +PATCH_LEVEL=13 MY_PATCH_LEVEL= diff --git a/buildscripts/add_html_footer.py b/buildscripts/add_html_footer.py index 2935d456cf..a7bc7e11d9 100644 --- a/buildscripts/add_html_footer.py +++ b/buildscripts/add_html_footer.py @@ -125,9 +125,14 @@ def do_file (prefix, lang_ext, target, header, footer, pages_dict, out_root, nam # Strip .html, .png suffix for auto language selection (content # negotiation). The menu must keep the full extension, so do # this before adding the menu. - page_flavors[file_name] = re.sub ( - '''(href|src)=[\'"]([^/][.]*[^.:\'"]*)(.html|.png)(#[^"\']*|)[\'"]''', - '\\1="\\2\\4"', s) + # Don't strip .html suffix for documentation index because of + # lilypond/ vs. lilypond.html conflict + if prefix == 'Documentation/out-www/index': + page_flavors[file_name] = s + else: + page_flavors[file_name] = re.sub ( + '''(href|src)=[\'"]([^/][.]*[^.:\'"]*)(.html|.png)(#[^"\']*|)[\'"]''', + '\\1="\\2\\4"', s) elif target == 'offline': if lang_ext == '': page_flavors[file_name] = s diff --git a/buildscripts/build-coverage.sh b/buildscripts/build-coverage.sh new file mode 100755 index 0000000000..b86ebaaf52 --- /dev/null +++ b/buildscripts/build-coverage.sh @@ -0,0 +1,67 @@ +#!/bin/sh + +if test "$1" == "--fresh"; then + fresh=yes +fi + +if test ! -f config-cov.make; then + fresh=yes +fi + +if test "$fresh" = "yes"; +then + ./configure --enable-config=cov --disable-optimising \ + && make conf=cov -j2 clean \ + && perl -i~ -pe 's/-pipe /-fprofile-arcs -ftest-coverage -pipe /g' config-cov.make \ + && perl -i~ -pe 's/ -ldl / -lgcov -ldl /g' config-cov.make +else + find -name '*.gcda' -exec rm '{}' ';' +fi + +mkdir -p scripts/out-cov/ +touch scripts/out-cov/midi2ly scripts/out-cov/midi2ly.1 +make conf=cov -j2 && \ + make conf=cov test-clean OUT_TEST=testcov LILYPOND_JOBS= && \ + make conf=cov test OUT_TEST=testcov LILYPOND_JOBS='-dtrace-scheme-coverage ' + +if test "$?" != "0"; then + tail -100 out-cov/test-run.log + exit 1 +fi + +depth=../.. +resultdir=out/coverage-results + +rm -rf $resultdir +mkdir $resultdir +cd $resultdir + +ln $depth/lily/* . +ln $depth/scm/*.scm . +mv $depth/input/regression/out-testcov/*.scm.cov . +ln $depth/ly/*.ly . +ln $depth/lily/out-cov/*[ch] . +mkdir include +ln $depth/lily/include/* include/ +ln $depth/flower/include/* include/ +for a in *[cl] *.yy +do + gcov -o $depth/lily/out-cov/ -p $a > $a.gcov-summary +done + +python $depth/buildscripts/coverage.py --uncovered *.cc > uncovered.txt +python $depth/buildscripts/coverage.py --hotspots *.cc > hotspots.txt +python $depth/buildscripts/coverage.py --summary *.cc > summary.txt +python $depth/buildscripts/coverage.py --uncovered *.scm > uncovered-scheme.txt + +head -20 summary.txt + +cat < long-score.ly << EOF +\version "2.10.0" +foo = \new Staff \new Voice \repeat unfold 50 \relative { c4 d8[ d16( e]~ e16[ e e) f] g8 } +\score { + \new ChoirStaff << + \foo \foo \foo \foo + \foo \foo \foo \foo + + >> + \midi {} + \layout {} +} +EOF + +rm gmon.sum + +exe=$depth/out-prof/bin/lilypond + +## todo: figure out representative sample. +files="wtk1-fugue2 wtk1-fugue2 wtk1-fugue2 wtk1-fugue2 mozart-hrn-3 mozart-hrn-3 long-score" + + + +$exe -ddump-profile --formats=ps -I $depth/input/ -I $depth/input/mutopia/J.S.Bach/ \ + -I $depth/input/mutopia/W.A.Mozart/ \ + $files + + +for a in *.profile; do + echo $a + cat $a +done + +echo 'running gprof' +gprof $exe > profile + +exit 0 + + +## gprof -s takes forever. +for a in seq 1 3; do + for f in $files ; do + $exe -ddump-profile --formats=ps -I $depth/input/ -I $depth/input/mutopia/J.S.Bach/ \ + -I $depth/input/mutopia/W.A.Mozart/ \ + $f + + echo 'running gprof' + if test -f gmon.sum ; then + gprof -s $exe gmon.out gmon.sum + else + mv gmon.out gmon.sum + fi + done +done + +gprof $exe gmon.sum > profile diff --git a/buildscripts/check_translation.py b/buildscripts/check_translation.py new file mode 100644 index 0000000000..35ab59ee5f --- /dev/null +++ b/buildscripts/check_translation.py @@ -0,0 +1,88 @@ +#!@PYTHON@ + +import __main__ +import optparse +import gettext +import os +import re +import sys + +verbose = 0 +lang = 'site' +C = lang + +def dir_lang (file, lang): + path_components = [lang] + file.split ('/')[1:] + return os.path.join (*path_components) + +## Translation of GIT Commit: +REVISION_RE = re.compile ('.*GIT [Cc]ommittish: ([a-f0-9]+)', re.DOTALL) +CVS_DIFF = 'git diff %(revision)s HEAD -- %(original)s | cat' + +def check_file (original, translated): + s = open (translated).read () + m = REVISION_RE.match (s) + if not m: + raise translated + ': no GIT committish: found' + revision = m.group (1) + + c = CVS_DIFF % vars () + if verbose: + sys.stderr.write ('running: ' + c) + os.system (c) + +def do_file (file_name, langdefs): + if verbose: + sys.stderr.write ('%s...\n' % file_name) + file_lang = file_name.split ('/')[0] + if file_lang in langdefs.LANGDICT.keys(): + check_lang = file_lang + else: + check_lang = lang + if check_lang == C: + raise 'cannot determine language for: ' + file_name + + original = dir_lang (file_name, '') + translated = dir_lang (file_name, check_lang) + check_file (original, translated) + +def usage (): + sys.stdout.write (r''' +Usage: +check-translation [--language=LANG] [--verbose] BUILDSCRIPT-DIR FILE... + +This script is licensed under the GNU GPL. +''') + +def do_options (): + global lang, verbose + + p = optparse.OptionParser (usage="check-translation [--language=LANG] [--verbose] FILE...", + description="This script is licensed under the GNU GPL.") + p.add_option ("--language", + action='store', + default='site', + dest="language") + p.add_option ("--verbose", + action='store_true', + default=False, + dest="verbose", + help="the GIT directory to merge.") + + (options, files) = p.parse_args () + verbose = options.verbose + lang = options.language + + return (files[0], files[1:]) + +def main (): + import_path, files = do_options () + + sys.path.append (import_path) + import langdefs + + for i in files: + do_file (i, langdefs) + +if __name__ == '__main__': + main () diff --git a/buildscripts/coverage.py b/buildscripts/coverage.py index 8b988d0dde..0b3b2b7aaf 100644 --- a/buildscripts/coverage.py +++ b/buildscripts/coverage.py @@ -2,48 +2,243 @@ import os import glob import re +import sys +import optparse -cmds = """ -./configure --enable-config=cov --disable-optimising -make conf=cov -j2 -make conf=cov test LILYPOND_JOBS= +#File 'accidental-engraver.cc' +#Lines executed:87.70% of 252 -cd out-cov -ln ../lily/* . -ln ../lily/out-conv/*cc . -mkdir include -ln ../lily/include/* include/ -for a in *[cyl] ; do gcov -o ../lily/out-cov/ -p $a > $a.gcov-summary ; done -""" +def summary (args): + results = [] + for f in args: + str = open (f).read () + m = re.search ("File '([^']+.cc)'\s*Lines executed:([0-9.]+)% of ([0-9]+)", str) -cmds = '' + if m and '/usr/lib' in m.group (1): + continue -for c in cmds.split ('\n'): - os.system (c) + if m: + cov = float (m.group (2)) + lines = int (m.group (3)) + pain = lines * (100.0 - cov) + file = m.group (1) + tup = (pain, locals ().copy()) -os.chdir ('out-cov') + results.append(tup) -#File 'accidental-engraver.cc' -#Lines executed:87.70% of 252 + results.sort () + results.reverse() -results = [] -for f in glob.glob ('*.gcov-summary'): - str = open (f).read () - m = re.search ("File '([^']+.cc)'\s*Lines executed:([0-9.]+)% of ([0-9]+)", str) - if '/usr/lib' in m.group (1): - continue - - if m: - cov = float (m.group (2)) - lines = int (m.group (3)) - pain = lines * (100.0 - cov) - file = m.group (1) - tup = (pain, locals ().copy()) + print 'files sorted by number of untested lines (decreasing)' + print + print '%5s (%6s): %s' % ('cov %', 'lines', 'file') + print '----------------------------------------------' + + for (pain, d) in results: + print '%(cov)5.2f (%(lines)6d): %(file)s' % d + +class Chunk: + def __init__ (self, range, coverage_count, all_lines, file): + assert coverage_count >= 0 + assert type (range) == type (()) + + self.coverage_count = coverage_count + self.range = range + self.all_lines = all_lines + self.file = file + + def length (self): + return self.range[1] - self.range[0] + + def text (self): + return ''.join ([l[2] for l in self.lines()]) + + def lines (self): + return self.all_lines[self.range[0]: + self.range[1]] + def widen (self): + self.range = (min (self.range[0] -1, 0), + self.range[0] +1) + def write (self): + print 'chunk in', self.file + for (c, n, l) in self.lines (): + cov = '%d' % c + if c == 0: + cov = '#######' + elif c < 0: + cov = '' + sys.stdout.write ('%8s:%8d:%s' % (cov, n, l)) + + def uncovered_score (self): + return self.length () + +class SchemeChunk (Chunk): + def uncovered_score (self): + text = self.text () + if (text.startswith ('(define ') + and not text.startswith ('(define (')): + return 0 + + if (text.startswith ('(define-public ') + and not text.startswith ('(define-public (')): + return 0 + + return len ([l for (c,n,l) in self.lines() if (c == 0)]) + +def read_gcov (f): + ls = [] + + in_lines = [l for l in open (f).readlines ()] + (count_len, line_num_len) = tuple (map (len, in_lines[0].split (':')[:2])) + + for l in in_lines: + c = l[:count_len].strip () + l = l[count_len+1:] + n = int (l[:line_num_len].strip ()) + + if n == 0: + continue + + if '#' in c: + c = 0 + elif c == '-': + c = -1 + else: + c = int (c) + + l = l[line_num_len+1:] + + ls.append ((c,n,l)) + + return ls + +def get_c_chunks (ls, file): + chunks = [] + chunk = [] + + last_c = -1 + for (c, n, l) in ls: + if not (c == last_c or c < 0 and l != '}\n'): + if chunk and last_c >= 0: + nums = [n-1 for (n, l) in chunk] + chunks.append (Chunk ((min (nums), max (nums)+1), + last_c, ls, file)) + chunk = [] + + chunk.append ((n,l)) + if c >= 0: + last_c = c + + return chunks + +def get_scm_chunks (ls, file): + chunks = [] + chunk = [] + + def new_chunk (): + if chunk: + nums = [n-1 for (n, l) in chunk] + chunks.append (SchemeChunk ((min (nums), max (nums)+1), + max (last_c, 0), ls, file)) + chunk[:] = [] + + last_c = -1 + for (cov_count, line_number, line) in ls: + if line.startswith ('('): + new_chunk () + last_c = -1 + + chunk.append ((line_number, line)) + if cov_count >= 0: + last_c = cov_count + + return chunks + +def widen_chunk (ch, ls): + a -= 1 + b += 1 + + return [(n, l) for (c, n, l) in ls[a:b]] + + +def extract_chunks (file): + try: + ls = read_gcov (file) + except IOError, s : + print s + return [] - results.append(tup) + cs = [] + if 'scm' in file: + cs = get_scm_chunks (ls, file) + else: + cs = get_c_chunks (ls, file) + return cs + + +def filter_uncovered (chunks): + def interesting (c): + if c.coverage_count > 0: + return False + + t = c.text() + for stat in ('warning', 'error', 'print', 'scm_gc_mark'): + if stat in t: + return False + return True + + return [c for c in chunks if interesting (c)] + -results.sort () -results.reverse() -for (pain, d) in results: - print '%(cov)5.2f (%(lines)6d): %(file)s' % d +def main (): + p = optparse.OptionParser (usage="usage coverage.py [options] files", + description="") + p.add_option ("--summary", + action='store_true', + default=False, + dest="summary") + + p.add_option ("--hotspots", + default=False, + action='store_true', + dest="hotspots") + + p.add_option ("--uncovered", + default=False, + action='store_true', + dest="uncovered") + + (options, args) = p.parse_args () + + + if options.summary: + summary (['%s.gcov-summary' % s for s in args]) + + if options.uncovered or options.hotspots: + chunks = [] + for a in args: + name = a + if name.endswith ('scm'): + name += '.cov' + else: + name += '.gcov' + + chunks += extract_chunks (name) + + if options.uncovered: + chunks = filter_uncovered (chunks) + chunks = [(c.uncovered_score (), c) for c in chunks] + elif options.hotspots: + chunks = [((c.coverage_count, -c.length()), c) for c in chunks] + + + chunks.sort () + chunks.reverse () + for (score, c) in chunks: + c.write () + + + +if __name__ == '__main__': + main () diff --git a/buildscripts/makelsr.py b/buildscripts/makelsr.py new file mode 100755 index 0000000000..3f70827299 --- /dev/null +++ b/buildscripts/makelsr.py @@ -0,0 +1,34 @@ +#!/usr/bin/python +import sys +import os +import os.path +import shutil + +dirs = ['advanced','trick'] + +try: + in_dir = sys.argv[1] +except: + print "Please specify input_file." + sys.exit() + +for dir in dirs: + srcdir = os.path.join (in_dir, dir) + destdir = os.path.join ('input', 'lsr', dir) + if not(os.path.isdir(destdir)): + print "Please run this script from the head of the source tree," + print " and/or check that you have the right categories." + sys.exit() + + file_names = os.listdir (destdir) + for file in file_names: + if (file.endswith ('.ly')): + if (file[:3] != 'AAA'): + os.remove( os.path.join(destdir,file) ) + + file_names = os.listdir (in_dir + dir) + for file in file_names: + src = os.path.join (srcdir, file) + dest = os.path.join (destdir, file) + shutil.copyfile (src, dest) + diff --git a/buildscripts/mf-to-table.py b/buildscripts/mf-to-table.py index e8984600ae..c94d402e79 100644 --- a/buildscripts/mf-to-table.py +++ b/buildscripts/mf-to-table.py @@ -256,4 +256,5 @@ for filenm in files: if depfile_nm: write_deps (open (depfile_nm, 'wb'), deps, [base + '.log', base + '.dvi', base + '.pfa', - base + '.pfb', texfile_nm]) + depfile_nm, + base + '.pfb', texfile_nm]) diff --git a/buildscripts/output-distance.py b/buildscripts/output-distance.py index 5a83c490d0..e56b1e477d 100644 --- a/buildscripts/output-distance.py +++ b/buildscripts/output-distance.py @@ -2,13 +2,12 @@ import sys import optparse import os +import math ## so we can call directly as buildscripts/output-distance.py me_path = os.path.abspath (os.path.split (sys.argv[0])[0]) sys.path.insert (0, me_path + '/../python/') - - -import safeeval +sys.path.insert (0, me_path + '/../python/out/') X_AXIS = 0 @@ -19,6 +18,38 @@ OUTPUT_EXPRESSION_PENALTY = 1 ORPHAN_GROB_PENALTY = 1 options = None +################################################################ +# system interface. +temp_dir = None +class TempDirectory: + def __init__ (self): + import tempfile + self.dir = tempfile.mkdtemp () + print 'dir is', self.dir + def __del__ (self): + print 'rm -rf %s' % self.dir + os.system ('rm -rf %s' % self.dir ) + def __call__ (self): + return self.dir + + +def get_temp_dir (): + global temp_dir + if not temp_dir: + temp_dir = TempDirectory () + return temp_dir () + +def read_pipe (c): + print 'pipe' , c + return os.popen (c).read () + +def system (c): + print 'system' , c + s = os.system (c) + if s : + raise Exception ("failed") + return + def shorten_string (s): threshold = 15 if len (s) > 2*threshold: @@ -34,6 +65,38 @@ def max_distance (x1, x2): return dist +def compare_png_images (old, new, dest_dir): + def png_dims (f): + m = re.search ('([0-9]+) x ([0-9]+)', read_pipe ('file %s' % f)) + + return tuple (map (int, m.groups ())) + + dest = os.path.join (dest_dir, new.replace ('.png', '.compare.jpeg')) + try: + dims1 = png_dims (old) + dims2 = png_dims (new) + except AttributeError: + ## hmmm. what to do? + system ('touch %(dest)s' % locals ()) + return + + dims = (min (dims1[0], dims2[0]), + min (dims1[1], dims2[1])) + + dir = get_temp_dir () + system ('convert -depth 8 -crop %dx%d+0+0 %s %s/crop1.png' % (dims + (old, dir))) + system ('convert -depth 8 -crop %dx%d+0+0 %s %s/crop2.png' % (dims + (new, dir))) + + system ('compare -depth 8 %(dir)s/crop1.png %(dir)s/crop2.png %(dir)s/diff.png' % locals ()) + + system ("convert -depth 8 %(dir)s/diff.png -blur 0x3 -negate -channel alpha,blue -type TrueColorMatte -fx 'intensity' %(dir)s/matte.png" % locals ()) + + system ("composite -quality 65 %(dir)s/matte.png %(new)s %(dest)s" % locals ()) + + +################################################################ +# interval/bbox arithmetic. + empty_interval = (INFTY, -INFTY) empty_bbox = (empty_interval, empty_interval) @@ -274,107 +337,218 @@ def read_signature_file (name): ################################################################ # different systems of a .ly file. -def read_pipe (c): - print 'pipe' , c - return os.popen (c).read () - -def system (c): - print 'system' , c - s = os.system (c) - if s : - raise Exception ("failed") - return - -def compare_png_images (old, new, dir): - def png_dims (f): - m = re.search ('([0-9]+) x ([0-9]+)', read_pipe ('file %s' % f)) - - return tuple (map (int, m.groups ())) - - dest = os.path.join (dir, new.replace ('.png', '.compare.jpeg')) - try: - dims1 = png_dims (old) - dims2 = png_dims (new) - except AttributeError: - ## hmmm. what to do? - system ('touch %(dest)s' % locals ()) - return - - dims = (min (dims1[0], dims2[0]), - min (dims1[1], dims2[1])) - - system ('convert -depth 8 -crop %dx%d+0+0 %s crop1.png' % (dims + (old,))) - system ('convert -depth 8 -crop %dx%d+0+0 %s crop2.png' % (dims + (new,))) - - system ('compare -depth 8 crop1.png crop2.png diff.png') - system ("convert -depth 8 diff.png -blur 0x3 -negate -channel alpha,blue -type TrueColorMatte -fx 'intensity' matte.png") - - system ("composite -quality 65 matte.png %(new)s %(dest)s" % locals ()) +hash_to_original_name = {} class FileLink: + def __init__ (self, f1, f2): + self._distance = None + self.file_names = (f1, f2) + def text_record_string (self): return '%-30f %-20s\n' % (self.distance (), self.name ()) - def distance (self): + def calc_distance (self): return 0.0 + def distance (self): + if self._distance == None: + self._distance = self.calc_distance () + + return self._distance + + def name (self): + base = os.path.basename (self.file_names[1]) + base = os.path.splitext (base)[0] + + base = hash_to_original_name.get (base, base) + base = os.path.splitext (base)[0] + return base + + def extension (self): + return os.path.splitext (self.file_names[1])[1] + + def link_files_for_html (self, dest_dir): + for f in self.file_names: + link_file (f, os.path.join (dest_dir, f)) + + def get_distance_details (self): + return '' + + def get_cell (self, oldnew): return '' - def link_files_for_html (self, old_dir, new_dir, dest_dir): - pass + def get_file (self, oldnew): + return self.file_names[oldnew] + + def html_record_string (self, dest_dir): + dist = self.distance() + + details = self.get_distance_details () + if details: + details_base = os.path.splitext (self.file_names[1])[0] + details_base += '.details.html' + fn = dest_dir + '/' + details_base + open_write_file (fn).write (details) + + details = '
(details)' % locals () + + cell1 = self.get_cell (0) + cell2 = self.get_cell (1) - def write_html_system_details (self, dir1, dir2, dest_dir): - pass + name = self.name () + self.extension () + file1 = self.get_file (0) + file2 = self.get_file (1) - def html_record_string (self, old_dir, new_dir): - return '' + return ''' + +%(dist)f +%(details)s + +%(cell1)s
%(name)s +%(cell2)s
%(name)s +''' % locals () + + +class FileCompareLink (FileLink): + def __init__ (self, f1, f2): + FileLink.__init__ (self, f1, f2) + self.contents = (self.get_content (self.file_names[0]), + self.get_content (self.file_names[1])) + + + def calc_distance (self): + ## todo: could use import MIDI to pinpoint + ## what & where changed. -class MidiFileLink (FileLink): - def get_midi (self, f): + if self.contents[0] == self.contents[1]: + return 0.0 + else: + return 100.0; + + def get_content (self, f): + print 'reading', f s = open (f).read () - s = re.sub ('LilyPond [0-9.]+', '', s) return s + + +class GitFileCompareLink (FileCompareLink): + def get_cell (self, oldnew): + str = self.contents[oldnew] + + # truncate long lines + str = '\n'.join ([l[:80] for l in str.split ('\n')]) + + + str = '
%s
' % str + return str - def __init__ (self, f1, f2): - self.files = (f1, f2) + def calc_distance (self): + if self.contents[0] == self.contents[1]: + d = 0.0 + else: + d = 1.0001 *options.threshold + + return d + +class TextFileCompareLink (FileCompareLink): + def calc_distance (self): + import difflib + diff = difflib.unified_diff (self.contents[0].strip().split ('\n'), + self.contents[1].strip().split ('\n'), + fromfiledate = self.file_names[0], + tofiledate = self.file_names[1] + ) + + self.diff_lines = [l for l in diff] + self.diff_lines = self.diff_lines[2:] + + return math.sqrt (float (len ([l for l in self.diff_lines if l[0] in '-+']))) + + def get_cell (self, oldnew): + str = '' + if oldnew == 1: + str = '\n'.join ([d.replace ('\n','') for d in self.diff_lines]) + str = '
%s
' % str + return str - s1 = self.get_midi (self.files[0]) - s2 = self.get_midi (self.files[1]) - self.same = (s1 == s2) +class ProfileFileLink (FileCompareLink): + def __init__ (self, f1, f2): + FileCompareLink.__init__ (self, f1, f2) + self.results = [{}, {}] + + def get_cell (self, oldnew): + str = '' + for k in ('time', 'cells'): + if oldnew==0: + str += '%-8s: %d\n' % (k, int (self.results[oldnew][k])) + else: + str += '%-8s: %8d (%5.3f)\n' % (k, int (self.results[oldnew][k]), + self.get_ratio (k)) + + return '
%s
' % str + + def get_ratio (self, key): + (v1,v2) = (self.results[0].get (key, -1), + self.results[1].get (key, -1)) + + if v1 <= 0 or v2 <= 0: + return 0.0 + + return (v1 - v2) / float (v1+v2) + + def calc_distance (self): + for oldnew in (0,1): + def note_info (m): + self.results[oldnew][m.group(1)] = float (m.group (2)) + + re.sub ('([a-z]+): ([-0-9.]+)\n', + note_info, self.contents[oldnew]) + + dist = 0.0 + factor = {'time': 2.0 , + 'cells': 5.0, + } - def name (self): - name = os.path.split (self.files[0])[1] - name = re.sub ('.midi', '', name) - return name + for k in ('time', 'cells'): + real_val = math.tan (self.get_ratio (k) * 0.5* math.pi) + dist += math.exp (math.fabs (real_val) * factor[k]) - 1 + + dist = min (dist, 100) + return dist + + +class MidiFileLink (TextFileCompareLink): + def get_content (self, oldnew): + import midi - def distance (self): - ## todo: could use import MIDI to pinpoint - ## what & where changed. - if self.same: - return 0 - else: - return 100; - def html_record_string (self, d1, d2): - return ''' - -%f - -%s -%s -''' % ((self.distance(),) + self.files) + data = FileCompareLink.get_content (self, oldnew) + midi = midi.parse (data) + tracks = midi[1] + + str = '' + j = 0 + for t in tracks: + str += 'track %d' % j + j += 1 + + for e in t: + ev_str = repr (e) + if re.search ('LilyPond [0-9.]+', ev_str): + continue + + str += ' ev %s\n' % `e` + return str + + class SignatureFileLink (FileLink): - def __init__ (self): - self.original_name = '' - self.base_names = ('','') + def __init__ (self, f1, f2 ): + FileLink.__init__ (self, f1, f2) self.system_links = {} - self._distance = None - def name (self): - return self.original_name - + def add_system_link (self, link, number): self.system_links[number] = link @@ -388,12 +562,6 @@ class SignatureFileLink (FileLink): return d + orphan_distance - def distance (self): - if type (self._distance) != type (0.0): - return self.calc_distance () - - return self._distance - def source_file (self): for ext in ('.ly', '.ly.txt'): if os.path.exists (self.base_names[1] + ext): @@ -414,19 +582,16 @@ class SignatureFileLink (FileLink): os.path.normpath (base2)) def note_original (match): - self.original_name = match.group (1) + hash_to_original_name[os.path.basename (self.base_names[1])] = match.group (1) return '' - if not self.original_name: - self.original_name = os.path.split (base1)[1] - - ## ugh: drop the .ly.txt - for ext in ('.ly', '.ly.txt'): - try: - re.sub (r'\\sourcefilename "([^"]+)"', - note_original, open (base1 + ext).read ()) - except IOError: - pass + ## ugh: drop the .ly.txt + for ext in ('.ly', '.ly.txt'): + try: + re.sub (r'\\sourcefilename "([^"]+)"', + note_original, open (base1 + ext).read ()) + except IOError: + pass s1 = read_signature_file (f1) s2 = read_signature_file (f2) @@ -435,23 +600,53 @@ class SignatureFileLink (FileLink): self.add_system_link (link, system_index[0]) - def link_files_for_html (self, old_dir, new_dir, dest_dir): - png_linked = [[], []] - for ext in ('.png', '.ly', '-page*png'): - + + def create_images (self, dest_dir): + + files_created = [[], []] + for oldnew in (0, 1): + pat = self.base_names[oldnew] + '.eps' + + for f in glob.glob (pat): + infile = f + outfile = (dest_dir + '/' + f).replace ('.eps', '.png') + + mkdir (os.path.split (outfile)[0]) + cmd = ('gs -sDEVICE=png16m -dGraphicsAlphaBits=4 -dTextAlphaBits=4 ' + ' -r101 ' + ' -sOutputFile=%(outfile)s -dNOSAFER -dEPSCrop -q -dNOPAUSE ' + ' %(infile)s -c quit ' % locals ()) + + files_created[oldnew].append (outfile) + system (cmd) + + return files_created + + def link_files_for_html (self, dest_dir): + FileLink.link_files_for_html (self, dest_dir) + to_compare = [[], []] + + exts = [] + if options.create_images: + to_compare = self.create_images (dest_dir) + else: + exts += ['.png', '-page*png'] + + for ext in exts: for oldnew in (0,1): for f in glob.glob (self.base_names[oldnew] + ext): dst = dest_dir + '/' + f link_file (f, dst) if f.endswith ('.png'): - png_linked[oldnew].append (f) + to_compare[oldnew].append (f) if options.compare_images: - for (old,new) in zip (png_linked[0], png_linked[1]): + for (old, new) in zip (to_compare[0], to_compare[1]): compare_png_images (old, new, dest_dir) - - def html_record_string (self, old_dir, new_dir): + + + def get_cell (self, oldnew): def img_cell (ly, img, name): if not name: name = 'source' @@ -459,15 +654,10 @@ class SignatureFileLink (FileLink): name = '%s' % name return ''' -

-(%(name)s) - - ''' % locals () - def multi_img_cell (ly, imgs, name): if not name: name = 'source' @@ -481,11 +671,7 @@ class SignatureFileLink (FileLink): return ''' - %(imgs_str)s -(%(name)s) - - ''' % locals () @@ -498,32 +684,17 @@ class SignatureFileLink (FileLink): return multi_img_cell (base + '.ly', sorted (pages), name) else: return img_cell (base + '.ly', base + '.png', name) - - - html_2 = self.base_names[1] + '.html' - name = self.original_name - cell_1 = cell (self.base_names[0], name) - cell_2 = cell (self.base_names[1], name) - if options.compare_images: - cell_2 = cell_2.replace ('.png', '.compare.jpeg') - - html_entry = ''' - - -%f
-(details) - -%s -%s - -''' % (self.distance (), html_2, cell_1, cell_2) - return html_entry + str = cell (os.path.splitext (self.file_names[oldnew])[0], self.name ()) + if options.compare_images and oldnew == 1: + str = str.replace ('.png', '.compare.jpeg') + + return str - def html_system_details_string (self): + def get_distance_details (self): systems = self.system_links.items () systems.sort () @@ -547,7 +718,7 @@ class SignatureFileLink (FileLink): e = '%s' % e html += e - original = self.original_name + original = self.name () html = ''' comparison details for %(original)s @@ -569,11 +740,6 @@ class SignatureFileLink (FileLink): ''' % locals () return html - def write_html_system_details (self, dir1, dir2, dest_dir): - dest_file = os.path.join (dest_dir, self.base_names[1] + '.html') - - details = open_write_file (dest_file) - details.write (self.html_system_details_string ()) ################################################################ # Files/directories @@ -581,8 +747,6 @@ class SignatureFileLink (FileLink): import glob import re - - def compare_signature_files (f1, f2): s1 = read_signature_file (f1) s2 = read_signature_file (f2) @@ -596,20 +760,23 @@ def paired_files (dir1, dir2, pattern): Return (PAIRED, MISSING-FROM-2, MISSING-FROM-1) """ - - files1 = dict ((os.path.split (f)[1], 1) for f in glob.glob (dir1 + '/' + pattern)) - files2 = dict ((os.path.split (f)[1], 1) for f in glob.glob (dir2 + '/' + pattern)) + files = [] + for d in (dir1,dir2): + found = [os.path.split (f)[1] for f in glob.glob (d + '/' + pattern)] + found = dict ((f, 1) for f in found) + files.append (found) + pairs = [] missing = [] - for f in files1.keys (): + for f in files[0].keys (): try: - files2.pop (f) + files[1].pop (f) pairs.append (f) except KeyError: missing.append (f) - return (pairs, files2.keys (), missing) + return (pairs, files[1].keys (), missing) class ComparisonData: def __init__ (self): @@ -633,7 +800,7 @@ class ComparisonData: self.compare_trees (d1, d2) def compare_directories (self, dir1, dir2): - for ext in ['signature', 'midi']: + for ext in ['signature', 'midi', 'log', 'profile', 'gittxt']: (paired, m1, m2) = paired_files (dir1, dir2, '*.' + ext) self.missing += [(dir1, m) for m in m1] @@ -642,7 +809,6 @@ class ComparisonData: for p in paired: if (options.max_count and len (self.file_links) > options.max_count): - continue f2 = dir2 + '/' + p @@ -652,13 +818,22 @@ class ComparisonData: def compare_files (self, f1, f2): if f1.endswith ('signature'): self.compare_signature_files (f1, f2) - elif f1.endswith ('midi'): - self.compare_midi_files (f1, f2) + else: + ext = os.path.splitext (f1)[1] + klasses = { + '.midi': MidiFileLink, + '.log' : TextFileCompareLink, + '.profile': ProfileFileLink, + '.gittxt': GitFileCompareLink, + } - def compare_midi_files (self, f1, f2): + if klasses.has_key (ext): + self.compare_general_files (klasses[ext], f1, f2) + + def compare_general_files (self, klass, f1, f2): name = os.path.split (f1)[1] - file_link = MidiFileLink (f1, f2) + file_link = klass (f1, f2) self.file_links[name] = file_link def compare_signature_files (self, f1, f2): @@ -669,11 +844,35 @@ class ComparisonData: try: file_link = self.file_links[name] except KeyError: - file_link = SignatureFileLink () + generic_f1 = re.sub ('-[0-9]+.signature', '.ly', f1) + generic_f2 = re.sub ('-[0-9]+.signature', '.ly', f2) + file_link = SignatureFileLink (generic_f1, generic_f2) self.file_links[name] = file_link file_link.add_file_compare (f1, f2) + def write_changed (self, dest_dir, threshold): + (changed, below, unchanged) = self.thresholded_results (threshold) + + str = '\n'.join ([os.path.splitext (link.file_names[1])[0] + for link in changed]) + fn = dest_dir + '/changed.txt' + + open_write_file (fn).write (str) + + def thresholded_results (self, threshold): + ## todo: support more scores. + results = [(link.distance(), link) + for link in self.file_links.values ()] + results.sort () + results.reverse () + + unchanged = [r for (d,r) in results if d == 0.0] + below = [r for (d,r) in results if threshold >= d > 0.0] + changed = [r for (d,r) in results if d > threshold] + + return (changed, below, unchanged) + def write_text_result_page (self, filename, threshold): out = None if filename == '': @@ -682,21 +881,15 @@ class ComparisonData: print 'writing "%s"' % filename out = open_write_file (filename) - ## todo: support more scores. - results = [(link.distance(), link) - for link in self.file_links.values ()] - results.sort () - results.reverse () + (changed, below, unchanged) = self.thresholded_results (threshold) - for (score, link) in results: - if score > threshold: - out.write (link.text_record_string ()) + for link in changed: + out.write (link.text_record_string ()) out.write ('\n\n') - out.write ('%d below threshold\n' % len ([1 for s,l in results - if threshold >= s > 0.0])) - out.write ('%d unchanged\n' % len ([1 for (s,l) in results if s == 0.0])) + out.write ('%d below threshold\n' % len (below)) + out.write ('%d unchanged\n' % len (unchanged)) def create_text_result_page (self, dir1, dir2, dest_dir, threshold): self.write_text_result_page (dest_dir + '/index.txt', threshold) @@ -704,22 +897,14 @@ class ComparisonData: def create_html_result_page (self, dir1, dir2, dest_dir, threshold): dir1 = dir1.replace ('//', '/') dir2 = dir2.replace ('//', '/') - - results = [(link.distance(), link) - for link in self.file_links.values ()] - results.sort () - results.reverse () + + (changed, below, unchanged) = self.thresholded_results (threshold) + html = '' old_prefix = os.path.split (dir1)[1] - for (score, link) in results: - if score <= threshold: - continue - - link.link_files_for_html (dir1, dir2, dest_dir) - link.write_html_system_details (dir1, dir2, dest_dir) - - html += link.html_record_string (dir1, dir2) + for link in changed: + html += link.html_record_string (dest_dir) short_dir1 = shorten_string (dir1) @@ -736,19 +921,21 @@ class ComparisonData: ''' % locals() html += ('

') - below_count =len ([1 for s,l in results - if threshold >= s > 0.0]) + below_count = len (below) if below_count: html += ('

%d below threshold

' % below_count) - - html += ('

%d unchanged

' - % len ([1 for (s,l) in results if s == 0.0])) - + + html += ('

%d unchanged

' % len (unchanged)) dest_file = dest_dir + '/index.html' open_write_file (dest_file).write (html) + + + for link in changed: + link.link_files_for_html (dest_dir) + def print_results (self, threshold): self.write_text_result_page ('', threshold) @@ -760,6 +947,7 @@ def compare_trees (dir1, dir2, dest_dir, threshold): if os.path.isdir (dest_dir): system ('rm -rf %s '% dest_dir) + data.write_changed (dest_dir, threshold) data.create_html_result_page (dir1, dir2, dest_dir, threshold) data.create_text_result_page (dir1, dir2, dest_dir, threshold) @@ -774,6 +962,7 @@ def mkdir (x): def link_file (x, y): mkdir (os.path.split (y)[0]) try: + print x, '->', y os.link (x, y) except OSError, z: print 'OSError', x, y, z @@ -800,14 +989,17 @@ def test_paired_files (): def test_compare_trees (): system ('rm -rf dir1 dir2') system ('mkdir dir1 dir2') - system ('cp 20{-*.signature,.ly,.png} dir1') - system ('cp 20{-*.signature,.ly,.png} dir2') - system ('cp 20expr{-*.signature,.ly,.png} dir1') - system ('cp 19{-*.signature,.ly,.png} dir2/') - system ('cp 19{-*.signature,.ly,.png} dir1/') - system ('cp 19-1.signature 19-sub-1.signature') - system ('cp 19.ly 19-sub.ly') - system ('cp 19.png 19-sub.png') + system ('cp 20{-*.signature,.ly,.png,.eps,.log,.profile} dir1') + system ('cp 20{-*.signature,.ly,.png,.eps,.log,.profile} dir2') + system ('cp 20expr{-*.signature,.ly,.png,.eps,.log,.profile} dir1') + system ('cp 19{-*.signature,.ly,.png,.eps,.log,.profile} dir2/') + system ('cp 19{-*.signature,.ly,.png,.eps,.log,.profile} dir1/') + system ('cp 19-1.signature 19.sub-1.signature') + system ('cp 19.ly 19.sub.ly') + system ('cp 19.profile 19.sub.profile') + system ('cp 19.log 19.sub.log') + system ('cp 19.png 19.sub.png') + system ('cp 19.eps 19.sub.eps') system ('cp 20multipage* dir1') system ('cp 20multipage* dir2') @@ -815,37 +1007,41 @@ def test_compare_trees (): system ('mkdir -p dir1/subdir/ dir2/subdir/') - system ('cp 19-sub{-*.signature,.ly,.png} dir1/subdir/') - system ('cp 19-sub{-*.signature,.ly,.png} dir2/subdir/') - system ('cp 20grob{-*.signature,.ly,.png} dir2/') - system ('cp 20grob{-*.signature,.ly,.png} dir1/') + system ('cp 19.sub{-*.signature,.ly,.png,.eps,.log,.profile} dir1/subdir/') + system ('cp 19.sub{-*.signature,.ly,.png,.eps,.log,.profile} dir2/subdir/') + system ('cp 20grob{-*.signature,.ly,.png,.eps,.log,.profile} dir2/') + system ('cp 20grob{-*.signature,.ly,.png,.eps,.log,.profile} dir1/') + system ('echo HEAD is 1 > dir1/tree.gittxt') + system ('echo HEAD is 2 > dir2/tree.gittxt') ## introduce differences system ('cp 19-1.signature dir2/20-1.signature') + system ('cp 19.profile dir2/20.profile') system ('cp 19.png dir2/20.png') system ('cp 19multipage-page1.png dir2/20multipage-page1.png') - system ('cp 20-1.signature dir2/subdir/19-sub-1.signature') - system ('cp 20.png dir2/subdir/19-sub.png') + system ('cp 20-1.signature dir2/subdir/19.sub-1.signature') + system ('cp 20.png dir2/subdir/19.sub.png') + system ("sed 's/: /: 1/g' 20.profile > dir2/subdir/19.sub.profile") ## radical diffs. system ('cp 19-1.signature dir2/20grob-1.signature') system ('cp 19-1.signature dir2/20grob-2.signature') system ('cp 19multipage.midi dir1/midi-differ.midi') system ('cp 20multipage.midi dir2/midi-differ.midi') + system ('cp 19multipage.log dir1/log-differ.log') + system ('cp 19multipage.log dir2/log-differ.log && echo different >> dir2/log-differ.log && echo different >> dir2/log-differ.log') - compare_trees ('dir1', 'dir2', 'compare-dir1dir2', 0.5) + compare_trees ('dir1', 'dir2', 'compare-dir1dir2', options.threshold) def test_basic_compare (): ly_template = r""" \version "2.10.0" -#(set! toplevel-score-handler print-score-with-defaults) - #(set! toplevel-music-handler - (lambda (p m) - (if (not (eq? (ly:music-property m 'void) #t)) - (print-score-with-defaults - p (scorify-music m p))))) +#(define default-toplevel-book-handler + print-book-with-defaults-as-systems ) + +#(ly:set-option (quote no-point-and-click)) \sourcefilename "my-source.ly" @@ -887,8 +1083,8 @@ def test_basic_compare (): open (d['name'] + '.ly','w').write (ly_template % d) names = [d['name'] for d in dicts] - - system ('lilypond -ddump-signatures --png -b eps ' + ' '.join (names)) + + system ('lilypond -ddump-profile -dseparate-log-files -ddump-signatures --png -b eps ' + ' '.join (names)) multipage_str = r''' @@ -900,9 +1096,9 @@ def test_basic_compare (): } ''' - open ('20multipage', 'w').write (multipage_str.replace ('c1', 'd1')) - open ('19multipage', 'w').write ('#(set-global-staff-size 19.5)\n' + multipage_str) - system ('lilypond -ddump-signatures --png 19multipage 20multipage ') + open ('20multipage.ly', 'w').write (multipage_str.replace ('c1', 'd1')) + open ('19multipage.ly', 'w').write ('#(set-global-staff-size 19.5)\n' + multipage_str) + system ('lilypond -dseparate-log-files -ddump-signatures --png 19multipage 20multipage ') test_compare_signatures (names) @@ -996,6 +1192,12 @@ def main (): action="store_false", help="Don't run graphical comparisons") + p.add_option ('--create-images', + dest="create_images", + default=False, + action="store_true", + help="Create PNGs from EPSes") + p.add_option ('-o', '--output-dir', dest="output_dir", default=None, diff --git a/configure.in b/configure.in index 8a1c5d59a6..8a7a12c522 100644 --- a/configure.in +++ b/configure.in @@ -185,6 +185,9 @@ STEPMAKE_PROGS(MAKEINFO, makeinfo, REQUIRED, 4.8) AC_DEFINE_UNQUOTED(FLOWER_VERSION, "${FULL_FLOWER_VERSION}") +# must also have local.make if configure fails. +touch local.make + # Gather requirements and generate output. STEPMAKE_END @@ -201,5 +204,3 @@ Edit local.make for local Makefile overrides. EOF - -touch local.make diff --git a/flower/GNUmakefile b/flower/GNUmakefile index 5fe94f1f08..670aece45c 100644 --- a/flower/GNUmakefile +++ b/flower/GNUmakefile @@ -12,5 +12,5 @@ STEPMAKE_TEMPLATES=library c++ po test # test uses LILYPONDPREFIX LOCALSTEPMAKE_TEMPLATES=lilypond TEST_MODULE_LIBS = ../flower - +export top-src-dir include $(depth)/make/stepmake.make diff --git a/flower/cpu-timer.cc b/flower/cpu-timer.cc index f0e428a598..37f735ffe9 100644 --- a/flower/cpu-timer.cc +++ b/flower/cpu-timer.cc @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "cpu-timer.hh" diff --git a/flower/file-name.cc b/flower/file-name.cc index 21fec4e4b1..e5736e06b0 100644 --- a/flower/file-name.cc +++ b/flower/file-name.cc @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/flower/file-path.cc b/flower/file-path.cc index 31e7e993ef..175357d889 100644 --- a/flower/file-path.cc +++ b/flower/file-path.cc @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/flower/getopt-long.cc b/flower/getopt-long.cc index 20f744ee41..2cb537c67b 100644 --- a/flower/getopt-long.cc +++ b/flower/getopt-long.cc @@ -1,7 +1,7 @@ /* process command line, GNU style. - this is Copyleft (c) 1996--2006 Han-Wen Nienhuys, + this is Copyleft (c) 1996--2007 Han-Wen Nienhuys, */ #include "getopt-long.hh" diff --git a/flower/include/arithmetic-operator.hh b/flower/include/arithmetic-operator.hh index 89d63923a7..3e5238b7b4 100644 --- a/flower/include/arithmetic-operator.hh +++ b/flower/include/arithmetic-operator.hh @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef ARITHMETIC_OPERATOR_HH diff --git a/flower/include/axis.hh b/flower/include/axis.hh index 3ec040bb8b..741ce181b6 100644 --- a/flower/include/axis.hh +++ b/flower/include/axis.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef AXES_HH diff --git a/flower/include/compare.hh b/flower/include/compare.hh index acf8a394c1..f2cff8a80f 100644 --- a/flower/include/compare.hh +++ b/flower/include/compare.hh @@ -1,7 +1,7 @@ /* flowerlib - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef COMPARE_HH #define COMPARE_HH diff --git a/flower/include/cpu-timer.hh b/flower/include/cpu-timer.hh index d5e58de711..01383b5edb 100644 --- a/flower/include/cpu-timer.hh +++ b/flower/include/cpu-timer.hh @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef CPU_TIMER_HH diff --git a/flower/include/direction.hh b/flower/include/direction.hh index 7902eaea56..5400a5220d 100644 --- a/flower/include/direction.hh +++ b/flower/include/direction.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef DIRECTION_HH diff --git a/flower/include/drul-array.hh b/flower/include/drul-array.hh index 09c8a22fa4..e687acf2d7 100644 --- a/flower/include/drul-array.hh +++ b/flower/include/drul-array.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef DRUL_ARRAY_HH diff --git a/flower/include/file-name.hh b/flower/include/file-name.hh index 3d1a2d0fb2..46d4724974 100644 --- a/flower/include/file-name.hh +++ b/flower/include/file-name.hh @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef FILE_NAME_HH diff --git a/flower/include/file-path.hh b/flower/include/file-path.hh index bb69df245b..9a35388c4c 100644 --- a/flower/include/file-path.hh +++ b/flower/include/file-path.hh @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef FILE_PATH_HH diff --git a/flower/include/flower-proto.hh b/flower/include/flower-proto.hh index 384d8b89c8..8246d09fe3 100644 --- a/flower/include/flower-proto.hh +++ b/flower/include/flower-proto.hh @@ -1,7 +1,7 @@ /* fflower-proto.hh -- typenames in flowerlib - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef FLOWER_PROTO_HH diff --git a/flower/include/guile-compatibility.hh b/flower/include/guile-compatibility.hh index 0ccbe57196..3fe85ab9f6 100644 --- a/flower/include/guile-compatibility.hh +++ b/flower/include/guile-compatibility.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef GUILE_COMPATIBILITY_HH diff --git a/flower/include/international.hh b/flower/include/international.hh index b515af64c4..8cfcfb637c 100644 --- a/flower/include/international.hh +++ b/flower/include/international.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #ifndef INTERNATIONAL_HH diff --git a/flower/include/interval.hh b/flower/include/interval.hh index c485f32016..ba28b1c76c 100644 --- a/flower/include/interval.hh +++ b/flower/include/interval.hh @@ -1,7 +1,7 @@ /* interval.hh -- part of flowerlib - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef INTERVAL_HH diff --git a/flower/include/interval.tcc b/flower/include/interval.tcc index f43d52587f..3f5abc8b47 100644 --- a/flower/include/interval.tcc +++ b/flower/include/interval.tcc @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef INTERVAL_TCC diff --git a/flower/include/libc-extension.hh b/flower/include/libc-extension.hh index 236b731d8a..9191d6476a 100644 --- a/flower/include/libc-extension.hh +++ b/flower/include/libc-extension.hh @@ -3,7 +3,7 @@ source file of the flowerlib - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef LIBC_EXTENSION_HH diff --git a/flower/include/matrix.hh b/flower/include/matrix.hh index 4429ccc46d..d9b32c2ee4 100644 --- a/flower/include/matrix.hh +++ b/flower/include/matrix.hh @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #ifndef MATRIX_HH diff --git a/flower/include/memory-stream.hh b/flower/include/memory-stream.hh index 8cfab27b2a..699dea8514 100644 --- a/flower/include/memory-stream.hh +++ b/flower/include/memory-stream.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef MEMORY_STREAM_HH diff --git a/flower/include/offset.hh b/flower/include/offset.hh index f45ec7f90e..1995dd2554 100644 --- a/flower/include/offset.hh +++ b/flower/include/offset.hh @@ -1,7 +1,7 @@ /* offset.hh -- part of GNU LilyPond - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef OFFSET_HH diff --git a/flower/include/parray.hh b/flower/include/parray.hh index 69b7add103..820d9214b3 100644 --- a/flower/include/parray.hh +++ b/flower/include/parray.hh @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef PARRAY_HH diff --git a/flower/include/polynomial.hh b/flower/include/polynomial.hh index faf52d2026..297bd6c8c1 100644 --- a/flower/include/polynomial.hh +++ b/flower/include/polynomial.hh @@ -2,7 +2,7 @@ /* * poly.h -- routines for manipulation of polynomials in one var * - * (c) 1993--2006 Han-Wen Nienhuys + * (c) 1993--2007 Han-Wen Nienhuys */ #ifndef POLY_H diff --git a/flower/include/pqueue.hh b/flower/include/pqueue.hh index 6a936b8e6f..cb21c8d49c 100644 --- a/flower/include/pqueue.hh +++ b/flower/include/pqueue.hh @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef PQUEUE_HH diff --git a/flower/include/rational.hh b/flower/include/rational.hh index ac1a6d12fc..49b2322ed7 100644 --- a/flower/include/rational.hh +++ b/flower/include/rational.hh @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef RATIONAL_HH @@ -11,8 +11,6 @@ #include "std-string.hh" -#include "std-string.hh" - /** Rational numbers. Included is support for + and - infinity. */ @@ -47,7 +45,8 @@ public: void negate (); int to_int () const; - operator double () const; + operator double () const { return to_double (); } + double to_double () const; Rational operator - () const; /** diff --git a/flower/include/real.hh b/flower/include/real.hh index 5d8457e42a..2185d9b46b 100644 --- a/flower/include/real.hh +++ b/flower/include/real.hh @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef REAL_HH diff --git a/flower/include/std-string.hh b/flower/include/std-string.hh index d0fdd9c978..57805bbe21 100644 --- a/flower/include/std-string.hh +++ b/flower/include/std-string.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Jan Nieuwenhuizen + (c) 2006--2007 Jan Nieuwenhuizen */ #ifndef STD_STRING_HH diff --git a/flower/include/std-vector.hh b/flower/include/std-vector.hh index 10641dc5a0..4c3dcc0e0e 100644 --- a/flower/include/std-vector.hh +++ b/flower/include/std-vector.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Jan Nieuwenhuizen + (c) 2006--2007 Jan Nieuwenhuizen */ #ifndef STD_VECTOR_HH diff --git a/flower/include/tuple.hh b/flower/include/tuple.hh index 2191d6bf97..5f2705b8fa 100644 --- a/flower/include/tuple.hh +++ b/flower/include/tuple.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ diff --git a/flower/include/virtual-methods.hh b/flower/include/virtual-methods.hh index bf28b66737..7c97716e42 100644 --- a/flower/include/virtual-methods.hh +++ b/flower/include/virtual-methods.hh @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef VIRTUAL_METHODS_HH diff --git a/flower/include/warn.hh b/flower/include/warn.hh index 5171b2efb7..d2b1722adc 100644 --- a/flower/include/warn.hh +++ b/flower/include/warn.hh @@ -3,7 +3,7 @@ source file of the LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef WARN_HH diff --git a/flower/include/yaffut-parameters.hh b/flower/include/yaffut-parameters.hh new file mode 100644 index 0000000000..9a569f903c --- /dev/null +++ b/flower/include/yaffut-parameters.hh @@ -0,0 +1,30 @@ +#ifndef __YAFFUT_PARAMETERS_H__ +#define __YAFFUT_PARAMETERS_H__ + +#include "yaffut.hh" + +namespace yaffut { +template +struct TestOne: public ITest, public Suite +{ + ParameterOne const parameter_one_; + //static Registrator s_Registrator; + TestOne(ParameterOne p) + : Suite(p) + , parameter_one_ (p) + { + Registrator* r = &Test::s_Registrator; + r = 0; + } +}; + +#define TEST_STRING(Suite, Case, String)\ + namespace { \ + struct Case: public yaffut::TestOne{ Case(); }; \ + } \ + template struct yaffut::TestOne; Case::Case() \ + : yaffut::TestOne (String) + +} + +#endif // __YAFFUT_PARAMETERS_H__ diff --git a/flower/include/yaffut.hh b/flower/include/yaffut.hh new file mode 100644 index 0000000000..91a3521493 --- /dev/null +++ b/flower/include/yaffut.hh @@ -0,0 +1,359 @@ +// Copyright 2006 Rutger E.W. van Beusekom. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef __YAFFUT_H__ +#define __YAFFUT_H__ + +#include + +#include +#include +#include +#include +#include +#include + +#define YAFFUT_STRINGIZE(x) YAFFUT_STRINGIZE_(x) +#define YAFFUT_STRINGIZE_(x) #x + +#define __YAFFUT_AT__ __FILE__ ":" YAFFUT_STRINGIZE(__LINE__)": " +#ifndef __AT__ +#define __AT__ __YAFFUT_AT__ +#endif + +#define YAFFUT_EQUAL(e,a) \ + yaffut::equal (e ,a , __YAFFUT_AT__, "EQUAL(" #e " == " #a ") failed ") +#ifndef EQUAL +#define EQUAL YAFFUT_EQUAL +#endif + +#define YAFFUT_UNEQUAL(e,a) \ + yaffut::unequal (e, a, __YAFFUT_AT__, "UNEQUAL(" #e " != " #a ") failed ") +#ifndef UNEQUAL +#define UNEQUAL YAFFUT_UNEQUAL +#endif + +#define YAFFUT_CHECK(e) \ + yaffut::check (e, __YAFFUT_AT__, "CHECK(" #e ") failed ") +#ifndef CHECK +#define CHECK YAFFUT_CHECK +#endif + +#define YAFFUT_FAIL(s) yaffut::fail (s, __YAFFUT_AT__); +#ifndef FAIL +#define FAIL YAFFUT_FAIL +#endif + +#define YAFFUT_ASSERT_THROW(s, e) \ + try \ + { \ + s; \ + throw yaffut::failure (__YAFFUT_AT__, #s " failed to throw"); \ + } \ + catch(const e&){} +#ifndef ASSERT_THROW +#define ASSERT_THROW YAFFUT_ASSERT_THROW +#endif + +namespace yaffut { + +template +std::string demangle() +{ + size_t sz; + int status; + char* ptr = abi::__cxa_demangle(typeid(T).name(), 0, &sz, &status); + std::string name(ptr ? ptr : "", ptr ? strlen(ptr) : 0); + if(ptr){ free(ptr); } + std::string::size_type pos = name.rfind("::"); + if(pos != std::string::npos) + { + name = name.substr(pos + 2); + } + return name; +} + +struct ITest +{ + virtual ~ITest(){} +}; + +class Factory +{ +public: + typedef ITest* (*Create_t) (); +private: + typedef std::map Tests_t; + Tests_t m_Tests; + size_t m_fail; + size_t m_pass; +private: + Factory(){} + ~Factory(){} + static bool EqualsSuiteName (std::string const &name, std::string const& s) + { + return name.find (':') >= name.length () - 2 + && s.substr (0, name.length ()) == name; + } +public: + static Factory& Instance() + { + static Factory instance; + return instance; + } + void Register(const std::string& name, Create_t create) + { + m_Tests[name] = create; + } + size_t Fail () { return m_fail; } + void List(const std::string& name) + { + for(Tests_t::const_iterator it = m_Tests.begin(); it != m_Tests.end(); ++it) + { + if(name.empty () || it->first == name + || EqualsSuiteName (name, it->first)) + std::cout << it->first << std::endl; + } + } + void Run(const std::string& name) + { + for(Tests_t::const_iterator it = m_Tests.begin(); it != m_Tests.end(); ++it) + { + if("All" == name || it->first == name + || EqualsSuiteName (name, it->first)) + { + try + { + std::cout << std::endl << it->first << ' ' << std::flush; + { + std::auto_ptr test(it->second()); + } + std::cout << "[OK]" << std::flush; + ++m_pass; + } + catch(const std::exception& e) + { + std::cout << "[FAIL]\n" << e.what() << std::flush; + ++m_fail; + } + catch(...) + { + std::cout << "[FAIL]\nunknown exception" << std::flush; + ++m_fail; + } + } + } + } + void Report () + { + const size_t size = m_Tests.size(); + std::cout << std::endl; + std::cout << "[TOTAL](" << m_pass + m_fail << '/' << size << ")" << std::endl; + std::cout << "[OK](" << m_pass << '/' << size << ")" << std::endl; + if (m_fail) + std::cout << "[FAIL](" << m_fail << '/' << size << ")" << std::endl; + } + int Main (int argc, const char* argv[]) + { + if(argc > 1 + && (std::string(argv[1]) == "-h" || std::string(argv[1]) == "--help")) + { + std::cout << "Yaffut - Yet Another Framework For Unit Testing.\n\n" + "Usage: yaffut [OPTION] [Suite:|Suite::Test]...\n\n" + "Options:\n" + " -h, --help show this help\n" + " -l, --list list test cases" << std::endl; + return 0; + } + if(argc > 1 + && (std::string(argv[1]) == "-l" || std::string(argv[1]) == "--list")) + { + Factory::Instance().List(argc > 2 ? argv[2] : ""); + return 0; + } + + const char* all[] = {"All"}; + const char** test = all; + int num = 1; + if(1 < argc) + { + test = argv; + num = argc; + } + + for(int i = 0; i < num; ++i) + { + try + { + Factory::Instance().Run(test[i]); + } + catch(const std::exception& e) + { + std::clog << e.what() << std::endl; + } + } + + Factory::Instance().Report (); + return Factory::Instance().Fail (); + } +}; + +class failure: public std::exception +{ + std::string failure_; +public: + template + failure(const Expected& e, Actual& a, const char* at = "", const char* expr = "") + { + std::ostringstream os; + os << at << expr << "\nexpected: " + << "(" << demangle() << ") " << e + << " != actual: " << "(" << demangle() << ") " << a; + failure_ = os.str(); + } + failure(const char* at = "", const char* expr = "") + { + std::ostringstream os; + os << at << expr; + failure_ = os.str(); + } + virtual ~failure() throw() {} + virtual const char* what() const throw() { return failure_.c_str(); } +}; + +template +struct Registrator +{ + Registrator() + { + Factory::Instance().Register(TestName(), Create); + } + const std::string& TestName() + { + static const std::string name(demangle() + "::" + demangle()); + return name; + } + static ITest* Create() + { + return new Case; + } +}; + +template +struct Test: public ITest, public Suite +{ + static Registrator s_Registrator; + Test() + : Suite() + { + Registrator* r = &s_Registrator; + r = 0; + } + template + void assert_throw(void(T::*mf)(), const char* at) + { + try + { + (dynamic_cast (this)->*mf)(); + throw yaffut::failure (at, "statement failed to throw"); + } + catch(const E&){} + } +}; + +template +Registrator Test::s_Registrator; + +template +void equal(const Expected& e, const Actual& a, const char* at = "", const char* expr = "") +{ + if(e != a) + { + throw failure(e, a, at, expr); + } +} +inline void equal(double e, double a, const char* at = "", const char* expr = "") +{ + double max = std::abs(std::max(e, a)); + max = max < 1.0 ? 1.0 : max; + if(std::abs(e - a) > std::numeric_limits::epsilon() * max) + { + throw failure(e, a, at, expr); + } +} +inline void check(bool b, const char* at = "", const char* expr = "") +{ + if(!b) + { + throw failure(at, expr); + } +} + +template +void unequal(const Expected& e, const Actual& a, const char* at = "", const char* expr = "") +{ + if(e == a) + { + throw failure(e, a, at, expr); + } +} +inline void unequal(double e, double a, const char* at = "", const char* expr = "") +{ + double max = std::abs(std::max(e, a)); + max = max < 1.0 ? 1.0 : max; + if(std::abs(e - a) <= std::numeric_limits::epsilon() * max) + { + throw failure(e, a, at, expr); + } +} + +template +void fail(const T& expr, const char* at = "") +{ + std::ostringstream os; + os << expr; + throw failure(at, os.str().c_str()); +} + +template +void assert_throw(void(*pf)(), const char* at = "") +{ + try + { + (*pf)(); + throw failure (at, " statement failed to throw"); + } + catch(const E&){} +} + +//define catch-all suite +struct Suite {}; + +} + +//and for those who prefer macro obscurity over more typing +#define TEST(Suite, Case)\ + namespace { struct Case: public yaffut::Test{ Case(); }; } \ + template struct yaffut::Test; Case::Case() + +#define FUNC(Case)\ + namespace { struct Case: public yaffut::Test{ Case(); }; } \ + template struct yaffut::Test; Case::Case() + +#ifdef YAFFUT_MAIN + +#include + +int main(int argc, const char* argv[]) +{ + std::cout << "pid(" << getpid() << ")" << std::endl; + return yaffut::Factory::Instance().Main (argc, argv); +}; + +#endif /* YAFFUT_MAIN */ + +#define yaffut_main(argc, argv) yaffut::Factory::Instance().Main (argc, argv) + +#endif diff --git a/flower/international.cc b/flower/international.cc index ef1ebfbc89..78dc3ddb3c 100644 --- a/flower/international.cc +++ b/flower/international.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "config.hh" diff --git a/flower/interval.cc b/flower/interval.cc index b785796851..ed45c66562 100644 --- a/flower/interval.cc +++ b/flower/interval.cc @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "interval.hh" diff --git a/flower/libc-extension.cc b/flower/libc-extension.cc index 7b33b0430e..31c280abe7 100644 --- a/flower/libc-extension.cc +++ b/flower/libc-extension.cc @@ -3,7 +3,7 @@ source file of the flowerlib - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/flower/memory-stream.cc b/flower/memory-stream.cc index d6bedf615e..863f4bd4de 100644 --- a/flower/memory-stream.cc +++ b/flower/memory-stream.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include diff --git a/flower/offset.cc b/flower/offset.cc index a0e87b58cf..f578b191f9 100644 --- a/flower/offset.cc +++ b/flower/offset.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "offset.hh" diff --git a/flower/polynomial.cc b/flower/polynomial.cc index 8aa5d3a63b..d9784c2770 100644 --- a/flower/polynomial.cc +++ b/flower/polynomial.cc @@ -1,7 +1,7 @@ /* poly.cc -- routines for manipulation of polynomials in one var - (c) 1993--2006 Han-Wen Nienhuys + (c) 1993--2007 Han-Wen Nienhuys */ #include "polynomial.hh" diff --git a/flower/rational.cc b/flower/rational.cc index 6822703256..724f0d99ca 100644 --- a/flower/rational.cc +++ b/flower/rational.cc @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "rational.hh" @@ -16,7 +16,8 @@ using namespace std; #include "string-convert.hh" #include "libc-extension.hh" -Rational::operator double () const +double +Rational::to_double () const { if (sign_ == -1 || sign_ == 1 || sign_ == 0) return ((double)sign_) * num_ / den_; diff --git a/flower/std-string.cc b/flower/std-string.cc index 6d8ebd52f5..b78b019661 100644 --- a/flower/std-string.cc +++ b/flower/std-string.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Jan Nieuwenhuizen + (c) 2006--2007 Jan Nieuwenhuizen */ #include "std-string.hh" diff --git a/flower/string-convert.cc b/flower/string-convert.cc index 43f0389bde..6a6dbc6d7c 100644 --- a/flower/string-convert.cc +++ b/flower/string-convert.cc @@ -66,7 +66,6 @@ String_convert::bin2unsigned (string bin_string) return result_u; } -// breendet imp from string int String_convert::dec2int (string dec_string) { @@ -76,6 +75,8 @@ String_convert::dec2int (string dec_string) long l = 0; if (!sscanf (dec_string.c_str (), "%ld", &l)) assert (false); + + assert (form_string ("%ld", l) == dec_string); return (int)l; } diff --git a/flower/test-file-name.cc b/flower/test-file-name.cc new file mode 100644 index 0000000000..0bd427bda8 --- /dev/null +++ b/flower/test-file-name.cc @@ -0,0 +1,31 @@ +#include "file-name.hh" + +#include "yaffut-parameters.hh" + +using namespace std; + +string slashify (string file_name); + +TEST_STRING (File_name, Mingw_slashify, "foe.ly") +{ + string s = slashify (to_string ()); + EQUAL (parameter_one_, s); +} + +TEST_STRING (File_name, Mingw_slashify_2, "/tmp/x.ly") +{ + string s = slashify (to_string ()); + EQUAL (parameter_one_, s); +} + +TEST_STRING (File_name, Mingw_slashify_3, "c:/tmp/x.ly") +{ + string s = slashify (to_string ()); + EQUAL (parameter_one_, s); +} + +TEST_STRING (File_name, Mingw_slashify_4, "\\tmp\\x.ly") +{ + string s = slashify (to_string ()); + EQUAL ("/tmp/x.ly", s); +} diff --git a/flower/test-file-path.cc b/flower/test-file-path.cc new file mode 100644 index 0000000000..053d237b66 --- /dev/null +++ b/flower/test-file-path.cc @@ -0,0 +1,19 @@ +#include "file-path.hh" + +#include "yaffut.hh" +#include "config.hh" + +TEST (File_path, Find) +{ + char const *extensions[] = {"ly", "", 0}; + string file = "init"; + char cwd[PATH_MAX]; + getcwd (cwd, PATH_MAX); + string ly_dir = string (getenv ("top-src-dir")) + "/ly"; + parse_path (string (1, PATHSEP) + ly_dir); + string file_name = find (file, extensions); + EQUAL (file_name.substr (file_name.rfind ('/')), "/init.ly"); + file = "init.ly"; + file_name = find (file, extensions); + EQUAL (file_name, ly_dir + "/init.ly"); +} diff --git a/flower/test-file.cc b/flower/test-file.cc deleted file mode 100644 index 9057b3a9e2..0000000000 --- a/flower/test-file.cc +++ /dev/null @@ -1,60 +0,0 @@ -#define HAVE_BOOST_LAMBDA 1 -#include "std-vector.hh" - -#include -#include - -#include -#include - -using namespace std; -using boost::unit_test::test_suite; - -#include "file-name.hh" -string slashify (string file_name); - -// FIXME -//BOOST_AUTO_UNIT_TEST (mingw_slashify) -void mingw_slashify () -{ - File_name f = string ("foe.ly"); - string s = slashify (f.to_string ()); - cout << s << endl; - BOOST_CHECK_EQUAL (s, "foe.ly"); - f = string ("/tmp/x.ly"); - s = slashify (f.to_string ()); - cout << s << endl; - BOOST_CHECK_EQUAL (s, "/tmp/x.ly"); - f = string ("c:/tmp/x.ly"); - s = slashify (f.to_string ()); - cout << s << endl; - BOOST_CHECK_EQUAL (s, "c:/tmp/x.ly"); - f = string ("\\tmp\\x.ly"); - s = slashify (f.to_string ()); - cout << s << endl; - BOOST_CHECK_EQUAL (s, "/tmp/x.ly"); -} - -#include "config.hh" -#include "file-path.hh" - -// FIXME -//BOOST_AUTO_UNIT_TEST (mingw_slashify) -void file_find () -{ - char const *extensions[] = {"ly", "", 0}; - string file = "init"; - File_path path; - char cwd[PATH_MAX]; - getcwd (cwd, PATH_MAX); - string ly_dir = string (getenv ("LILYPONDPREFIX")) + "/ly"; - cout << ly_dir << endl; - path.parse_path (string (1, PATHSEP) + ly_dir); - string file_name = path.find (file, extensions); - cout << file_name << endl; - BOOST_CHECK_EQUAL (file_name.substr (file_name.rfind ('/')), "/init.ly"); - file = "init.ly"; - file_name = path.find (file, extensions); - cout << file_name << endl; - BOOST_CHECK_EQUAL (file_name, ly_dir + "/init.ly"); -} diff --git a/flower/test-std.cc b/flower/test-std.cc index ed317f7f63..1c1a71fa3a 100644 --- a/flower/test-std.cc +++ b/flower/test-std.cc @@ -9,16 +9,14 @@ #include -#include -#include +#define YAFFUT_MAIN +#include "yaffut.hh" #if !STD_VECTOR #define vector flower_vector #endif using namespace std; -using boost::unit_test::test_suite; -using namespace boost::unit_test; template void @@ -40,24 +38,24 @@ print (Link_array v) } #endif -BOOST_AUTO_UNIT_TEST (vector_erase) +FUNC (vector_erase) { vector v; v.push_back (0); v.push_back (1); - BOOST_CHECK_EQUAL (v.size (), vsize (2)); + EQUAL (v.size (), vsize (2)); v.erase (v.begin () + 1); - BOOST_CHECK_EQUAL (v.size (), vsize (1)); - BOOST_CHECK_EQUAL (v.back (), 0); + EQUAL (v.size (), vsize (1)); + EQUAL (v.back (), 0); v.push_back (1); - BOOST_CHECK_EQUAL (v.size (), vsize (2)); + EQUAL (v.size (), vsize (2)); v.erase (v.begin () + 0); - BOOST_CHECK_EQUAL (v.size (), vsize (1)); - BOOST_CHECK_EQUAL (v.back (), 1); + EQUAL (v.size (), vsize (1)); + EQUAL (v.back (), 1); } -BOOST_AUTO_UNIT_TEST (vector_slice) +FUNC (vector_slice) { vector v; v.push_back (0); @@ -65,18 +63,18 @@ BOOST_AUTO_UNIT_TEST (vector_slice) v.push_back (2); v.push_back (3); #if VECTOR_SLICE - BOOST_CHECK_EQUAL (v.slice (0, 0).size (), vsize (0)); - BOOST_CHECK_EQUAL (v.slice (0, v.size ()).size (), v.size ()); - BOOST_CHECK_EQUAL (v.slice (1, 2).size (), vsize (1)); + EQUAL (v.slice (0, 0).size (), vsize (0)); + EQUAL (v.slice (0, v.size ()).size (), v.size ()); + EQUAL (v.slice (1, 2).size (), vsize (1)); #else - BOOST_CHECK_EQUAL (vector (v.begin (), v.begin ()).size (), vsize (0)); - BOOST_CHECK_EQUAL (vector (v.begin (), v.end ()).size (), v.size ()); - BOOST_CHECK_EQUAL (vector (v.begin () + 1, v.begin () + 2).size (), + EQUAL (vector (v.begin (), v.begin ()).size (), vsize (0)); + EQUAL (vector (v.begin (), v.end ()).size (), v.size ()); + EQUAL (vector (v.begin () + 1, v.begin () + 2).size (), vsize (1)); #endif } -BOOST_AUTO_UNIT_TEST (vector_sorting) +FUNC (vector_sorting) { vector v; v.push_back (2); @@ -88,12 +86,12 @@ BOOST_AUTO_UNIT_TEST (vector_sorting) //sort (v.begin (), v.end ()); vector_sort (v, less ()); #endif - BOOST_CHECK_EQUAL (v[0], 0); - BOOST_CHECK_EQUAL (v[1], 1); - BOOST_CHECK_EQUAL (v[2], 2); + EQUAL (v[0], 0); + EQUAL (v[1], 1); + EQUAL (v[2], 2); } -BOOST_AUTO_UNIT_TEST (vector_insert) +FUNC (vector_insert) { vector v; v.push_back (0); @@ -102,23 +100,23 @@ BOOST_AUTO_UNIT_TEST (vector_insert) #else v.insert (v.begin (), 1); #endif - BOOST_CHECK_EQUAL (v[0], 1); + EQUAL (v[0], 1); #if VECTOR_INSERT v.insert (2, v.size ()); #else v.insert (v.end (), 2); #endif - BOOST_CHECK_EQUAL (v.back (), 2); + EQUAL (v.back (), 2); vector u; u.insert (u.begin (), v.begin (), v.end ()); - BOOST_CHECK_EQUAL (u.size (), v.size ()); + EQUAL (u.size (), v.size ()); u.clear (); u.insert (u.end (), v.begin (), v.end ()); - BOOST_CHECK_EQUAL (u.size (), v.size ()); + EQUAL (u.size (), v.size ()); u.clear (); } -BOOST_AUTO_UNIT_TEST (parray_concat) +FUNC (parray_concat) { #if !STD_VECTOR Link_array u, v; @@ -132,14 +130,14 @@ BOOST_AUTO_UNIT_TEST (parray_concat) v.push_back (&a[3]); v.push_back (&a[4]); concat (u, v); - BOOST_CHECK_EQUAL (u[0], &a[0]); - BOOST_CHECK_EQUAL (u[1], &a[1]); - BOOST_CHECK_EQUAL (u[2], &a[2]); - BOOST_CHECK_EQUAL (u[3], &a[3]); - BOOST_CHECK_EQUAL (u[4], &a[4]); - BOOST_CHECK_EQUAL (u.size (), vsize (5)); + EQUAL (u[0], &a[0]); + EQUAL (u[1], &a[1]); + EQUAL (u[2], &a[2]); + EQUAL (u[3], &a[3]); + EQUAL (u[4], &a[4]); + EQUAL (u.size (), vsize (5)); concat (u, v); - BOOST_CHECK_EQUAL (u.size (), vsize (7)); + EQUAL (u.size (), vsize (7)); u.clear (); v.clear (); @@ -149,15 +147,15 @@ BOOST_AUTO_UNIT_TEST (parray_concat) v.push_back (&a[3]); v.push_back (&a[4]); concat (u, v); - BOOST_CHECK_EQUAL (u[0], &a[0]); - BOOST_CHECK_EQUAL (u[1], &a[1]); - BOOST_CHECK_EQUAL (u[2], &a[2]); - BOOST_CHECK_EQUAL (u[3], &a[3]); - BOOST_CHECK_EQUAL (u[4], &a[4]); - BOOST_CHECK_EQUAL (u.size (), vsize (5)); + EQUAL (u[0], &a[0]); + EQUAL (u[1], &a[1]); + EQUAL (u[2], &a[2]); + EQUAL (u[3], &a[3]); + EQUAL (u[4], &a[4]); + EQUAL (u.size (), vsize (5)); } -BOOST_AUTO_UNIT_TEST (parray_uniq) +FUNC (parray_uniq) { vector v; v.push_back (0); @@ -165,76 +163,15 @@ BOOST_AUTO_UNIT_TEST (parray_uniq) v.push_back (0); vector_sort (v, less ()); uniq (v); - BOOST_CHECK_EQUAL (v.size (), vsize (2)); + EQUAL (v.size (), vsize (2)); } -BOOST_AUTO_UNIT_TEST (vector_search) +FUNC (vector_search) { vector v; v.push_back (0); v.push_back (1); v.push_back (2); vsize i = binary_search (v, 1, less ()); - BOOST_CHECK_EQUAL (i, vsize (1)); -} - -#if 0 -#include "file-name.hh" -string slashify (string file_name); - -BOOST_AUTO_UNIT_TEST (mingw_slashify) -{ - File_name f = string ("foe.ly"); - string s = slashify (f.to_string ()); - cout << s << endl; - BOOST_CHECK_EQUAL (s, "foe.ly"); - f = string ("/tmp/x.ly"); - s = slashify (f.to_string ()); - cout << s << endl; - BOOST_CHECK_EQUAL (s, "/tmp/x.ly"); - f = string ("c:/tmp/x.ly"); - s = slashify (f.to_string ()); - cout << s << endl; - BOOST_CHECK_EQUAL (s, "c:/tmp/x.ly"); - f = string ("\\tmp\\x.ly"); - s = slashify (f.to_string ()); - cout << s << endl; - BOOST_CHECK_EQUAL (s, "/tmp/x.ly"); -} -#endif - -void mingw_slashify (); -void file_find (); - -#include -#include -#include - -test_suite* -init_unit_test_suite (int, char**) -{ - vsize i = 0; - vsize j = 0; - vector v; - binary_search (v, 1, less (), i, j); - //binary_search_bounds (v, 1, &default_compare, 0, 0); - - //Link_array w; - vector w; - binary_search (w, (char*)1, less (), i, j); - - test_suite *test = BOOST_TEST_SUITE("Flower"); - - - test->add (BOOST_TEST_CASE (vector_erase)); - test->add (BOOST_TEST_CASE (vector_slice)); - test->add (BOOST_TEST_CASE (vector_sorting)); - test->add (BOOST_TEST_CASE (vector_insert)); - test->add (BOOST_TEST_CASE (parray_concat)); - test->add (BOOST_TEST_CASE (parray_uniq)); - test->add (BOOST_TEST_CASE (vector_search)); - test->add (BOOST_TEST_CASE (mingw_slashify)); - test->add (BOOST_TEST_CASE (file_find)); - - return test; + EQUAL (i, vsize (1)); } diff --git a/flower/warn.cc b/flower/warn.cc index 4014b73adb..52631a8665 100644 --- a/flower/warn.cc +++ b/flower/warn.cc @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "warn.hh" diff --git a/input/GNUmakefile b/input/GNUmakefile index 4a45b45f4a..a8c4d4a26b 100644 --- a/input/GNUmakefile +++ b/input/GNUmakefile @@ -1,6 +1,6 @@ depth = .. -SUBDIRS = test regression tutorial midi no-notation mutopia manual +SUBDIRS = test regression tutorial mutopia manual lsr examples = typography-demo les-nereides wilhelmus proportional bach-schenker cary diff --git a/input/cary-layout.ly b/input/cary-layout.ly index 1c8bb4cc9b..7f49c57688 100644 --- a/input/cary-layout.ly +++ b/input/cary-layout.ly @@ -1,5 +1,5 @@ -\version "2.10.2" +\version "2.11.11" \layout { indent = #0 @@ -8,7 +8,7 @@ \Score proportionalNotationDuration = #(ly:make-moment 1 64) - allowBeamBreak = ##t + \override Beam #'breakable = ##t autoBeaming = ##f tupletFullLength = ##t \override BarNumber #'transparent = ##t diff --git a/input/lsr/GNUmakefile b/input/lsr/GNUmakefile new file mode 100644 index 0000000000..95cd95a40d --- /dev/null +++ b/input/lsr/GNUmakefile @@ -0,0 +1,7 @@ +depth = ../../ + +SUBDIRS = advanced trick + +LOCALSTEPMAKE_TEMPLATES=ly mutopia + +include $(depth)/make/stepmake.make diff --git a/input/lsr/advanced/AAA-intro-advanced.ly b/input/lsr/advanced/AAA-intro-advanced.ly new file mode 100644 index 0000000000..73bf4078fe --- /dev/null +++ b/input/lsr/advanced/AAA-intro-advanced.ly @@ -0,0 +1,21 @@ +\version "2.10.0" +%% +.ly: Be the first .ly file for lys-to-tely.py. +%% Better to make lys-to-tely.py include "introduction.texi" or +%% other .texi documents too? + +\header{ +texidoc = #(string-append " +@section Introduction + +This document shows all kinds of advanced snippets from the +@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository}. + +In the web version of this document, you can click on the file name +or figure for each example to see the corresponding input file. + +This document is for LilyPond version +" (lilypond-version) "." ) +} + +% make sure .png is generated. +\lyrics { "(left blank intentionally)" } diff --git a/input/lsr/advanced/Alternating-beam-directions.ly b/input/lsr/advanced/Alternating-beam-directions.ly new file mode 100644 index 0000000000..1298e8fb32 --- /dev/null +++ b/input/lsr/advanced/Alternating-beam-directions.ly @@ -0,0 +1,31 @@ +\version "2.10.12" + +\header { texidoc = " +

The eighth notes may be seemingly attached to different + beams, and the corresponding notes connected by ties. + Such a situation may occur, for example, in the cello suites. +" } + +wipeNote = { + \once \override NoteHead #'transparent = ##t + \once \override Stem #'transparent = ##t +} +\layout { raggedright = ##t } + + +\relative c''<< { + c8[~ + \wipeNote + c8 + c8~ + \wipeNote + c + c]~ + \wipeNote + c\noBeam +}\\ + { s8 c8 [ s c s c] } + + +>> + diff --git a/input/lsr/advanced/GNUmakefile b/input/lsr/advanced/GNUmakefile new file mode 100644 index 0000000000..43325ab698 --- /dev/null +++ b/input/lsr/advanced/GNUmakefile @@ -0,0 +1,16 @@ + +depth = ../../../ + +STEPMAKE_TEMPLATES=documentation texinfo tex +LOCALSTEPMAKE_TEMPLATES=lilypond ly lysdoc + +## Hmm, would this work? No -- if we really want examples, move +## to other dir (input/) comes to mind. +## examples = font20 ancient-font +## LOCALSTEPMAKE_TEMPLATES += ly mutopia + +EXTRA_DIST_FILES= + +include $(depth)/make/stepmake.make + +TITLE=Advanced snippets diff --git a/input/lsr/advanced/SConscript b/input/lsr/advanced/SConscript new file mode 100644 index 0000000000..f72bfffc28 --- /dev/null +++ b/input/lsr/advanced/SConscript @@ -0,0 +1,4 @@ +# -*-python-*- + +Import ('env', 'collate') +collate (title = 'Advanced snippets') diff --git a/input/lsr/trick/AAA-intro-trick.ly b/input/lsr/trick/AAA-intro-trick.ly new file mode 100644 index 0000000000..5010547c3e --- /dev/null +++ b/input/lsr/trick/AAA-intro-trick.ly @@ -0,0 +1,21 @@ +\version "2.10.0" +%% +.ly: Be the first .ly file for lys-to-tely.py. +%% Better to make lys-to-tely.py include "introduction.texi" or +%% other .texi documents too? + +\header{ +texidoc = #(string-append " +@section Introduction + +This document shows all kinds of tricks from the +@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository}. + +In the web version of this document, you can click on the file name +or figure for each example to see the corresponding input file. + +This document is for LilyPond version +" (lilypond-version) "." ) +} + +% make sure .png is generated. +\lyrics { "(left blank intentionally)" } diff --git a/input/lsr/trick/Adding-ambiti-per-voice.ly b/input/lsr/trick/Adding-ambiti-per-voice.ly new file mode 100644 index 0000000000..58d3f28bf1 --- /dev/null +++ b/input/lsr/trick/Adding-ambiti-per-voice.ly @@ -0,0 +1,22 @@ +\version "2.10.12" + +\header { texidoc = " +

Ambits can be added per voice. In that case, the +ambitus must be moved manually to prevent collisions. +" } + +\new Staff << + \new Voice \with { + \consists "Ambitus_engraver" + } \relative c'' { + \voiceOne + c4 a d e f2 + } + \new Voice \with { + \consists "Ambitus_engraver" + } \relative c' { + \voiceTwo + es4 f g as b2 + } +>> + diff --git a/input/lsr/trick/Caesura-railtracks-with-fermata.ly b/input/lsr/trick/Caesura-railtracks-with-fermata.ly new file mode 100644 index 0000000000..d466facfb6 --- /dev/null +++ b/input/lsr/trick/Caesura-railtracks-with-fermata.ly @@ -0,0 +1,25 @@ +\version "2.10.12" + +\header { texidoc = " +A caesura is sometimes denoted with a double \"railtracks\" breath mark with a fermata sign positioned over the top of the railtracks. This snippet should present an optically pleasing combination of railtracks and a fermata. + +It works for lilypond 2.5 and above. +" } + +{ + \context Voice { + c''2. + % use some scheme code to construct the symbol + \override BreathingSign #'text = #(markup #:line + (#:musicglyph "scripts.caesura" + #:translate (cons -1.75 1.6) + #:musicglyph "scripts.ufermata" + )) + \breathe c''4 + % set the breathe mark back to normal + \revert BreathingSign #'text + c''2. \breathe c''4 + \bar "|." + } +} + diff --git a/input/lsr/trick/GNUmakefile b/input/lsr/trick/GNUmakefile new file mode 100644 index 0000000000..a8293cbb73 --- /dev/null +++ b/input/lsr/trick/GNUmakefile @@ -0,0 +1,16 @@ + +depth = ../../../ + +STEPMAKE_TEMPLATES=documentation texinfo tex +LOCALSTEPMAKE_TEMPLATES=lilypond ly lysdoc + +## Hmm, would this work? No -- if we really want examples, move +## to other dir (input/) comes to mind. +## examples = font20 ancient-font +## LOCALSTEPMAKE_TEMPLATES += ly mutopia + +EXTRA_DIST_FILES= + +include $(depth)/make/stepmake.make + +TITLE=Trick snippets diff --git a/input/lsr/trick/SConscript b/input/lsr/trick/SConscript new file mode 100644 index 0000000000..3845b7b8c6 --- /dev/null +++ b/input/lsr/trick/SConscript @@ -0,0 +1,4 @@ +# -*-python-*- + +Import ('env', 'collate') +collate (title = 'Trick snippets') diff --git a/input/lsr/trick/Tramlines-and-Feta-font-caesurae.ly b/input/lsr/trick/Tramlines-and-Feta-font-caesurae.ly new file mode 100644 index 0000000000..6d8fb0af80 --- /dev/null +++ b/input/lsr/trick/Tramlines-and-Feta-font-caesurae.ly @@ -0,0 +1,66 @@ +\version "2.10.12" + +\header { texidoc = " +This snippet shows a way to insert available Feta font symbols as caesurae and ways to create tramlines. Normally a caesura is indicated by a pair of oblique lines lying through the top line of the staff, also called a fetura, tramlines, railroad tracks, or a cut-off. LilyPond provides several alternatives. A stylized version of tramlines is called caesura. The normal tramline form, here called fetura, is not in the Feta font set, but can be constructed using the / character. +" } + +\version "2.8.4" +%{ This snippet shows a way to insert available Feta font symbols as caesurae + and ways to create tramlines. Normally a caesura is indicated by a pair of + oblique lines lying through the top line of the staff, also called a fetura, + tramlines, railroad tracks, or a cut-off. LilyPond provides several + alternatives. A stylized version of tramlines is called caesura. The normal + tramline form, here called fetura, is not in the Feta font set, but can be + constructed using the / character.%} + \relative c'' { +\time 3/4 +e4 d e + % default +e_\markup { "default - breathe" } + \breathe d e | + % rcomma + % by default, \breathe uses the rcomma, just as if saying: + \override BreathingSign #'text = + #(make-musicglyph-markup "scripts.rcomma") +e_\markup rcomma \breathe d e | + % lcomma + \override BreathingSign #'text = + #(make-musicglyph-markup "scripts.lcomma") +e_\markup lcomma \breathe d e | + % rvarcomma + \override BreathingSign #'text = + #(make-musicglyph-markup "scripts.rvarcomma") +e_\markup rvarcomma \breathe d e | \break + % lvarcomma + \override BreathingSign #'text = + #(make-musicglyph-markup "scripts.lvarcomma") +e_\markup lvarcomma \breathe d e | + % upbow or wedge + \override BreathingSign #'text = + #(make-musicglyph-markup "scripts.upbow") +e_\markup upbow \breathe d e | + % caesura + \override BreathingSign #'text = + #(make-musicglyph-markup "scripts.caesura") +e_\markup caesura \breathe d e | + % fetura, tramlines, or railroad tracks +<<{ +\hideNotes a16 a a a a4 a \unHideNotes +}\\{ + \once\override TextScript #'extra-offset = #'(4.0 . -2.7) +e^\markup {\fontsize #2 {\bold "/" \hspace #-1.4 \bold "/"}} +d_\markup { \hspace #-10 "fetura" } e | +}>> + \once\override TextScript #'font-name = #"cmb10" + \once\override TextScript #'extra-offset = #'(4.0 . -2.2) +e^\markup {\magnify #1.3 { "/" \hspace #-1.5 "/"}} + \once \override Score.SeparationItem #'padding = #4 +d_\markup { \hspace #-10 "fetura" } e | + +e d e \bar "||" + }%end relative + \layout{ +indent = 0.00\in + }%end layout + + diff --git a/input/manual/bar-lines.ly b/input/manual/bar-lines.ly index 73f42ecf83..b5cdc8492d 100644 --- a/input/manual/bar-lines.ly +++ b/input/manual/bar-lines.ly @@ -21,8 +21,8 @@ c \bar ":|:" \mark \markup { \simple #":|:" } c \bar "|." \mark \markup { \simple #"|." } c \bar ":" \mark \markup { \simple #":" } - - c c c + c c c \bar "dashed" \mark \markup { \simple #"dashed" } + c c c c \bar "||:" \mark \markup { \tiny \typewriter "unbroken" \simple #"||:" } c c c c diff --git a/input/midi/GNUmakefile b/input/midi/GNUmakefile deleted file mode 100644 index 37d97aa000..0000000000 --- a/input/midi/GNUmakefile +++ /dev/null @@ -1,8 +0,0 @@ -depth = ../.. - -STEPMAKE_TEMPLATES=documentation texinfo tex -LOCALSTEPMAKE_TEMPLATES=lilypond ly lysdoc - -include $(depth)/make/stepmake.make -TITLE=LilyPond MIDI Tests - diff --git a/input/midi/midi-drums.ly b/input/midi/midi-drums.ly deleted file mode 100644 index 2b799be25b..0000000000 --- a/input/midi/midi-drums.ly +++ /dev/null @@ -1,18 +0,0 @@ - -\version "2.10.0" - -\version "2.10.1" - -\score { - \new DrumStaff << - \drummode { - bd4 sn4 bd4 sn4 - << - {\voiceOne \repeat unfold 16 hh16 } - \new DrumVoice { \voiceTwo bd4 sn4 bd4 sn4 } - >> \oneVoice - } - >> - \layout {} - \midi {} -} diff --git a/input/midi/midi-grace.ly b/input/midi/midi-grace.ly deleted file mode 100644 index 213de79e37..0000000000 --- a/input/midi/midi-grace.ly +++ /dev/null @@ -1,22 +0,0 @@ -\version "2.10.0" -\header{ texidoc = "Tests MIDI output with grace notes. " } - -\score { - \context Voice \relative c { - \new Voice = VoiceOne - \grace { - \override Stem #'stroke-style = #"grace" - c8 - \revert Stem #'stroke-style } - d4 d d d d - \grace { - \override Stem #'stroke-style = #"grace" - e16 f e f - \revert Stem #'stroke-style } - d4 d d d d - - } - \layout { } - \midi { } -} - diff --git a/input/midi/midi-lyric-barcheck.ly b/input/midi/midi-lyric-barcheck.ly deleted file mode 100644 index 5c06916af0..0000000000 --- a/input/midi/midi-lyric-barcheck.ly +++ /dev/null @@ -1,24 +0,0 @@ -\version "2.10.0" -\header { - - texidoc = "Lyrics in MIDI are aligned to ties and beams: -this examples causes no bar checks in MIDI. -" - - - } -\score { - - <<\relative c'' \new Voice = A { - \autoBeamOff - c8[ c] c2. - c1~c4 c2. - c4 ( d e) d - c1 - - } - \lyricsto "A" \lyrics { bla bla | bla bla | bla bla | bla } - >> - \layout {} - \midi {} - } diff --git a/input/midi/midi-scales.ly b/input/midi/midi-scales.ly deleted file mode 100644 index d6e8ed91c5..0000000000 --- a/input/midi/midi-scales.ly +++ /dev/null @@ -1,159 +0,0 @@ - -\version "2.10.0" -% candidate for regression. -gp -\header { - texidoc="Converting LilyPond input to MIDI and then again back with - @code{midi2ly.py} is a reversible procedure in some simple cases, - which mean that the original @code{.ly} -file and the one converted - back from the generated @code{.midi} -file do not differ. - Here are produced some scales. - - " -} - -%{ - This means, doing: - - lilypond input/test/midi-scales.ly - midi2ly midi-scales.midi - diff -u input/test/midi-scales.ly midi-scales-midi.ly - - should show no differences at all in \key commands or notes. - - Therefore, do not reformat this file unless midi2ly changes. - - 1.7.30 reformatted, because - midi2ly now outpts 1 bar per line and adds bar checks and numbers. - -%} - -scales = \relative c { - - % [INSTRUMENT_NAME] bright acoustic - \key c \major % sharp-major - c'4 d e f | - g a b c | - - \key g \major - g a b c | - d e fis g | - - \key d \major - d, e fis g | - a b cis d | - - \key a \major - a b cis d | - e fis gis a | - - \key e \major - e, fis gis a | - b cis dis e | - - \key b \major - b cis dis e | - fis gis ais b | - - \key fis \major - fis, gis ais b | - cis dis eis fis | - - \key cis \major - cis, dis eis fis | - gis ais bis cis | - - \key a \minor % sharp-minor - a b c d | - e f gis a | - - \key e \minor - e, fis g a | - b c dis e | - - \key b \minor - b cis d e | - fis g ais b | - - \key fis \minor - fis, gis a b | - cis d eis fis | - - \key cis \minor - cis, dis e fis | - gis a bis cis | - - \key gis \minor - gis ais b cis | - dis e fisis gis | - - \key dis \minor - dis, eis fis gis | - ais b cisis dis | - - \key ais \minor - ais bis cis dis | - eis fis gisis ais | - - \key f \major % flat-major - f, g a bes | - c d e f | - - \key bes \major - bes c d ees | - f g a bes | - - \key ees \major - ees,, f g aes | - bes c d ees | - - \key aes \major - aes, bes c des | - ees f g aes | - - \key des \major - des,, ees f ges | - aes bes c des | - - \key ges \major - ges, aes bes ces | - des ees f ges | - - \key ces \major - ces,, des ees fes | - ges aes bes ces | - - \key d \minor % flat-minor - d, e f g | - a bes cis d | - - \key g \minor - g, a bes c | - d ees fis g | - - \key c \minor - c,, d ees f | - g aes b c | - - \key f \minor - f, g aes bes | - c des e f | - - \key bes \minor - bes,, c des ees | - f ges a bes | - - \key ees \minor - ees, f ges aes | - bes ces d ees | - - \key aes \minor - aes, bes ces des | - ees fes g aes | -} - -\score { - \context Voice \scales - \layout { } - \midi { } -} - diff --git a/input/midi/midi-tuplets.ly b/input/midi/midi-tuplets.ly deleted file mode 100644 index 0a0f5ef1a9..0000000000 --- a/input/midi/midi-tuplets.ly +++ /dev/null @@ -1,35 +0,0 @@ -\version "2.10.0" -\header { -texidoc = " - -Midi2ly tuplet test. - -@example - python scripts/midi2ly.py --duration-quant=32 \ - --allow-tuplet=4*2/3 \ - --allow-tuplet=8*2/3 \ - --allow-tuplet=4*3/5 \ - --allow-tuplet=8*3/5 \ - tu.midi -@end example -" -} - - -\score { - \context Voice \relative c' { - - a1 a2 a2. a4 a4. a8 a8. a16 a16. a32 a32. a64 - - \times 2/3 { b4 b4 b4 } - \times 3/5 { b4 b4 b4 b4 b4 } - - \times 2/3 { c8 c8 c8 } - \times 3/5 { c8 c8 c8 c8 c8 } - - } - \layout { } - \midi { } -} - - diff --git a/input/midi/midi-volume-equaliser.ly b/input/midi/midi-volume-equaliser.ly deleted file mode 100644 index 0ad06cb931..0000000000 --- a/input/midi/midi-volume-equaliser.ly +++ /dev/null @@ -1,161 +0,0 @@ -\version "2.10.0" -\header { - texidoc = "@cindex Midi Volume Equaliser -The full orchestra plays a notes, where groups stop one after -another. Use this to tune equalizer settings. " -} - -#(set-global-staff-size 16) - -%{ - -Override, see scm/midi.scm: - -#(set! instrument-equalizer-alist - (append - '( - ("flute" . (0 . 0.7)) - ) - instrument-equalizer-alist)) - -%} - -flauti = \relative c' { - \set Staff.midiInstrument = #"flute" - \set Staff.instrumentName = #"2 Flauti" - \set Staff.shortInstrumentName = #"Fl." - - c1\f R1*10 -} - -oboi = \relative c' { - \set Staff.midiInstrument = #"oboe" - \set Staff.instrumentName = #"2 Oboi" - \set Staff.shortInstrumentName = #"Ob." - - R1*1 c1\f R1*9 -} - -clarinetti = \relative c' { - \set Staff.midiInstrument = #"clarinet" - \set Staff.instrumentName = #"Clarinetti" - \set Staff.shortInstrumentName = #"Cl" - - R1*2 c1\f R1*8 -} - -fagotti = \relative c' { - \set Staff.midiInstrument = #"bassoon" - \set Staff.instrumentName = #"2 Fagotti" - \set Staff.shortInstrumentName = #"Fg." - - \clef bass - R1*3 c1\f R1*7 -} - -corni = \relative c' { - \set Staff.midiInstrument = #"french horn" - \set Staff.instrumentName = #"Corni" - \set Staff.shortInstrumentName = #"Cor" - - R1*4 c1\f R1*6 -} - -trombe = \relative c' { - \set Staff.midiInstrument = #"trumpet" - \set Staff.instrumentName = #"Trombe" - \set Staff.shortInstrumentName = #"Tp." - - \clef bass - R1*5 c1\f R1*5 -} - -timpani = \relative c' { - \set Staff.midiInstrument = #"timpani" - \set Staff.instrumentName = #"Timpani" - \set Staff.shortInstrumentName = #"Timp." - - R1*6 c1\f R1*4 -} - -violinoI = \relative c' { - \set Staff.midiInstrument = #"violin" - \set Staff.instrumentName = #"Violino I " - \set Staff.shortInstrumentName = #"Vl. I " - - R1*7 c1\f R1*3 -} - -violinoII = \relative c' { - \set Staff.midiInstrument = #"violin" - \set Staff.instrumentName = #"Violino II " - \set Staff.shortInstrumentName = #"Vl. II " - - R1*8 c1\f R1*2 -} - -viola = \relative c' { - \set Staff.midiInstrument = #"viola" - \set Staff.instrumentName = #"Viola" - \set Staff.shortInstrumentName = #"Vla." - - \clef alto - R1*9 c1\f R1*1 -} - -violoncello = \relative c' { - \set Staff.midiInstrument = #"cello" - %\set Staff.midiInstrument = #"contrabass" - \set Staff.instrumentName = #"Violoncello" - \set Staff.shortInstrumentName = #"Vc." - - \clef bass - R1*10 c1\f -} - - -\score { - << - \new StaffGroup = "legni" << - \new Staff = "flauti" \flauti - \new Staff = "oboi" \oboi - \new Staff = "clarinetti" \clarinetti - \new Staff = "fagotti" \fagotti - >> - \new StaffGroup = "ottoni" << - \new Staff = "corni" \corni - \new Staff = "trombe" \trombe - >> - \new StaffGroup = "timpani" << - \new Staff = "timpani" \timpani - { - \skip 1 - %% Hmm: this forces a staff-bracket, that's good! - %% However, I can't find where is decided on staff-bracket yes/no - } - >> - \new StaffGroup = "archi" << - \new GrandStaff = "violini" << - \new Staff = "violino1" \violinoI - \new Staff = "violino2" \violinoII - >> - \new Staff = "viola" \viola - \new Staff = "violoncello" \violoncello - >> - >> - - \layout { - \context { - \RemoveEmptyStaffContext - } - } - - \midi { - \context { - \Score - tempoWholesPerMinute = #(ly:make-moment 60 1) - } - } -} - - diff --git a/input/midi/transposition.ly b/input/midi/transposition.ly deleted file mode 100644 index 2429fef5d3..0000000000 --- a/input/midi/transposition.ly +++ /dev/null @@ -1,14 +0,0 @@ -\header -{ - texidoc = "should deliver f' in MIDI" -} -\version "2.10.5" - -\score { - { - \transposition f - c'' - } - \midi{} - \layout{} -} diff --git a/input/no-notation/GNUmakefile b/input/no-notation/GNUmakefile deleted file mode 100644 index daedbb1cc4..0000000000 --- a/input/no-notation/GNUmakefile +++ /dev/null @@ -1,8 +0,0 @@ -depth = ../.. - -EXTRA_DIST_FILES=README -LOCALSTEPMAKE_TEMPLATES=ly mutopia - -include $(depth)/make/stepmake.make - - diff --git a/input/no-notation/README b/input/no-notation/README deleted file mode 100644 index d162aad83c..0000000000 --- a/input/no-notation/README +++ /dev/null @@ -1,9 +0,0 @@ -These examples test various non-typesetting things. Since they -do not generate output, they are not in test/ or regression/ - -Some (notably parse*.ly) are just error/warning generation tests -and should remain here. - -Some (notably midi-*.ly) test midi output, which does not usually -get tested in ../regression files. - diff --git a/input/no-notation/bar-check.ly b/input/no-notation/bar-check.ly deleted file mode 100644 index e9a714eae9..0000000000 --- a/input/no-notation/bar-check.ly +++ /dev/null @@ -1,13 +0,0 @@ -\version "2.10.0" - -\header { - -texidoc = "skipTypesetting doesn't affect bar checks." - -} - -\score { { - \set Score.skipTypesetting = ##t - c4 c4 - | - c4 c4 }} diff --git a/input/no-notation/beam-warn.ly b/input/no-notation/beam-warn.ly deleted file mode 100644 index 3a6586de06..0000000000 --- a/input/no-notation/beam-warn.ly +++ /dev/null @@ -1,11 +0,0 @@ -\version "2.10.0" - -\header { - -texidoc = "The first duration following a beam-open request is checked if it is short enough." - -} - -\score { - { [c4 c] } -} diff --git a/input/no-notation/die-staff.ly b/input/no-notation/die-staff.ly deleted file mode 100644 index 4f94b3bd14..0000000000 --- a/input/no-notation/die-staff.ly +++ /dev/null @@ -1,23 +0,0 @@ -\version "2.10.0" - -\header { -texidoc = "a staff should really die, if no one's referencing it." -} -\score { - { - \new Staff = "q" { - { a' b' c' d' } - } - - \break - - \context PianoStaff << - \new Staff = "i" { - { a' b' c' d' } - } - \new Staff = "ii" { - { \clef "bass" a b c d } - } - >> - } -} diff --git a/input/no-notation/display-lily-tests.ly b/input/no-notation/display-lily-tests.ly deleted file mode 100644 index 014f63ccdb..0000000000 --- a/input/no-notation/display-lily-tests.ly +++ /dev/null @@ -1,262 +0,0 @@ -\version "2.10.0" - -#(use-modules (srfi srfi-13) - (ice-9 format)) - -%%% -%%% Testing utilities -%%% - -#(define (parse-lily-and-compute-lily-string chr port) - (let ((lily-string (call-with-output-string - (lambda (out) - (do ((c (read-char port) (read-char port))) - ((and (char=? c #\#) - (char=? (peek-char port) #\])) - (read-char port)) - (display c out)))))) - `(let* ((parser-clone (ly:clone-parser parser)) - (input-str (string-trim-both ,lily-string)) - (music (car (ly:music-property (parse-string-result input-str - parser-clone) - 'elements))) - (result-str (string-trim-both (music->lily-string music parser-clone)))) - (cons input-str result-str)))) - -#(read-hash-extend #\[ parse-lily-and-compute-lily-string) %{ ] %} - -#(define (lily-string->markup str) - (make-column-markup (string-split str #\NewLine))) - -#(define test-function - (let ((test-number 0)) - (lambda (parser location result-info strings) - (let ((input (car strings)) - (output (cdr strings))) - (set! test-number (1+ test-number)) - (if (string=? input output) - (make-music 'SequentialMusic 'void #t) - (make-music 'SequentialMusic - 'elements - (list (ly:parser-lookup parser 'fatText) - (make-music 'EventChord - 'elements (list (make-music 'LineBreakEvent - 'break-permission 'force))) - (make-music 'EventChord - 'elements (list (make-music 'SkipEvent - 'duration (ly:make-duration 0 0 1 1)) - (make-music 'TextScriptEvent - 'direction -1 - 'text (markup #:column - (#:simple (format #f "Test #~a " test-number) - (if (string-null? result-info) - (markup #:bold "BUG") - (markup #:simple result-info)) - #:typewriter (lily-string->markup input) - #:typewriter (lily-string->markup output))))))))))))) - - -test = -#(define-music-function (parser location result-info strings) (string? pair?) - (test-function parser location result-info strings)) - -%%% -%%% Tests -%%% -\header { - texidoc = \markup \column { \line { \typewriter display-lily-music unit tests } - \line { Real bugs (regressions) are marked as \bold BUG. } - \line { Known bugs are marked as TODO. } } -} - -\layout { - raggedright = ##t - indent = 0\cm - \context { - \Staff - \override StaffSymbol #'line-count = #1 - \remove "Time_signature_engraver" - \remove "Clef_engraver" - } - \context { - \Score - \remove "Bar_number_engraver" - } -} - -%% Sequential music -\test "" ##[ { { a b } { c d } } #] % SequentialMusic -\test "" ##[ << { a b } { c d } >> #] % SimultaneousMusic -\test "" ##[ << { a b } \\ { c d } >> #] % VoiceSeparator - -%% Chords and Notes -\test "" ##[ { ceses ces c cis cisis } #] % NoteEvent -\test "" ##[ { deses des d dis disis } #] -\test "" ##[ { eeses ees e eis eisis } #] -\test "" ##[ { feses fes f fis fisis } #] -\test "" ##[ { geses ges g gis gisis } #] -\test "" ##[ { aeses aes a ais aisis } #] -\test "" ##[ { beses bes b bis bisis } #] -\test "" ##[ { c,, d' } #] -\test "" ##[ { c' d'=' } #] -\test "" ##[ { c! c? } #] -\test "" ##[ r1.*4/3 #] % RestEvent -\test "" ##[ c1\rest #] % RestEvent -\test "" ##[ s2..*3/4 #] % SkipEvent -\test "" ##[ R1.*2/3 #] % MultiMeasureRestMusicGroup, MultiMeasureRestEvent -\test "" ##[ \skip 2.*3/4 #] % SkipMusic -\test "" ##[ < c\1 e\3 >4.*3/4-. #] % EventChord, NoteEvent, StringNumberEvent, ArticulationEvent - -%% tags -\test "" ##[ { \tag #'foo { c4 d } } #] -\test "" ##[ c-\tag #'foo -\tag #'baz -^ -. #] - -%% Graces -\test "" ##[ { \grace c8 d2 } #] % GraceMusic -\test "" ##[ { \appoggiatura c8 d2 } #] -\test "" ##[ { \acciaccatura c8 d2 } #] -\test "" ##[ { c1 \afterGrace { b,16 c } d2 } #] - -%% Clusters -\test "" ##[ { \makeClusters { c4 g } } #] % ClusterNoteEvent - -%% Figured bass -\test "" ##[ \figures { < 6 > } #] % BassFigureEvent -\test "" ##[ \figuremode { < 1-- 3- > < 2+ 4++ > < _! 7! > } #] -\test "" ##[ \figuremode { < [6 > < 5] > } #] - -%% Lyrics -\test "" ##[ \lyrics { a b } #] -\test "" ##[ \lyricmode { a -- b } #] % HyphenEvent -\test "" ##[ \lyricmode { a __ b } #] % ExtenderEvent -\test "" ##[ \lyricmode { "a " } #] % LyricEvent -\test "" ##[ \lyricsto "foo" { bla bla } #] % LyricCombineMusic -\test "" ##[ { { c d } - \addlyrics { bla bla } } #] - -%% Drums -\test "" ##[ \drums { hihat } #] -\test "" ##[ \drummode { hihat4.*3/4 } #] - -%% Expressive marks -\test "" ##[ c4 ~ #] % TieEvent -\test "" ##[ c\noBeam #] % BeamForbidEvent -\test "" ##[ c\1 #] % StringNumberEvent -\test "" ##[ { c: c:1 } #] % TremoloEvent -\test "" ##[ { c-^ c^^ c_^ } #] % ArticulationEvent -\test "" ##[ { c-+ c^+ c_+ } #] -\test "" ##[ { c-- c^- c_- } #] -\test "" ##[ { c-| c^| c_| } #] -\test "" ##[ { c-> c^> c_> } #] -\test "" ##[ { c-. c^. c_. } #] -\test "" ##[ { c-_ c^_ c__ } #] -\test "" ##[ { c-\trill c^\trill c_\trill } #] -\test "" ##[ { c-1 c^2 c_3 } #] % FingerEvent -\test "" ##[ { c-"foo" c^"foo" c_"foo" } #] % TextScriptEvent -\test "" ##[ { R1*4-"foo" R^"foo" R_"foo" } #] % MultiMeasureTextEvent -\test "" ##[ { c4-\harmonic c^\harmonic c_\harmonic } #] % HarmonicEvent -\test "" ##[ { c-\glissando c^\glissando c_\glissando } #] % GlissandoEvent -\test "" ##[ { c-\arpeggio c^\arpeggio c_\arpeggio } #] % ArpeggioEvent -\test "" ##[ { c\p c^\ff c_\sfz } #] % AbsoluteDynamicEvent -\test "" ##[ { c[ c] c^[ c^] c_[ c_] } #] % BeamEvent -\test "" ##[ { c( c) c^( c^) c_( c_) } #] % SlurEvent -\test "" ##[ { c\< c\! c^\< c^\! c_\< c_\! } #] % CrescendoEvent -\test "" ##[ { c\> c\! c^\> c^\! c_\> c_\! } #] % DecrescendoEvent -\test "" ##[ { c\( c\) c^\( c^\) c_\( c_\) } #] % PhrasingSlurEvent -\test "" ##[ { c\sustainDown c\sustainUp } #] % SustainEvent -\test "" ##[ { c\sostenutoDown c\sostenutoUp } #] % SostenutoEvent -\test "" ##[ \melisma #] -\test "" ##[ \melismaEnd #] -\test "" ##[ { c\startTextSpan c\stopTextSpan } #] % TextSpanEvent -\test "" ##[ { c\startTrillSpan c\stopTrillSpan } #] % TrillSpanEvent -\test "" ##[ { c \startStaff c \stopStaff } #] % StaffSpanEvent -\test "" ##[ { c\startGroup c\stopGroup c^\startGroup c^\stopGroup c_\startGroup c_\stopGroup } #] % NoteGroupingEvent -\test "" ##[ { c\unaCorda c\treCorde } #] % UnaCordaEvent -\test "" ##[ \breathe #] -\test "" ##[ { c \[ c \] } #] % LigatureEvent -\test "" ##[ \~ #] % PesOrFlexaEvent - -\test "" ##[ \break #] -\test "" ##[ \noBreak #] -\test "" ##[ \pageBreak #] -\test "" ##[ \noPageBreak #] -\test "" ##[ \pageTurn #] -\test "" ##[ \noPageTurn #] - -%% Checks -\test "" ##[ \octave a' #] % RelativeOctaveCheck -\test "" ##[ | #] % BarCheck - -%% Marks -\test "" ##[ \mark \default #] % MarkEvent -\test "" ##[ \mark "Allegro" #] -\test "" ##[ \tempo 4 = 120 #] % MetronomeChangeEvent - -%% key, time, clef, bar -\test "" ##[ \key \default #] % KeyChangeEvent -\test "" ##[ \key e \minor #] -\test "" ##[ \clef "bass" #] -\test "" ##[ \clef "french^2" #] -\test "" ##[ \clef "alto_3" #] -\test "" ##[ \time 2/4 #] -\test "" ##[ #(set-time-signature 5 8 '(3 2)) #] -\test "" ##[ \bar "|." #] - -%% staff switches -\test "" ##[ \autochange { c d } #] % AutoChangeMusic -\test "" ##[ { \change Staff = "up" { c d } } #] % ContextChange - -%% Tuplets -\test "" ##[ \times 2/3 { c8 d e } #] % TimeScaledMusic -\test "" ##[ \times 4/6 { c16 d e f g a } #] -%} -%% \relative and \tranpose -\test #"NOT A BUG" ##[ \relative c' { c b } #] % RelativeOctaveMusic -\test #"NOT A BUG" ##[ \transpose c d { c d } #] % TransposedMusic -%} -%% Repeats -\test "" ##[ \repeat volta 2 { c d } #] % VoltaRepeatedMusic -\test "" ##[ \repeat unfold 2 { c d } #] % UnfoldedRepeatedMusic -\test "" ##[ \repeat fold 2 { c d } #] % FoldedRepeatedMusic -\test "" ##[ \repeat percent 2 { c d } #] % PercentRepeatedMusic -\test "" ##[ \repeat tremolo 4 { c16 d } #] % TremoloRepeatedMusic -\test "" ##[ \repeat volta 2 { c4 d } \alternative { { c d } { e f } } #] % - -%% Context creation -\test "" ##[ \new Staff { c d } #] % ContextSpeccedMusic -\test "" ##[ \new Staff = "up" { c d } #] % ContextSpeccedMusic -\test "" ##[ \context Staff { c d } #] -\test "" ##[ \context Staff = "up" { c d } #] -\test "" ##[ -\new Staff \with { - \consists "Timing_engraver" - \remove "Clef_engraver" -} { c d } #] -%% Context properties -\test "" ##[ \once \set Score . skipBars = ##t #] % PropertySet -\test "" ##[ \set autoBeaming = ##f #] -\test "" ##[ \unset Score . skipBars #] % PropertyUnset -\test "" ##[ \unset autoBeaming #] -%% Layout properties -\test "" ##[ \override Staff . Stem #'thickness = #4.0 #] % OverrideProperty -\test "" ##[ \once \override Beam #'thickness = #0.6 #] -\test "" ##[ \revert Staff . Stem #'thickness #] % RevertProperty -\test "" ##[ \revert Beam #'thickness #] - -%% \applyOutput -\test "" ##[ \applyOutput #'Foo #(lambda (arg) (list)) #] -%% \applyContext -\test "" ##[ \applyContext #(lambda (arg) (list)) #] - -%% \partial -\test "" ##[ \partial 2 #] -\test "" ##[ \partial 8. #] -\test #"TODO? exotic durations in \\partial" ##[ \partial 4*2/3 #] - -%% \partcombine -\test "" ##[ \partcombine { c e } -{ d f } #] % PartCombineMusic UnrelativableMusic - -%% Cue notes -\test "" ##[ \cueDuring #"foo" #1 { c d } #] -\test "" ##[ \quoteDuring #"foo" { c d } #] diff --git a/input/no-notation/dos-guile.ly b/input/no-notation/dos-guile.ly deleted file mode 100644 index 9858a594f1..0000000000 --- a/input/no-notation/dos-guile.ly +++ /dev/null @@ -1,14 +0,0 @@ -\version "2.10.0" - -\header{ - - texidoc = "This should not hang lilypond --safe-mode." - -} - -% DOS -#(do () (#f)) - -\score{ - c'' -} \ No newline at end of file diff --git a/input/no-notation/dos-ps.ly b/input/no-notation/dos-ps.ly deleted file mode 100644 index 31c0da1b99..0000000000 --- a/input/no-notation/dos-ps.ly +++ /dev/null @@ -1,13 +0,0 @@ -\version "2.10.0" - -\header{ - - texidoc = "This should not hang lilypond --safe-mode --no-pdf - --png run. - -} - -\score{ - % DOS - c''-"\\embeddedps{ { 0 0 moveto } loop }" -} diff --git a/input/no-notation/dos-tex.ly b/input/no-notation/dos-tex.ly deleted file mode 100644 index 859df66f83..0000000000 --- a/input/no-notation/dos-tex.ly +++ /dev/null @@ -1,12 +0,0 @@ -\version "2.10.0" - -\header{ - - texidoc = "This should not hang lilypond --safe-mode run." - -} - -\score{ - % DOS - c''-"\\loop\\iftrue\\repeat" -} diff --git a/input/no-notation/dynamic-absolute-volume.ly b/input/no-notation/dynamic-absolute-volume.ly deleted file mode 100644 index 8c3a24cd1c..0000000000 --- a/input/no-notation/dynamic-absolute-volume.ly +++ /dev/null @@ -1,34 +0,0 @@ - -\version "2.10.0" -\header { - texidoc = "@cindex Dynamic Absolute Volume -Absolute dynamics have an effect on MIDI files. -" -} - - -\score{ -\relative c''{ -%segfault in engraver -a1\ppp -a1\pp -a\p -a\mp -a\mf -a\f -a\ff -a\fff -a\sf -} -\layout{ ragged-right = ##t } - - \midi { - \context { - \Score - tempoWholesPerMinute = #(ly:make-moment 60 1) - } - } - - -} - diff --git a/input/no-notation/embedded-scm.ly b/input/no-notation/embedded-scm.ly deleted file mode 100644 index b84dfc82d9..0000000000 --- a/input/no-notation/embedded-scm.ly +++ /dev/null @@ -1,22 +0,0 @@ -\version "2.10.0" -\header { - - texidoc = "@cindex Embedded scm - -You can embed scheme functions in your scores. While generating the -output, ``hello world'' is printed to the console. -" - % see also: --safe-mode -} - -#(begin - (newline) - (display "hello world") - (newline)) - -\score { - \relative c' { c } - \layout {ragged-right = ##t} -} - - diff --git a/input/no-notation/parse.ly b/input/no-notation/parse.ly deleted file mode 100644 index b85132308e..0000000000 --- a/input/no-notation/parse.ly +++ /dev/null @@ -1,5 +0,0 @@ -\version "2.10.0" - -% Test parser error - -\score{ diff --git a/input/no-notation/parse2.ly b/input/no-notation/parse2.ly deleted file mode 100644 index 5096c6c69a..0000000000 --- a/input/no-notation/parse2.ly +++ /dev/null @@ -1,9 +0,0 @@ -\version "2.10.0" - -% Test parser error - -foo = { - - -\score{ -} diff --git a/input/no-notation/parse3.ly b/input/no-notation/parse3.ly deleted file mode 100644 index cdf9626309..0000000000 --- a/input/no-notation/parse3.ly +++ /dev/null @@ -1,9 +0,0 @@ -\version "2.10.0" - -% Test parser error - -foo = { - - -\score{ - diff --git a/input/no-notation/parse4.ly b/input/no-notation/parse4.ly deleted file mode 100644 index cee8a6a7c5..0000000000 --- a/input/no-notation/parse4.ly +++ /dev/null @@ -1,12 +0,0 @@ -\version "2.10.0" - -% Test parser error - -foo = { -} - - -\score{ - burp -} - diff --git a/input/no-notation/parse5.ly b/input/no-notation/parse5.ly deleted file mode 100644 index 4b9756ee9f..0000000000 --- a/input/no-notation/parse5.ly +++ /dev/null @@ -1,11 +0,0 @@ -\version "2.10.0" -%If you specify two different key sigs at one point, a -%warning is printed. - -\score { -\context Voice << - { \key cis \major cis4 \key bes \major bes4 } - { \key cis \major fis4 \key es \major g4 } ->> -} - diff --git a/input/no-notation/recording.ly b/input/no-notation/recording.ly deleted file mode 100644 index 39ea07dfa3..0000000000 --- a/input/no-notation/recording.ly +++ /dev/null @@ -1,24 +0,0 @@ -\version "2.10.0" -\header { - -texidoc = "The @code{Recording_group_engraver} will record events -synchronized in time, collecting them in a list. This file also shows -how to skip the rendering and outputting step of the process, using -@code{ly:run-translator}." - -} - -theMusic = \context Staff { c4 d8-. } - -#(define (notice-the-events context lst) - (map (lambda (x) (display x) (newline)) lst)) - -listener = \layout { - \context { - \Voice - \type "Recording_group_engraver" - recordEventSequence = #notice-the-events - } -} - -#(ly:run-translator theMusic listener) diff --git a/input/no-notation/safe-guile.ly b/input/no-notation/safe-guile.ly deleted file mode 100644 index eeaf1f2efc..0000000000 --- a/input/no-notation/safe-guile.ly +++ /dev/null @@ -1,14 +0,0 @@ -\version "2.10.0" - -\header{ - - texidoc = "This should not survive lilypond --safe-mode, and - certainly not write /tmp/safe-guile.scm" - -} - -#(write "hallo" (open-file "/tmp/safe-guile.scm" "w")) - -\score{ - c'' -} \ No newline at end of file diff --git a/input/no-notation/safe-include.ly b/input/no-notation/safe-include.ly deleted file mode 100644 index aa26b22239..0000000000 --- a/input/no-notation/safe-include.ly +++ /dev/null @@ -1,13 +0,0 @@ -\version "2.10.0" - -\header{ - - texidoc = "This should not survive lilypond --safe-mode" - -} - -\include "safe-ps.ly" - -\score{ - c'' -} \ No newline at end of file diff --git a/input/no-notation/safe-ps.ly b/input/no-notation/safe-ps.ly deleted file mode 100644 index 8a0ccca602..0000000000 --- a/input/no-notation/safe-ps.ly +++ /dev/null @@ -1,10 +0,0 @@ -\version "2.10.0" - -\header{ - texidoc = "This should not survive lilypond --safe-mode - --no-pdf --png run, and certainly not write /tmp/safe-ps.ps" -} - -\score{ - c''-"\\embeddedps{ (/tmp/safe-ps.ps) (w) file (hallo) writestring }" -} diff --git a/input/no-notation/safe-tex.ly b/input/no-notation/safe-tex.ly deleted file mode 100644 index 516146ee42..0000000000 --- a/input/no-notation/safe-tex.ly +++ /dev/null @@ -1,16 +0,0 @@ -\version "2.10.0" - -\header{ - - texidoc = "This should not survive lilypond --safe-mode run, and - certainly not write /tmp/safe-tex.tex" - - % beware - % openout_any=y lilypond --keep --safe-mode -S latexoptions=']{article} - % \let\nofiles\relax%' input/no-notation/safe-tex.ly - -} - -\score{ - c''-"\\newwrite\\barf\\immediate\\openout\\barf=/tmp/safe-tex.tex\\immediate\\write\\barf{hallo}" -} diff --git a/input/no-notation/textcresc.ly b/input/no-notation/textcresc.ly deleted file mode 100644 index 08b1fde3cc..0000000000 --- a/input/no-notation/textcresc.ly +++ /dev/null @@ -1,15 +0,0 @@ -\version "2.10.0" -\header{ -texidoc="crashes lily" -} - -\score { { - \context Voice { - \set crescendoText = "cresc." - \set crescendoSpanner = #'dashed-line - c2. r8 c8 \< \break \! c1 - } -} -\layout { line-width = 5.\cm} -} - diff --git a/input/no-notation/to-xml.ly b/input/no-notation/to-xml.ly deleted file mode 100644 index 036063fbdb..0000000000 --- a/input/no-notation/to-xml.ly +++ /dev/null @@ -1,27 +0,0 @@ -\version "2.10.0" - -fooBar = { << c''4 \\ g'4 >> } - -#(ly:set-option 'parse-protect #f) -#(load-from-path "to-xml.scm") - -#(music-to-xml fooBar (current-output-port)) - -\header { - texidoc = "@cindex To XML" - texidoc = #(string-append - "The input representation is very generic. Therefore, it - should not be hard to convert it to XML or a similar format:\n\n" - - "@example\n" - (call-with-output-string - (lambda (p) (music-to-xml fooBar p)) - ) - "@end example" ) -} - - -\score { -\fooBar -} - diff --git a/input/proportional.ly b/input/proportional.ly index d5f68c70dc..0f87feae22 100644 --- a/input/proportional.ly +++ b/input/proportional.ly @@ -1,4 +1,4 @@ -\version "2.10.0" +\version "2.11.11" \header { @@ -14,7 +14,7 @@ \remove "Forbid_line_break_engraver" \override TupletNumber #'text = #tuplet-number::calc-fraction-text tupletFullLength = ##t - allowBeamBreak = ##t + \override Beam #'breakable = ##t } \context { \Score diff --git a/input/regression/+.ly b/input/regression/+.ly deleted file mode 100644 index d19595bf02..0000000000 --- a/input/regression/+.ly +++ /dev/null @@ -1,31 +0,0 @@ -\version "2.10.0" -%% +.ly: Be the first .ly file for lys-to-tely.py. -%% Better to make lys-to-tely.py include "introduction.texi" or -%% other .texi documents too? - - -\header{ -texidoc = - -#(string-append "@unnumbered Introduction - -This document presents proofs for -LilyPond " (lilypond-version) ". When the -text corresponds with the shown notation, we consider LilyPond Officially -BugFree (tm). This document is intended for finding bugs and for -documenting bugfixes. - -In the web version of this document, you can click on the file name -or figure for each example to see the corresponding input file. - -TODO: order of tests (file names!), test only one feature per test. -Smaller and neater tests. -") - -} - -% -% make sure the .png is generated. -% -\lyrics { "(left blank intentionally)" } - diff --git a/input/regression/AAA-intro-regression.ly b/input/regression/AAA-intro-regression.ly new file mode 100644 index 0000000000..d19595bf02 --- /dev/null +++ b/input/regression/AAA-intro-regression.ly @@ -0,0 +1,31 @@ +\version "2.10.0" +%% +.ly: Be the first .ly file for lys-to-tely.py. +%% Better to make lys-to-tely.py include "introduction.texi" or +%% other .texi documents too? + + +\header{ +texidoc = + +#(string-append "@unnumbered Introduction + +This document presents proofs for +LilyPond " (lilypond-version) ". When the +text corresponds with the shown notation, we consider LilyPond Officially +BugFree (tm). This document is intended for finding bugs and for +documenting bugfixes. + +In the web version of this document, you can click on the file name +or figure for each example to see the corresponding input file. + +TODO: order of tests (file names!), test only one feature per test. +Smaller and neater tests. +") + +} + +% +% make sure the .png is generated. +% +\lyrics { "(left blank intentionally)" } + diff --git a/input/regression/accidental-ancient.ly b/input/regression/accidental-ancient.ly new file mode 100644 index 0000000000..879f81c2b6 --- /dev/null +++ b/input/regression/accidental-ancient.ly @@ -0,0 +1,26 @@ + +\header { +texidoc = "@cindex Ancient Accidentals +Accidentals are available in different ancient styles, which all +are collected here. +" +} + +\version "2.11.6" + +\relative c'' { + \time 3/4 + cis^\markup { \typewriter default } c ces + + \override Staff.Accidental #'glyph-name-alist = #alteration-hufnagel-glyph-name-alist + cis^\markup { \typewriter hufnagel } c ces + + \override Staff.Accidental #'glyph-name-alist = #alteration-medicaea-glyph-name-alist + cis^\markup { \typewriter medicaea } c ces + + \override Staff.Accidental #'glyph-name-alist = #alteration-vaticana-glyph-name-alist + cis^\markup { \typewriter vaticana } c ces + + \override Staff.Accidental #'glyph-name-alist = #alteration-mensural-glyph-name-alist + cis^\markup { \typewriter mensural } c ces +} diff --git a/input/regression/accidental-cautionary.ly b/input/regression/accidental-cautionary.ly index d93d253c04..b48c8b610d 100644 --- a/input/regression/accidental-cautionary.ly +++ b/input/regression/accidental-cautionary.ly @@ -1,4 +1,4 @@ -\version "2.10.0" +\version "2.11.5" \header { texidoc = "Cautionary accidentals are indicated using either @@ -13,9 +13,9 @@ parentheses (default) or smaller accidentals. { c''4 cis''?4 - \override Staff.Accidental #'cautionary-style = #'smaller + \once \override Staff.AccidentalCautionary #'font-size = #-2 cis''?4 - \override Staff.Accidental #'cautionary-style = #'parentheses + \once \override Staff.AccidentalCautionary #'parenthesized = ##t cis''?4 } diff --git a/input/regression/accidental-clef-change.ly b/input/regression/accidental-clef-change.ly index 59a6b64b58..fabf9546bb 100644 --- a/input/regression/accidental-clef-change.ly +++ b/input/regression/accidental-clef-change.ly @@ -2,6 +2,11 @@ texidoc = "Accidentals are reset for clef changes." } +\layout { + ragged-right = ##t +} + + \version "2.10.0" \new Staff \relative c' { \clef treble @@ -10,4 +15,3 @@ } -\layout {ragged-right = ##t} diff --git a/input/regression/accidental-suggestions.ly b/input/regression/accidental-suggestions.ly index 8ad68e34a1..06abaedb66 100644 --- a/input/regression/accidental-suggestions.ly +++ b/input/regression/accidental-suggestions.ly @@ -7,7 +7,7 @@ denoting Musica Ficta." } -\version "2.10.0" +\version "2.11.5" \paper { ragged-right = ##t } @@ -16,10 +16,8 @@ denoting Musica Ficta." \time 2/4 \set suggestAccidentals = ##t cis^> gis'-| - \override AccidentalSuggestion #'cautionary-style = #'parentheses + \override AccidentalSuggestion #'parenthesized = ##t cis,_"paren" gis' - \override AccidentalSuggestion #'cautionary-style = #'() - cis,_"no caut style" gis' } diff --git a/input/regression/apply-context.ly b/input/regression/apply-context.ly index 9024fbe8f4..abcbd30281 100644 --- a/input/regression/apply-context.ly +++ b/input/regression/apply-context.ly @@ -24,7 +24,7 @@ This example prints a bar-number during processing on stdout. \applyContext #(lambda (tr) - (format #t "\nWe were called in barnumber ~a.\n" + (ly:progress "\nWe were called in bar number ~a.\n" (ly:context-property tr 'currentBarNumber))) c1 c1 } diff --git a/input/regression/auto-beam-beaming-override.ly b/input/regression/auto-beam-beaming-override.ly new file mode 100644 index 0000000000..2eb529a05f --- /dev/null +++ b/input/regression/auto-beam-beaming-override.ly @@ -0,0 +1,21 @@ + +\header { + + + texidoc = "Autobeamer remembers @code{subdivideBeams} and other +beaming pattern related functions at the start of an autobeam." + +} + + +\version "2.11.12" +\paper { ragged-right = ##t } +{ + \time 2/4 + b16 b b b + b16 b b b + \set subdivideBeams = ##t + \set Score.beatLength = #(ly:make-moment 1 8) + b16 b b b + b16 b b b +} diff --git a/input/regression/backend-excercise.ly b/input/regression/backend-excercise.ly index 5c623f978b..f709dabb7b 100644 --- a/input/regression/backend-excercise.ly +++ b/input/regression/backend-excercise.ly @@ -23,7 +23,8 @@ \makeClusters { 8 4 } \override Glissando #'style = #'zigzag - f2 \glissando f' + \slurDashed + f2( \glissando f') \setEasyHeads f e } diff --git a/input/regression/bar-line-dotted.ly b/input/regression/bar-line-dotted.ly new file mode 100644 index 0000000000..622ca7556b --- /dev/null +++ b/input/regression/bar-line-dotted.ly @@ -0,0 +1,18 @@ + +\header { + texidoc = "The dots in a dotted bar line are in spaces." + +} + +\version "2.10.0" + +\paper { ragged-right = ##t } + +\relative \new StaffGroup << + \new Staff { + c4 \bar ":" c } + \new Staff { + c c + } +>> + diff --git a/input/regression/beam-break.ly b/input/regression/beam-break.ly index ada5d68206..c2d4a2a08e 100644 --- a/input/regression/beam-break.ly +++ b/input/regression/beam-break.ly @@ -4,10 +4,10 @@ " } -\version "2.10.0" +\version "2.11.10" \layout { ragged-right= ##t } \relative c'' { - \set Score.allowBeamBreak = ##t + \override Score.Beam #'breakable = ##t \time 3/16 c16-[ d e \break f-] } diff --git a/input/regression/beam-flat-retain-direction.ly b/input/regression/beam-flat-retain-direction.ly new file mode 100644 index 0000000000..ba03734854 --- /dev/null +++ b/input/regression/beam-flat-retain-direction.ly @@ -0,0 +1,16 @@ +\header +{ + texidoc = "Even very flat but slanted patterns should give slanted beams. " +} + +\version "2.10.7" +\layout{ + line-width = 15\cm + debug-beam-scoring = ##t +} + +\relative c'''{ + \time 2/4 + \assertBeamQuant #'(0 . 1) #'(0 . 0) + fis16[ dis b ais] cis4 +} diff --git a/input/regression/beam-slope-stemlet.ly b/input/regression/beam-slope-stemlet.ly new file mode 100644 index 0000000000..a0657e81c4 --- /dev/null +++ b/input/regression/beam-slope-stemlet.ly @@ -0,0 +1,22 @@ + +\header { + + texidoc = "For slope calculations, stemlets are treated +as invisible stems." + +} + +\version "2.10.7" + +\layout { + ragged-right = ##t + indent = #0 +} + +\relative c' { + \times 2/3 {r8[ c' g']} + \override Stem #'stemlet-length = #0.5 + \times 2/3 {r8[ c, g']} +} + + diff --git a/input/regression/bend-dot.ly b/input/regression/bend-dot.ly index 4b55de5cd4..67a354e2f9 100644 --- a/input/regression/bend-dot.ly +++ b/input/regression/bend-dot.ly @@ -3,6 +3,10 @@ texidoc = "Bends avoid dots, but only if necessary." } +\paper { + ragged-right = ##t +} + \score { << \new Staff \relative c' { @@ -13,7 +17,3 @@ } >> } - -\paper { - ragged-right = ##t -} diff --git a/input/regression/break.ly b/input/regression/break.ly index 1611f96532..b3a88c798e 100644 --- a/input/regression/break.ly +++ b/input/regression/break.ly @@ -7,13 +7,13 @@ Breaks can be encouraged and discouraged using @code{\\break} and @code{\\noBreak}." } +\layout { + indent = 0.0 + line-width = 4.0\cm +} \relative c'' \context Voice { \emptyText c1 \noBreak c1 \noBreak \mark "nobreak" c1 \noBreak c1 \break \mark "break" c1 \break \mark "break" c1 } -\layout { - indent = 0.0 - line-width = 4.0\cm -} diff --git a/input/regression/chord-tremolo-single.ly b/input/regression/chord-tremolo-single.ly new file mode 100644 index 0000000000..f4c03abcf5 --- /dev/null +++ b/input/regression/chord-tremolo-single.ly @@ -0,0 +1,13 @@ +\version "2.10.0" + +\header{ +texidoc="Chord tremolos on a single note." +} + +\context Voice \relative c' { + \time 4/4 + \repeat "tremolo" 32 { d32 } + + c4 c4 c4 c4 c4 +} + diff --git a/input/regression/cluster-break.ly b/input/regression/cluster-break.ly new file mode 100644 index 0000000000..9b42b923c0 --- /dev/null +++ b/input/regression/cluster-break.ly @@ -0,0 +1,21 @@ + +\version "2.10.7" +\header { + texidoc = "Clusters behave well across line breaks." +} + +\layout { ragged-right = ##t } + +fragment = \relative c' { + \time 2/4 + 4 + 4 | \break + + +} + +<< \new Staff \makeClusters \fragment + \new Staff \fragment +>> + + diff --git a/input/regression/cluster-style.ly b/input/regression/cluster-style.ly new file mode 100644 index 0000000000..9d4dfc8236 --- /dev/null +++ b/input/regression/cluster-style.ly @@ -0,0 +1,34 @@ + + +\version "2.10.7" +\header { + texidoc = "Clusters behave well across line breaks." +} + +\layout { ragged-right = ##t } + +fragment = \relative c' { + 4 + 4 + 4 +} + +<< + \time 2/4 + \new Staff { + \override ClusterSpanner #'style = #'ramp + \makeClusters \fragment + r4 + \override ClusterSpanner #'style = #'leftsided-stairs + \makeClusters \fragment + r4 + \override ClusterSpanner #'style = #'rightsided-stairs + \makeClusters \fragment + r4 + \override ClusterSpanner #'style = #'centered-stairs + \makeClusters \fragment + } + +>> + + diff --git a/input/regression/cluster.ly b/input/regression/cluster.ly index 289c1f8984..a05f2ac73d 100644 --- a/input/regression/cluster.ly +++ b/input/regression/cluster.ly @@ -15,7 +15,7 @@ fragment = \relative c' { << \new Staff \fragment - \new Staff \applyMusic #notes-to-clusters \fragment + \new Staff \makeClusters \fragment >> diff --git a/input/regression/collision-manual.ly b/input/regression/collision-manual.ly new file mode 100644 index 0000000000..002a2c172c --- /dev/null +++ b/input/regression/collision-manual.ly @@ -0,0 +1,17 @@ +\header { + + texidoc = "Collision resolution may be forced manually with @code{force-hshift}. " +} +\version "2.11.10" + +\paper { + ragged-right = ##t +} + +\relative { + << { f + \override NoteColumn #'force-hshift = #0.1 + f } \\ + { e e } + >> +} diff --git a/input/regression/completion-heads-polyphony.ly b/input/regression/completion-heads-polyphony.ly index 63c555519a..c2802689b3 100644 --- a/input/regression/completion-heads-polyphony.ly +++ b/input/regression/completion-heads-polyphony.ly @@ -8,11 +8,6 @@ Completion heads are not fooled by polyphony with a different rhythm. } -\context Staff \relative c'' << - { c2. c bes2 } \\ - { c2. a8 g4 f4. g4 f } ->> - \layout { \context{ \Voice @@ -20,3 +15,8 @@ Completion heads are not fooled by polyphony with a different rhythm. \consists "Completion_heads_engraver" } } + +\context Staff \relative c'' << + { c2. c bes2 } \\ + { c2. a8 g4 f4. g4 f } +>> diff --git a/input/regression/context-die-staff.ly b/input/regression/context-die-staff.ly new file mode 100644 index 0000000000..b36ae93cf7 --- /dev/null +++ b/input/regression/context-die-staff.ly @@ -0,0 +1,16 @@ +\version "2.10.0" + +\header { +texidoc = "a staff should die if there is reference to it." +} +\layout { + ragged-right = ##t + line-width = 2.5 \cm + indent = 0.0 +} + +{ + << \new Staff = "q" \new Voice ="V" c1 >> + %% no \break, BreakEvent causes spurious staff + \new RhythmicStaff = "R" \new Voice = "RV" c +} diff --git a/input/regression/display-lily-tests.ly b/input/regression/display-lily-tests.ly new file mode 100644 index 0000000000..5b2b4f198c --- /dev/null +++ b/input/regression/display-lily-tests.ly @@ -0,0 +1,237 @@ +\version "2.11.6" +#(use-modules (srfi srfi-13) + (ice-9 format)) + +%%% +%%% Testing utilities +%%% +#(use-modules (scm display-lily)) +#(memoize-clef-names supported-clefs) +#(define (parse-lily-and-compute-lily-string chr port) + (let ((lily-string (call-with-output-string + (lambda (out) + (do ((c (read-char port) (read-char port))) + ((and (char=? c #\#) + (char=? (peek-char port) #\])) + (read-char port)) + (display c out)))))) + `(let* ((parser-clone (ly:parser-clone parser)) + (input-str (string-trim-both ,lily-string)) + (music (car (ly:music-property (parse-string-result input-str + parser-clone) + 'elements))) + (result-str (string-trim-both (music->lily-string music parser-clone)))) + (cons input-str result-str)))) + +#(read-hash-extend #\[ parse-lily-and-compute-lily-string) %{ ] %} + +#(define (lily-string->markup str) + (make-column-markup (string-split str #\NewLine))) + +#(define test-function + (let ((test-number 0)) + (lambda (parser location result-info strings) + (let ((input (car strings)) + (output (cdr strings))) + (set! test-number (1+ test-number)) + (if (not (equal? input output)) + (ly:progress "Test ~a unequal: ~a. \nin = ~a\nout = ~a\n" + test-number + (if result-info + result-info "BUG") + input output)) + (make-music 'SequentialMusic 'void #t))))) + +test = +#(define-music-function (parser location result-info strings) (string? pair?) + (test-function parser location result-info strings)) + +%%% +%%% Tests +%%% +\header { + texidoc = "This is a test of the display-lily-music unit. Problems are reported on the +stderr of this run." +} + +%% Sequential music +\test "" ##[ { { a b } { c d } } #] % SequentialMusic +\test "" ##[ << { a b } { c d } >> #] % SimultaneousMusic +\test "" ##[ << { a b } \\ { c d } >> #] % VoiceSeparator + +%% Chords and Notes +\test "" ##[ { ceses ces c cis cisis } #] % NoteEvent +\test "" ##[ { deses des d dis disis } #] +\test "" ##[ { eeses ees e eis eisis } #] +\test "" ##[ { feses fes f fis fisis } #] +\test "" ##[ { geses ges g gis gisis } #] +\test "" ##[ { aeses aes a ais aisis } #] +\test "" ##[ { beses bes b bis bisis } #] +\test "" ##[ { c,, d' } #] +\test "" ##[ { c' d'=' } #] +\test "" ##[ { c! c? } #] +\test "" ##[ r1.*4/3 #] % RestEvent +\test "" ##[ c1\rest #] % RestEvent +\test "" ##[ s2..*3/4 #] % SkipEvent +\test "" ##[ R1.*2/3 #] % MultiMeasureRestMusicGroup, MultiMeasureRestEvent +\test "" ##[ \skip 2.*3/4 #] % SkipMusic +\test "" ##[ < c\1 e\3 >4.*3/4-. #] % EventChord, NoteEvent, StringNumberEvent, ArticulationEvent + +%% tags +\test "" ##[ { \tag #'foo { c4 d } } #] +\test "" ##[ c-\tag #'foo -\tag #'baz -^ -. #] + +%% Graces +\test "" ##[ { \grace c8 d2 } #] % GraceMusic +\test "" ##[ { \appoggiatura c8 d2 } #] +\test "" ##[ { \acciaccatura c8 d2 } #] +\test "" ##[ { c1 \afterGrace { b,16 c } d2 } #] + +%% Clusters +\test "" ##[ { \makeClusters { c4 g } } #] % ClusterNoteEvent + +%% Figured bass +\test "" ##[ \figures { < 6 > } #] % BassFigureEvent +\test "" ##[ \figuremode { < 1-- 3- > < 2+ 4++ > < _! 7! > } #] +\test "" ##[ \figuremode { < [6 > < 5] > } #] + +%% Lyrics +\test "" ##[ \lyrics { a b } #] +\test "" ##[ \lyricmode { a -- b } #] % HyphenEvent +\test "" ##[ \lyricmode { a __ b } #] % ExtenderEvent +\test "" ##[ \lyricmode { "a " } #] % LyricEvent +\test "" ##[ \lyricsto "foo" { bla bla } #] % LyricCombineMusic +\test "" ##[ { { c d } + \addlyrics { bla bla } } #] + +%% Drums +\test "" ##[ \drums { hihat } #] +\test "" ##[ \drummode { hihat4.*3/4 } #] + +%% Expressive marks +\test "" ##[ c4 ~ #] % TieEvent +\test "" ##[ c\noBeam #] % BeamForbidEvent +\test "" ##[ c\1 #] % StringNumberEvent +\test "" ##[ { c: c:1 } #] % TremoloEvent +\test "" ##[ { c-^ c^^ c_^ } #] % ArticulationEvent +\test "" ##[ { c-+ c^+ c_+ } #] +\test "" ##[ { c-- c^- c_- } #] +\test "" ##[ { c-| c^| c_| } #] +\test "" ##[ { c-> c^> c_> } #] +\test "" ##[ { c-. c^. c_. } #] +\test "" ##[ { c-_ c^_ c__ } #] +\test "" ##[ { c-\trill c^\trill c_\trill } #] +\test "" ##[ { c-1 c^2 c_3 } #] % FingerEvent +\test "" ##[ { c-"foo" c^"foo" c_"foo" } #] % TextScriptEvent +\test "" ##[ { R1*4-"foo" R^"foo" R_"foo" } #] % MultiMeasureTextEvent +\test "" ##[ { c4-\harmonic c^\harmonic c_\harmonic } #] % HarmonicEvent +\test "" ##[ { c-\glissando c^\glissando c_\glissando } #] % GlissandoEvent +\test "" ##[ { c-\arpeggio c^\arpeggio c_\arpeggio } #] % ArpeggioEvent +\test "" ##[ { c\p c^\ff c_\sfz } #] % AbsoluteDynamicEvent +\test "" ##[ { c[ c] c^[ c^] c_[ c_] } #] % BeamEvent +\test "" ##[ { c( c) c^( c^) c_( c_) } #] % SlurEvent +\test "" ##[ { c\< c\! c^\< c^\! c_\< c_\! } #] % CrescendoEvent +\test "" ##[ { c\> c\! c^\> c^\! c_\> c_\! } #] % DecrescendoEvent +\test "" ##[ { c\( c\) c^\( c^\) c_\( c_\) } #] % PhrasingSlurEvent +\test "" ##[ { c\sustainDown c\sustainUp } #] % SustainEvent +\test "" ##[ { c\sostenutoDown c\sostenutoUp } #] % SostenutoEvent +\test "" ##[ \melisma #] +\test "" ##[ \melismaEnd #] +\test "" ##[ { c\startTextSpan c\stopTextSpan } #] % TextSpanEvent +\test "" ##[ { c\startTrillSpan c\stopTrillSpan } #] % TrillSpanEvent +\test "" ##[ { c \startStaff c \stopStaff } #] % StaffSpanEvent +\test "" ##[ { c\startGroup c\stopGroup c^\startGroup c^\stopGroup c_\startGroup c_\stopGroup } #] % NoteGroupingEvent +\test "" ##[ { c\unaCorda c\treCorde } #] % UnaCordaEvent +\test "" ##[ \breathe #] +\test "" ##[ { c \[ c \] } #] % LigatureEvent +\test "" ##[ \~ #] % PesOrFlexaEvent + +\test "" ##[ \break #] +\test "" ##[ \noBreak #] +\test "" ##[ \pageBreak #] +\test "" ##[ \noPageBreak #] +\test "" ##[ \pageTurn #] +\test "" ##[ \noPageTurn #] + +%% Checks +\test "" ##[ \octave a' #] % RelativeOctaveCheck +\test "" ##[ | #] % BarCheck + +%% Marks +\test "" ##[ \mark \default #] % MarkEvent +\test "" ##[ \mark "Allegro" #] +\test "" ##[ \tempo 4 = 120 #] % MetronomeChangeEvent + +%% key, time, clef, bar +\test "" ##[ \key \default #] % KeyChangeEvent +\test "" ##[ \key e \minor #] +\test "" ##[ \clef "bass" #] +\test "" ##[ \clef "french^2" #] +\test "" ##[ \clef "alto_3" #] +\test "" ##[ \time 2/4 #] +\test "" ##[ #(set-time-signature 5 8 '(3 2)) #] +\test "" ##[ \bar "|." #] + +%% staff switches +\test "" ##[ \autochange { c d } #] % AutoChangeMusic +\test "" ##[ { \change Staff = "up" { c d } } #] % ContextChange + +%% Tuplets +\test "" ##[ \times 2/3 { c8 d e } #] % TimeScaledMusic +\test "" ##[ \times 4/6 { c16 d e f g a } #] +%} +%% \relative and \tranpose +\test #"NOT A BUG" ##[ \relative c' { c b } #] % RelativeOctaveMusic +\test #"NOT A BUG" ##[ \transpose c d { c d } #] % TransposedMusic +%} +%% Repeats +\test "" ##[ \repeat volta 2 { c d } #] % VoltaRepeatedMusic +\test "" ##[ \repeat unfold 2 { c d } #] % UnfoldedRepeatedMusic +\test "" ##[ \repeat fold 2 { c d } #] % FoldedRepeatedMusic +\test "" ##[ \repeat percent 2 { c d } #] % PercentRepeatedMusic +\test "" ##[ \repeat tremolo 4 { c16 d } #] % TremoloRepeatedMusic +\test "" ##[ \repeat volta 2 { c4 d } \alternative { { c d } { e f } } #] % + +%% Context creation +\test "" ##[ \new Staff { c d } #] % ContextSpeccedMusic +\test "" ##[ \new Staff = "up" { c d } #] % ContextSpeccedMusic +\test "" ##[ \context Staff { c d } #] +\test "" ##[ \context Staff = "up" { c d } #] +\test "" ##[ +\new Staff \with { + \consists "Timing_engraver" + \remove "Clef_engraver" +} { c d } #] +%% Context properties +\test "" ##[ \once \set Score . skipBars = ##t #] % PropertySet +\test "" ##[ \set autoBeaming = ##f #] +\test "" ##[ \unset Score . skipBars #] % PropertyUnset +\test "" ##[ \unset autoBeaming #] +%% Layout properties +\test "" ##[ \override Staff . Stem #'thickness = #4.0 #] % OverrideProperty +\test "" ##[ \once \override Beam #'thickness = #0.6 #] +\test "" ##[ \revert Staff . Stem #'thickness #] % RevertProperty +\test "" ##[ \revert Beam #'thickness #] + +%% \applyOutput +\test "" ##[ \applyOutput #'Foo #(lambda (arg) (list)) #] +%% \applyContext +\test "" ##[ \applyContext #(lambda (arg) (list)) #] + +%% \partial +\test "" ##[ \partial 2 #] +\test "" ##[ \partial 8. #] +\test #"TODO? exotic durations in \\partial" ##[ \partial 4*2/3 #] + +%% \partcombine +\test "" ##[ \partcombine { c e } +{ d f } #] % PartCombineMusic UnrelativableMusic + +%% Cue notes +\test "" ##[ \cueDuring #"foo" #1 { c d } #] +\test "" ##[ \quoteDuring #"foo" { c d } #] + + +%% end test. + +#(read-hash-extend #\[ #f) %{ ] %} diff --git a/input/regression/dynamics-broken-hairpin.ly b/input/regression/dynamics-broken-hairpin.ly index fac525db24..439e6bd01b 100644 --- a/input/regression/dynamics-broken-hairpin.ly +++ b/input/regression/dynamics-broken-hairpin.ly @@ -4,11 +4,12 @@ texidoc = "Broken crescendi should be open on one side." } -\relative c'' { - c1 \< \break c1\! \> \break c1\! -} \layout { line-width = 4.\cm } +\relative c'' { + c1 \< \break c1\! \> \break c1\! +} + diff --git a/input/regression/figured-bass-alteration.ly b/input/regression/figured-bass-alteration.ly new file mode 100644 index 0000000000..bc910f76fd --- /dev/null +++ b/input/regression/figured-bass-alteration.ly @@ -0,0 +1,22 @@ + +\header { + texidoc = "Bass figures can carry alterations." +} + +\version "2.11.10" + +\layout { + ragged-right= ##t +} + +\relative c'' { + \new Voice + << + { c4 c c } + \figures + { + <3- > <3! > <3+ > + } + >> +} + diff --git a/input/regression/finger-chords-accidental.ly b/input/regression/finger-chords-accidental.ly new file mode 100644 index 0000000000..3ae06a4e62 --- /dev/null +++ b/input/regression/finger-chords-accidental.ly @@ -0,0 +1,15 @@ +\version "2.10.8" +\header +{ + texidoc = "Scripts left of a chord avoid accidentals." +} + +\paper { + ragged-right = ##t +} + +{ + r4 + \set fingeringOrientations = #'(left) + +} diff --git a/input/regression/general-scheme-bindings.ly b/input/regression/general-scheme-bindings.ly new file mode 100644 index 0000000000..ad625ff25a --- /dev/null +++ b/input/regression/general-scheme-bindings.ly @@ -0,0 +1,18 @@ +\header { + + texidoc = "This file tests various Scheme utiliity functions." + +} + + +\version "2.11.8" + +%% todo : use macro, to show the statement tested. +#(ly:progress "~a\n" (ly:expand-environment "${HOME} $HOME $$ ")) +#(ly:font-config-display-fonts) + +#(ly:progress "~A\n" (ly:duration->string (ly:make-duration 2 2 3 7))) +#(ly:parser-parse-string (ly:parser-clone parser) "foo = #1 #(ly:progress \"hello there\n\")") + +#(ly:progress "~a\n" (ly:truncate-list! (iota 5) 10)) +#(ly:progress "~a\n" (ly:truncate-list! (iota 10) 5)) diff --git a/input/regression/glissando-no-break.ly b/input/regression/glissando-no-break.ly new file mode 100644 index 0000000000..a30f4f56e4 --- /dev/null +++ b/input/regression/glissando-no-break.ly @@ -0,0 +1,17 @@ +\header { + + texidoc = "Glissandi are not broken. Here a @code{\break} is ineffective. +Use @code{breakable} grob property to override." + +} +\version "2.11.10" +\layout { + ragged-right = ##t +} +\relative c' { + c1 + c1\glissando + \break + d'1 + d1 +} diff --git a/input/regression/glissando.ly b/input/regression/glissando.ly index 407ad0b9cb..7629873bef 100644 --- a/input/regression/glissando.ly +++ b/input/regression/glissando.ly @@ -12,10 +12,17 @@ The engraver does no time-keeping, so it involves some trickery to get } +\layout{ + line-width = 50.\mm + indent = 0 +} + \new Staff \relative c''{ - % gliss non gliss and + \override Glissando #'breakable = ##t + + %% gliss non gliss and c4 \glissando d e \glissando f \glissando \break - % consecutive + %% consecutive c \glissando d, \glissando e' << { \stemUp e8 \glissando g8 } \context Voice = VB {\stemDown \repeat unfold 4 d16 } >> @@ -23,9 +30,4 @@ The engraver does no time-keeping, so it involves some trickery to get c4 \glissando c,, \glissando c' \glissando d } -\layout{ - line-width = 50.\mm - indent = 0 -} - diff --git a/input/regression/hairpin-to-barline-mark.ly b/input/regression/hairpin-to-barline-mark.ly new file mode 100644 index 0000000000..488ae8bc80 --- /dev/null +++ b/input/regression/hairpin-to-barline-mark.ly @@ -0,0 +1,13 @@ +\version "2.11.12" +\paper { ragged-right = ##t } +\header { + + texidoc = "hairpinToBarline is not confused by very long marks." + +} + +\new Staff \relative c' { + c1\< | + \mark "Very long mark" + c4\> c c c\! | +} diff --git a/input/regression/hairpin-to-rest.ly b/input/regression/hairpin-to-rest.ly new file mode 100644 index 0000000000..3ba757d520 --- /dev/null +++ b/input/regression/hairpin-to-rest.ly @@ -0,0 +1,11 @@ +\version "2.10.8" +\header { + texidoc = "Hairpins end at the left edge of a rest." +} + +\layout{ + ragged-right=##t +} +\relative c'' { + c2\p\> r4\! +} diff --git a/input/regression/hara-kiri-stanza-number.ly b/input/regression/hara-kiri-stanza-number.ly new file mode 100644 index 0000000000..a0a974237c --- /dev/null +++ b/input/regression/hara-kiri-stanza-number.ly @@ -0,0 +1,24 @@ + +\header { + + texidoc = "stanza numbers remain, even on otherwise empty lyrics +lines." + +} + +\paper { + indent = #0.0 + ragged-right = ##T +} + +\version "2.10.11" + +<< + \new Voice = melody \relative c'{ + r2 r4 r8 e8 |\break + e16 e8. + } + \lyricsto "melody" \lyrics { + \set stanza = "Verse 2." + _ bla bla } +>> diff --git a/input/regression/identifiers.ly b/input/regression/identifiers.ly new file mode 100644 index 0000000000..682a156204 --- /dev/null +++ b/input/regression/identifiers.ly @@ -0,0 +1,31 @@ + +\header { + texidoc = "test identifiers." + } +\version "2.10.8" + +num = #3 +mus = { c'4 } +paperId = \paper { line-width = 5.0 \cm } +layoutId = \layout { ragged-right = ##t } +perfId = \midi {} +markupId = \markup { hoi } +stringId = "title" + +% headers not allowed as Id's + +scoreId = \score { + \repeat unfold \num \mus + \layout { \layoutId } + \midi { \perfId } + } + +bookId = \book { + \score { \scoreId } + \paper { \paperId } + } + + +\book { \bookId } + + diff --git a/input/regression/instrument-name-dynamic.ly b/input/regression/instrument-name-dynamic.ly index abc315f7f3..a418315dee 100644 --- a/input/regression/instrument-name-dynamic.ly +++ b/input/regression/instrument-name-dynamic.ly @@ -6,15 +6,15 @@ pedal line spanners." } +\paper { + line-width = 3\cm + indent = 0\cm +} + \relative { \set Staff.shortInstrumentName = "foo" f1 | f1 | f1 | f1\< | f1 | f1\! | } -\paper { - line-width = 3\cm - indent = 0\cm -} - % EOF diff --git a/input/regression/key-clefs.ly b/input/regression/key-clefs.ly index 000f090827..8d68529ea1 100644 --- a/input/regression/key-clefs.ly +++ b/input/regression/key-clefs.ly @@ -11,13 +11,13 @@ \clef violin \key cis \major cis1 \key ces \major ces \clef soprano - \key cis \major cis \key ces \major ces + \key cis \major cis \key ces \major ces \break \clef mezzosoprano \key cis \major cis \key ces \major ces \clef alto - \key cis \major cis \key ces \major ces + \key cis \major cis \break \key ces \major ces \clef tenor - \key cis \major cis \key ces \major ces + \key cis \major cis \key ces \major ces \break \clef baritone \key cis \major cis \key ces \major ces \clef bass diff --git a/input/regression/lyric-combine-switch-voice-2.ly b/input/regression/lyric-combine-switch-voice-2.ly new file mode 100644 index 0000000000..27f6d4f2a7 --- /dev/null +++ b/input/regression/lyric-combine-switch-voice-2.ly @@ -0,0 +1,29 @@ +\header +{ +texidoc = "switching voices halfway a lyricsto is possible." + } +\version "2.10.12" + +<< + \relative \new Voice = "lahlah" { + c4 + << + \new Voice = "alternative" { + \voiceOne + \override NoteColumn #'force-hshift = #-3 + a'4 + } + { \voiceTwo + c,4 + \oneVoice + } >> + c4 c + + } + \new Lyrics \lyricsto "lahlah" { + \set associatedVoice = alternative + two + \set associatedVoice = lahlah + two this + } +>> diff --git a/input/regression/lyric-combine-switch-voice.ly b/input/regression/lyric-combine-switch-voice.ly new file mode 100644 index 0000000000..b0b6d1952e --- /dev/null +++ b/input/regression/lyric-combine-switch-voice.ly @@ -0,0 +1,44 @@ +\header { + + texidoc = "Switching melody to a different voice works even +the switch occurs together with context instantiation." + +} + +\version "2.10.8" + +<< + \relative \new Voice = "lahlah" { + \set Staff.autoBeaming = ##f + c4 + << + \new Voice = "alternative" { + \voiceOne + \times 2/3 { + %% show associations clearly. + \override NoteColumn #'force-hshift = #-3 + r8 f g + } + } + { + \voiceTwo + f8.[ g16] + \oneVoice + } >> + a8( b) c + } + \new Lyrics \lyricsto "lahlah" { + %% Tricky: need to set associatedVoice + %% one syllable too soon! + + \set associatedVoice = alternative % applies to "ran" + Ty -- + ran -- + \set associatedVoice = lahlah % applies to "sau" + no -- + sau -- rus Rex + } +>> + + + diff --git a/input/regression/lyric-extender-broken.ly b/input/regression/lyric-extender-broken.ly index c7db439467..36aae288b5 100644 --- a/input/regression/lyric-extender-broken.ly +++ b/input/regression/lyric-extender-broken.ly @@ -8,6 +8,9 @@ of the melisma." } +\layout { + ragged-right = ##t +} << \new Voice =A { @@ -17,7 +20,4 @@ of the melisma." } \lyricsto A \context Lyrics \lyricmode { a __ a __ ha } >> - \layout { - ragged-right = ##t - } diff --git a/input/regression/lyric-extender-no-heads.ly b/input/regression/lyric-extender-no-heads.ly new file mode 100644 index 0000000000..958805ab85 --- /dev/null +++ b/input/regression/lyric-extender-no-heads.ly @@ -0,0 +1,24 @@ +\header +{ + texidoc = "Extender engraver also notices the lack of note heads. +Here the extender ends on the 2nd quarter note, despite the grace note +without a lyric attached." + +} + +\version "2.10.7" + +\layout { + ragged-right = ##t +} + +\relative c'' { + \time 3/4 + d4~ d4 r4 + \grace es8 + + d4 + +} +\addlyrics { x __ x } + diff --git a/input/regression/lyric-hyphen-break.ly b/input/regression/lyric-hyphen-break.ly index c78cd759c4..c48f7c8737 100644 --- a/input/regression/lyric-hyphen-break.ly +++ b/input/regression/lyric-hyphen-break.ly @@ -8,6 +8,17 @@ they go past the first note. " } +\layout { + indent = 0.0 \cm + line-width = 3.4 \cm + + \context { + \Staff \remove "Time_signature_engraver" + } +} + + + << \new Staff \relative c'' { \time 1/4 c16[ c c c] @@ -23,15 +34,5 @@ they go past the first note. " bla16 -- bla -- bla } >> - \layout { - indent = 0.0 \cm - line-width = 3.4 \cm - - \context { - \Staff \remove "Time_signature_engraver" - } - } - - diff --git a/input/regression/lyrics-no-notes.ly b/input/regression/lyrics-no-notes.ly new file mode 100644 index 0000000000..bc870f59b3 --- /dev/null +++ b/input/regression/lyrics-no-notes.ly @@ -0,0 +1,28 @@ +\header { + texidoc ="lyric syllables without note attachment are +not centered; Centering may cause unintended effects when +the papercolumn is very wide." + } + +\layout{ + ragged-right = ##t +} + +\version "2.10.7" +<< + \new Staff \relative c' { + \key aes \major + \context Voice = "1" { + f8 f + \emptyText + + f^"xxxxxxxxxxxxxxxxxxxxxxxxxx" f + } + } + \new Lyrics \lyricmode { + \skip 8 + \skip 8 + x8 + x8 + } +>> diff --git a/input/regression/markup-note-dot.ly b/input/regression/markup-note-dot.ly new file mode 100644 index 0000000000..517f541653 --- /dev/null +++ b/input/regression/markup-note-dot.ly @@ -0,0 +1,20 @@ + +\header { + + texidoc = " A dotted whole note displayed via the @code{\\note} + command must separate the note head and the dot. The dot avoids the upflag." + + } +\paper { + packed = ##T +} + +\version "2.10.10" + + +\relative { + c^\markup { \note #"1." #1 } + c^\markup { \note #"2." #1 } + c^\markup { \note #"8." #1 } +} + diff --git a/input/regression/markup-scheme.ly b/input/regression/markup-scheme.ly index e82b4b0ba3..e4589d4a9b 100644 --- a/input/regression/markup-scheme.ly +++ b/input/regression/markup-scheme.ly @@ -25,7 +25,7 @@ For maintenance reasons, we don't excercise the entire markup command set. -\version "2.10.0" +\version "2.11.5" { \fatText @@ -39,7 +39,7 @@ For maintenance reasons, we don't excercise the entire markup command set. \override #'(font-encoding . fetaMusic) { \lookup #"noteheads-0" } - \musicglyph #"accidentals.-1" + \musicglyph #"accidentals.mirroredflat" \combine "X" "+" \combine "o" "/" \box \column { \line { "string 1" } \line { "string 2" } } @@ -51,7 +51,7 @@ For maintenance reasons, we don't excercise the entire markup command set. \dynamic sfzp \huge { "A" \smaller "A" \smaller \smaller "A" \smaller \smaller \smaller "A" } - \sub "alike" + \larger \sub "alike" } \break f'1-#(markup* @@ -62,7 +62,7 @@ For maintenance reasons, we don't excercise the entire markup command set. #:hspace 2.0 #:override '(font-encoding . fetaMusic) #:line (#:lookup "noteheads-0" ) - #:musicglyph "accidentals.-1" + #:musicglyph "accidentals.mirroredflat" #:combine "X" "+" #:combine "o" "/" #:box #:column ("string 1" "string 2") @@ -74,5 +74,5 @@ For maintenance reasons, we don't excercise the entire markup command set. #:dynamic "sfzp" #:huge #:line ("A" #:smaller "A" #:smaller #:smaller "A" #:smaller #:smaller #:smaller "A") - #:sub "alike") + #:larger #:sub "alike") } diff --git a/input/regression/measure-grouping.ly b/input/regression/measure-grouping.ly index 64a1e8153d..cfea330422 100644 --- a/input/regression/measure-grouping.ly +++ b/input/regression/measure-grouping.ly @@ -9,10 +9,16 @@ brackets above beats when the beats of a time signature are grouped. " \version "2.10.0" +\layout { + ragged-right = ##t +} %% TODO: should have 2/4 + 5/8 time sig style. -\context Staff +\context Staff \with { + \consists "Measure_grouping_engraver" + } + \relative c' { #(set-time-signature 2 4) c8 a'4 a8~ @@ -23,12 +29,5 @@ brackets above beats when the beats of a time signature are grouped. " #(set-time-signature 5 8 '(3 2)) g8 a4 g a4.-> } -\layout { - ragged-right = ##t - \context { - \Staff - \consists "Measure_grouping_engraver" - } -} diff --git a/input/regression/midi-drums.ly b/input/regression/midi-drums.ly new file mode 100644 index 0000000000..2b799be25b --- /dev/null +++ b/input/regression/midi-drums.ly @@ -0,0 +1,18 @@ + +\version "2.10.0" + +\version "2.10.1" + +\score { + \new DrumStaff << + \drummode { + bd4 sn4 bd4 sn4 + << + {\voiceOne \repeat unfold 16 hh16 } + \new DrumVoice { \voiceTwo bd4 sn4 bd4 sn4 } + >> \oneVoice + } + >> + \layout {} + \midi {} +} diff --git a/input/regression/midi-dynamics.ly b/input/regression/midi-dynamics.ly new file mode 100644 index 0000000000..edff9c2f7a --- /dev/null +++ b/input/regression/midi-dynamics.ly @@ -0,0 +1,24 @@ +\header { + + texidoc = "Midi also handles crescendo and decrescendo, either + starting and ending from specified or unspecified sound level." + +} + +\version "2.11.10" + +\score { + \relative { + + \set midiMinimumVolume = #0.0 + \set midiMaximumVolume = #1.0 + c\ff c\pppp + c\ff\> c c c c\!\pppp + + c\< c c c c\! \ff + + c\> c c c \! + } + \midi {} + \layout{} +} diff --git a/input/regression/midi-grace.ly b/input/regression/midi-grace.ly new file mode 100644 index 0000000000..5a58f3cbe8 --- /dev/null +++ b/input/regression/midi-grace.ly @@ -0,0 +1,16 @@ + +\header { + + texidoc = "Grace notes don't intrroduce syncing problems: the last note +off will appear at tick 768 (2 * 384)." + +} +\version "2.10.10" +\score { + \relative c' { + c4 + \grace { b8 } + d4 + } + \midi { } +} diff --git a/input/regression/midi-lyric-barcheck.ly b/input/regression/midi-lyric-barcheck.ly new file mode 100644 index 0000000000..5c06916af0 --- /dev/null +++ b/input/regression/midi-lyric-barcheck.ly @@ -0,0 +1,24 @@ +\version "2.10.0" +\header { + + texidoc = "Lyrics in MIDI are aligned to ties and beams: +this examples causes no bar checks in MIDI. +" + + + } +\score { + + <<\relative c'' \new Voice = A { + \autoBeamOff + c8[ c] c2. + c1~c4 c2. + c4 ( d e) d + c1 + + } + \lyricsto "A" \lyrics { bla bla | bla bla | bla bla | bla } + >> + \layout {} + \midi {} + } diff --git a/input/regression/midi-microtone.ly b/input/regression/midi-microtone.ly new file mode 100644 index 0000000000..cf1f9f1e32 --- /dev/null +++ b/input/regression/midi-microtone.ly @@ -0,0 +1,10 @@ +\version "2.10.8" +\header { + texidoc = "The pitch wheel is used for microtones." + } + +\score { + { c4 cih cis cisih d } + \midi { } + } + diff --git a/input/regression/midi-pedal.ly b/input/regression/midi-pedal.ly new file mode 100644 index 0000000000..0c4ecabcab --- /dev/null +++ b/input/regression/midi-pedal.ly @@ -0,0 +1,22 @@ +\header { + + texidoc = "Pedals. Run @code{timidity -idvvv file.midi |grep Midi} + to see midi events." + +} + +\version "2.11.10" + +\score { + \relative { + { + { c16 e g c } + + { c,16\sustainDown e g c\sustainUp } + { c,16\unaCorda e g c\treCorde } + { c,16\sostenutoDown e g c\sostenutoUp } + } + } + \midi {} + \layout{} +} diff --git a/input/regression/midi-scales.ly b/input/regression/midi-scales.ly new file mode 100644 index 0000000000..d6e8ed91c5 --- /dev/null +++ b/input/regression/midi-scales.ly @@ -0,0 +1,159 @@ + +\version "2.10.0" +% candidate for regression. -gp +\header { + texidoc="Converting LilyPond input to MIDI and then again back with + @code{midi2ly.py} is a reversible procedure in some simple cases, + which mean that the original @code{.ly} -file and the one converted + back from the generated @code{.midi} -file do not differ. + Here are produced some scales. + + " +} + +%{ + This means, doing: + + lilypond input/test/midi-scales.ly + midi2ly midi-scales.midi + diff -u input/test/midi-scales.ly midi-scales-midi.ly + + should show no differences at all in \key commands or notes. + + Therefore, do not reformat this file unless midi2ly changes. + + 1.7.30 reformatted, because + midi2ly now outpts 1 bar per line and adds bar checks and numbers. + +%} + +scales = \relative c { + + % [INSTRUMENT_NAME] bright acoustic + \key c \major % sharp-major + c'4 d e f | + g a b c | + + \key g \major + g a b c | + d e fis g | + + \key d \major + d, e fis g | + a b cis d | + + \key a \major + a b cis d | + e fis gis a | + + \key e \major + e, fis gis a | + b cis dis e | + + \key b \major + b cis dis e | + fis gis ais b | + + \key fis \major + fis, gis ais b | + cis dis eis fis | + + \key cis \major + cis, dis eis fis | + gis ais bis cis | + + \key a \minor % sharp-minor + a b c d | + e f gis a | + + \key e \minor + e, fis g a | + b c dis e | + + \key b \minor + b cis d e | + fis g ais b | + + \key fis \minor + fis, gis a b | + cis d eis fis | + + \key cis \minor + cis, dis e fis | + gis a bis cis | + + \key gis \minor + gis ais b cis | + dis e fisis gis | + + \key dis \minor + dis, eis fis gis | + ais b cisis dis | + + \key ais \minor + ais bis cis dis | + eis fis gisis ais | + + \key f \major % flat-major + f, g a bes | + c d e f | + + \key bes \major + bes c d ees | + f g a bes | + + \key ees \major + ees,, f g aes | + bes c d ees | + + \key aes \major + aes, bes c des | + ees f g aes | + + \key des \major + des,, ees f ges | + aes bes c des | + + \key ges \major + ges, aes bes ces | + des ees f ges | + + \key ces \major + ces,, des ees fes | + ges aes bes ces | + + \key d \minor % flat-minor + d, e f g | + a bes cis d | + + \key g \minor + g, a bes c | + d ees fis g | + + \key c \minor + c,, d ees f | + g aes b c | + + \key f \minor + f, g aes bes | + c des e f | + + \key bes \minor + bes,, c des ees | + f ges a bes | + + \key ees \minor + ees, f ges aes | + bes ces d ees | + + \key aes \minor + aes, bes ces des | + ees fes g aes | +} + +\score { + \context Voice \scales + \layout { } + \midi { } +} + diff --git a/input/regression/midi-transposition.ly b/input/regression/midi-transposition.ly new file mode 100644 index 0000000000..2429fef5d3 --- /dev/null +++ b/input/regression/midi-transposition.ly @@ -0,0 +1,14 @@ +\header +{ + texidoc = "should deliver f' in MIDI" +} +\version "2.10.5" + +\score { + { + \transposition f + c'' + } + \midi{} + \layout{} +} diff --git a/input/regression/midi-tuplets.ly b/input/regression/midi-tuplets.ly new file mode 100644 index 0000000000..0a0f5ef1a9 --- /dev/null +++ b/input/regression/midi-tuplets.ly @@ -0,0 +1,35 @@ +\version "2.10.0" +\header { +texidoc = " + +Midi2ly tuplet test. + +@example + python scripts/midi2ly.py --duration-quant=32 \ + --allow-tuplet=4*2/3 \ + --allow-tuplet=8*2/3 \ + --allow-tuplet=4*3/5 \ + --allow-tuplet=8*3/5 \ + tu.midi +@end example +" +} + + +\score { + \context Voice \relative c' { + + a1 a2 a2. a4 a4. a8 a8. a16 a16. a32 a32. a64 + + \times 2/3 { b4 b4 b4 } + \times 3/5 { b4 b4 b4 b4 b4 } + + \times 2/3 { c8 c8 c8 } + \times 3/5 { c8 c8 c8 c8 c8 } + + } + \layout { } + \midi { } +} + + diff --git a/input/regression/midi-volume-equaliser.ly b/input/regression/midi-volume-equaliser.ly new file mode 100644 index 0000000000..6df7de7c6d --- /dev/null +++ b/input/regression/midi-volume-equaliser.ly @@ -0,0 +1,134 @@ +\version "2.10.0" +\header { + texidoc = "@cindex Midi Volume Equaliser +The full orchestra plays a notes, where groups stop one after +another. Use this to tune equalizer settings. " +} + +#(set-global-staff-size 16) + +%{ + +Override, see scm/midi.scm: + +#(set! instrument-equalizer-alist + (append + '( + ("flute" . (0 . 0.7)) + ) + instrument-equalizer-alist)) + +%} + +flauti = \relative c' { + \set Staff.midiInstrument = #"flute" + + c1\f R1*10 +} + +oboi = \relative c' { + \set Staff.midiInstrument = #"oboe" + + R1*1 c1\f R1*9 +} + +clarinetti = \relative c' { + \set Staff.midiInstrument = #"clarinet" + + R1*2 c1\f R1*8 +} + +fagotti = \relative c' { + \set Staff.midiInstrument = #"bassoon" + + \clef bass + R1*3 c1\f R1*7 +} + +corni = \relative c' { + \set Staff.midiInstrument = #"french horn" + + R1*4 c1\f R1*6 +} + +trombe = \relative c' { + \set Staff.midiInstrument = #"trumpet" + + \clef bass + R1*5 c1\f R1*5 +} + +timpani = \relative c' { + \set Staff.midiInstrument = #"timpani" + + R1*6 c1\f R1*4 +} + +violinoI = \relative c' { + \set Staff.midiInstrument = #"violin" + + R1*7 c1\f R1*3 +} + +violinoII = \relative c' { + \set Staff.midiInstrument = #"violin" + + R1*8 c1\f R1*2 +} + +viola = \relative c' { + \set Staff.midiInstrument = #"viola" + + \clef alto + R1*9 c1\f R1*1 +} + +violoncello = \relative c' { + \set Staff.midiInstrument = #"cello" + %\set Staff.midiInstrument = #"contrabass" + + \clef bass + R1*10 c1\f +} + + + +\score { + << + \new StaffGroup = "legni" << + \new Staff = "flauti" \flauti + \new Staff = "oboi" \oboi + \new Staff = "clarinetti" \clarinetti + \new Staff = "fagotti" \fagotti + >> + \new StaffGroup = "ottoni" << + \new Staff = "corni" \corni + \new Staff = "trombe" \trombe + >> + \new StaffGroup = "timpani" << + \new Staff = "timpani" \timpani + { + \skip 1 + %% Hmm: this forces a staff-bracket, that's good! + %% However, I can't find where is decided on staff-bracket yes/no + } + >> + \new StaffGroup = "archi" << + \new GrandStaff = "violini" << + \new Staff = "violino1" \violinoI + \new Staff = "violino2" \violinoII + >> + \new Staff = "viola" \viola + \new Staff = "violoncello" \violoncello + >> + >> + + \midi { + \context { + \Score + tempoWholesPerMinute = #(ly:make-moment 60 1) + } + } +} + + diff --git a/input/regression/multi-measure-rest-usebreve.ly b/input/regression/multi-measure-rest-usebreve.ly new file mode 100644 index 0000000000..444becef4d --- /dev/null +++ b/input/regression/multi-measure-rest-usebreve.ly @@ -0,0 +1,24 @@ +\version "2.10.0" +\header{ + + texidoc="For longer measure lengths, the breve rest is used." + +} + +\layout { + \context { + \Score + skipBars = ##t + } + ragged-right = ##t +} + + +{ + \time 8/4 + R1*12 + \time 4/4 + R1*6 +} + + diff --git a/input/regression/multi-measure-rest.ly b/input/regression/multi-measure-rest.ly index 5fb5344018..8ea6f3155c 100644 --- a/input/regression/multi-measure-rest.ly +++ b/input/regression/multi-measure-rest.ly @@ -27,8 +27,7 @@ are used then a different symbol is used. \time 3/4 \key cis \major R2.*15 - R2. - R2.*3 + R2.*7 R2.*9 R2.*11 diff --git a/input/regression/non-empty-text.ly b/input/regression/non-empty-text.ly index efd1fa5d89..82256aac18 100644 --- a/input/regression/non-empty-text.ly +++ b/input/regression/non-empty-text.ly @@ -6,6 +6,9 @@ The boolean property @code{no-spacing-rods} in @code{TextScript} is used to control the horizontal size of text. " } +\layout { + line-width = 3.0\cm +} \relative c''{ %% \emptyText @@ -15,8 +18,5 @@ to control the horizontal size of text. " } \fatText c_"very wide and long text" c } -\layout { - line-width = 3.0\cm -} diff --git a/input/regression/note-line.ly b/input/regression/note-line.ly index f6e1a55507..392dbf0c8b 100644 --- a/input/regression/note-line.ly +++ b/input/regression/note-line.ly @@ -9,9 +9,15 @@ su = { \change Staff = up} sd = { \change Staff = down} +\layout { + line-width = 8.0 \cm +} + + \context PianoStaff << \new Staff = "up" { + \override Glissando #'breakable = ##t \set PianoStaff.connectArpeggios = ##t \showStaffSwitch \clef F @@ -21,9 +27,4 @@ sd = { \change Staff = down} \clef F s1*4 } >> - \layout { - line-width = 8.0 \cm - } - - diff --git a/input/regression/option-help.ly b/input/regression/option-help.ly new file mode 100644 index 0000000000..75c67e6e7d --- /dev/null +++ b/input/regression/option-help.ly @@ -0,0 +1,4 @@ +\version "2.11.10" + +#(ly:option-usage) + diff --git a/input/regression/page-layout-twopass.ly b/input/regression/page-layout-twopass.ly index cf0337ef29..a046efce87 100644 --- a/input/regression/page-layout-twopass.ly +++ b/input/regression/page-layout-twopass.ly @@ -15,6 +15,7 @@ bla = \new Staff { \repeat unfold 5 \relative { c1 c1 c1 } } + \book { \score { \bla @@ -28,19 +29,4 @@ tweakFileName = #(format "~a-page-layout.ly" (ly:parser-output-name parser)) #(newline) -%% unfortunately: the following doesn't show up in lp-book output - -%% if the following is there, the tweak file will be overwritten. - -%{ - -#(ly:progress "Including file: '~a'" tweakFileName) - -\markup { - \column { - \line { contents of \typewriter tweakFileName: } - \smaller \verbatim-file #tweakFileName - } -} - -%} +#(ly:progress "Contents of: '~a'" (ly:gulp-file tweakFileName)) diff --git a/input/regression/page-turn-page-breaking-badturns.ly b/input/regression/page-turn-page-breaking-badturns.ly index 0292751d52..df8386d1cc 100644 --- a/input/regression/page-turn-page-breaking-badturns.ly +++ b/input/regression/page-turn-page-breaking-badturns.ly @@ -7,16 +7,20 @@ should appear on 3 pages. " } -\paper { - #(define page-breaking ly:page-turn-breaking) - paper-height = #70 - print-page-number = ##t -} +\book { + \paper { + #(define page-breaking ly:page-turn-breaking) + paper-height = #65 + print-page-number = ##t + } -\relative c' { - a b c d a b c d \break - c d e f c d e f \break - d e f g d e f g + \score { + \relative c' { + a b c d a b c d \break + c d e f c d e f \break + d e f g d e f g + } + } } diff --git a/input/regression/page-turn-page-breaking-repeats.ly b/input/regression/page-turn-page-breaking-repeats.ly new file mode 100644 index 0000000000..f43184dec3 --- /dev/null +++ b/input/regression/page-turn-page-breaking-repeats.ly @@ -0,0 +1,43 @@ +\version "2.10.0" + +\header { + texidoc = "The page-turn engraver will not count potential page +turns if they occur in the middle of a repeat unless there is a +long gap at the beginning or at the end of the repeat. +" +} + +\layout { + \context { + \Staff + \consists "Page_turn_engraver" + } +} + +\book { + \paper { + #(define page-breaking ly:page-turn-breaking) + paper-height = #80 + print-page-number = ##t + print-first-page-number = ##t + } + + \score { + \relative { + \set Score.skipBars = ##t + % this should be kept on one page + \repeat volta 2 { + \repeat unfold 7 {a4 b c d16 d d d} R1*10 + \repeat unfold 8 {a4 b c d16 d d d} \pageTurn + } + % use up a page + a4 b c d a b c d \pageBreak + + % this should be allowed to have a page turn + \repeat volta 2 { + \repeat unfold 7 {a4 b c d16 d d d} R1*10 + \repeat unfold 7 {a4 b c d16 d d d} R1*3 + } + } + } +} \ No newline at end of file diff --git a/input/regression/page-turn-page-breaking.ly b/input/regression/page-turn-page-breaking.ly index 8c296b71b6..686622b7d5 100644 --- a/input/regression/page-turn-page-breaking.ly +++ b/input/regression/page-turn-page-breaking.ly @@ -7,14 +7,6 @@ in which case the turn will go after the special barline. " } -\paper { - #(define page-breaking ly:page-turn-breaking) - paper-height = #70 - auto-first-page-number = ##t - print-page-number = ##t - print-first-page-number = ##t -} - \layout { \context { \Staff @@ -22,11 +14,24 @@ in which case the turn will go after the special barline. } } -\relative c' { - a b c d a b c d \break - c d e f c d e f R1*4 - \repeat unfold 15 {d4 e f g} \break - c d e f c d e f R1*2 \bar "||" R1*2 - \repeat unfold 15 {d4 e f g} +\book { + + \paper { + #(define page-breaking ly:page-turn-breaking) + paper-height = #65 + auto-first-page-number = ##t + print-page-number = ##t + print-first-page-number = ##t + } + + \score { + \relative c' { + a b c d a b c d \break + c d e f c d e f R1*4 + \repeat unfold 15 {d4 e f g} \break + c d e f c d e f R1*2 \bar "||" R1*2 + \repeat unfold 15 {d4 e f g} + } + } } diff --git a/input/regression/part-combine-text.ly b/input/regression/part-combine-text.ly index 0922a8d27a..bcbd3aa8eb 100644 --- a/input/regression/part-combine-text.ly +++ b/input/regression/part-combine-text.ly @@ -15,7 +15,8 @@ texts accordingly. vone = \relative a' { R1 a2 r4 r a a a a } vtwo = \relative a' { R1 f4 f4 f4 f f f a a } -comm = { s1 s2 s4_"expect: solo 2" s4 s2 s4_"expect: a2" s4 } +comm = { s1 s2 s4_\markup { \small "expect: solo 2" } + s4 s2 s4_\markup { \small "expect: a2" } s4 } \new Staff << \partcombine \vone \vtwo \comm diff --git a/input/regression/part-combine-tuplet-end.ly b/input/regression/part-combine-tuplet-end.ly new file mode 100644 index 0000000000..b6bf5978d1 --- /dev/null +++ b/input/regression/part-combine-tuplet-end.ly @@ -0,0 +1,19 @@ +\header { + + texidoc = "End tuplets events are sent to the starting context, so +even after a switch, a tuplet ends correctly." + +} + +\version "2.10.8" + +\new Staff << + \partcombine + \relative c'' { + r2 + \times 2/3 { g8[ g g] } + \times 2/3 { g[ g g] } g1 + } + \relative c'' { R1 g1 } +>> + diff --git a/input/regression/part-combine-tuplet-single.ly b/input/regression/part-combine-tuplet-single.ly new file mode 100644 index 0000000000..879e163d69 --- /dev/null +++ b/input/regression/part-combine-tuplet-single.ly @@ -0,0 +1,22 @@ + +\header { + texidoc = "Tuplets in combined parts only print one bracket." + } + +\paper { ragged-right = ##T } + +\version "2.10.10" + +\score { + << + \new Staff { + \partcombine + \relative c'' { + \times 2/3 { d4 d d ~ } d2 + } + \relative c'' { + \times 2/3 { b4 a g ~ } g2 + } + } + >> +} diff --git a/input/regression/profile-property-access.ly b/input/regression/profile-property-access.ly new file mode 100644 index 0000000000..39a41510d4 --- /dev/null +++ b/input/regression/profile-property-access.ly @@ -0,0 +1,47 @@ +% -*- Scheme -*- + +\header { + texidoc = "This file profiles property accesses; the log file shows the top properties examined." +} + + +#(ly:set-option 'profile-property-accesses #t) + +\version "2.10.8" + +\include "../../input/typography-demo.ly" +%\book { \score { {c4 } } } + +#(define (prop-stats>? x y) + (cond + ((> (cdr x) (cdr y)) #t) + ((= (cdr x) (cdr y)) + (symbolexact (round (/ x rnd)))))) + (alist (map (lambda (entry) (cons (car entry) (round-to (cdr entry)))) (hash-table->alist (ly:property-lookup-stats what)))) + (total (apply + (map cdr alist))) + ) + + (set! alist (acons 'TOTAL total alist)) + + (ly:progress "\n\n~A properties, top ~a rounded to ~a\n\n~a" + what count rnd + (string-join + (map (lambda (x) (format "~30a: ~6@a" (car x) (cdr x))) + (ly:truncate-list! + (sort alist prop-stats>?) count)) + "\n")))) + + + +#(display-stats 'prob) +#(display-stats 'context) +#(display-stats 'grob) + + diff --git a/input/regression/quote-cue-during.ly b/input/regression/quote-cue-during.ly index 42045c5f73..347838151f 100644 --- a/input/regression/quote-cue-during.ly +++ b/input/regression/quote-cue-during.ly @@ -11,14 +11,14 @@ last note." } -\version "2.10.0" +\version "2.11.10" \layout { ragged-right = ##t } quoteMe = \relative c' { fis4 r16 a8.-> b4(-\ff~ b16 c8. b) } -\addquote quoteMe \quoteMe +\addQuote quoteMe \quoteMe original = \relative c'' { c8 d diff --git a/input/regression/quote-cyclic.ly b/input/regression/quote-cyclic.ly index 26332e3ebe..9cc47d370a 100644 --- a/input/regression/quote-cyclic.ly +++ b/input/regression/quote-cyclic.ly @@ -6,13 +6,13 @@ example, there are notes with each full-bar rest." } -\version "2.10.0" +\version "2.11.10" A = \relative c' { c4 d e f | \cueDuring #"qB" #1 { R1 } | } B = \relative c' { \cueDuring #"qA" #1 { R1 } | f4 e d c | } -\addquote "qA" \A -\addquote "qB" \B +\addQuote "qA" \A +\addQuote "qB" \B \layout { ragged-right = ##t } diff --git a/input/regression/quote-during.ly b/input/regression/quote-during.ly index 4b2549ba00..d17d80d4c5 100644 --- a/input/regression/quote-during.ly +++ b/input/regression/quote-during.ly @@ -8,7 +8,7 @@ quoted. In this example, a 16th rests is not quoted, since @code{rest-event} is not in @code{quotedEventTypes}." } -\version "2.10.0" +\version "2.11.10" \layout { ragged-right = ##t } @@ -16,7 +16,7 @@ quoted. In this example, a 16th rests is not quoted, since quoteMe = \relative c' { fis4 r16 a8.-> b4-\ff c } -\addquote quoteMe \quoteMe +\addQuote quoteMe \quoteMe original = \relative c'' { c8 d s2 es8 gis8 } << diff --git a/input/regression/quote-grace.ly b/input/regression/quote-grace.ly index 718134d611..e612aeac3c 100644 --- a/input/regression/quote-grace.ly +++ b/input/regression/quote-grace.ly @@ -7,13 +7,13 @@ } \paper { ragged-right= ##t } -\version "2.10.0" +\version "2.11.10" quoted = \relative c'' { R1 \grace g16 f4 \grace a16 bes4 \grace b16 c4 c4 } -\addquote quoted \quoted +\addQuote quoted \quoted << diff --git a/input/regression/quote-tie.ly b/input/regression/quote-tie.ly index e9584de114..50cb66e275 100644 --- a/input/regression/quote-tie.ly +++ b/input/regression/quote-tie.ly @@ -1,4 +1,4 @@ -\version "2.10.0" +\version "2.11.10" \header { @@ -15,12 +15,12 @@ to the 2nd note. " cueI = \relative c'' { a1 ~ | a | a | } -\addquote "cueI" { \cueI } +\addQuote "cueI" { \cueI } cueII = \relative c' { R1 | e | a | } -\addquote "cueII" { \cueII } +\addQuote "cueII" { \cueII } \new Staff { \cueDuring "cueI" #UP { R1 } | diff --git a/input/regression/quote-transposition.ly b/input/regression/quote-transposition.ly index ef700dd871..ceecc579d4 100644 --- a/input/regression/quote-transposition.ly +++ b/input/regression/quote-transposition.ly @@ -10,12 +10,12 @@ quoted ones) will transposed as well. " } -\version "2.10.0" +\version "2.11.10" \layout { ragged-right = ##t } -\addquote clarinet { +\addQuote clarinet { \transposition bes d'16 d'16 d'8 d'16 d'16 d'8 @@ -23,7 +23,7 @@ quoted ones) will transposed as well. " d'16 d'16 d'8 } -\addquote sax { +\addQuote sax { \transposition es' a8 a a a a a a a } diff --git a/input/regression/quote-tuplet-end.ly b/input/regression/quote-tuplet-end.ly new file mode 100644 index 0000000000..cbf4752d1f --- /dev/null +++ b/input/regression/quote-tuplet-end.ly @@ -0,0 +1,22 @@ +\header +{ + texidoc ="Tuplet bracket ends properly when quoting." +} + +\version "2.11.10" + +\paper { ragged-right = ##t } + +\addQuote x { + \times 2/3 { a'8 a' a' } a'4 a'2 | +} + +\new Staff << + \set Staff.quotedEventTypes = #'(note-event tuplet-span-event) + \new Voice = "cue" { s1 } + \new Voice { + \cueDuring #"x" #1 { r4 } + c'4 + \cueDuring #"x" #1 { r2 } + } +>> diff --git a/input/regression/quote-tuplet.ly b/input/regression/quote-tuplet.ly index 0579d4fde6..a96249540f 100644 --- a/input/regression/quote-tuplet.ly +++ b/input/regression/quote-tuplet.ly @@ -1,5 +1,5 @@ -\version "2.10.0" +\version "2.11.10" \header { @@ -12,7 +12,7 @@ foo = \relative { \times 2/3 { c4 c c } \times 2/3 { c4 c c } } -\addquote "foo" { \foo } +\addQuote "foo" { \foo } \paper { ragged-right = ##t diff --git a/input/regression/quote.ly b/input/regression/quote.ly index 4d61ee608b..1f29585f3c 100644 --- a/input/regression/quote.ly +++ b/input/regression/quote.ly @@ -7,7 +7,7 @@ things are quoted. In this example, a 16th rests is not quoted, since @code{rest-event} is not in @code{quotedEventTypes}." } -\version "2.10.0" +\version "2.11.10" \layout { ragged-right = ##t } @@ -15,7 +15,7 @@ things are quoted. In this example, a 16th rests is not quoted, since quoteMe = \relative c' { fis4 r16 a8.-> b4-\ff c } -\addquote quoteMe \quoteMe +\addQuote quoteMe \quoteMe original = \relative c'' { c8 d s2 es8 gis8 } << diff --git a/input/regression/relative-repeat.ly b/input/regression/relative-repeat.ly new file mode 100644 index 0000000000..5f0c613b41 --- /dev/null +++ b/input/regression/relative-repeat.ly @@ -0,0 +1,10 @@ +\header { + texidoc = "Relative mode for repeats uses order of entry." + } +\version "2.10.8" + +\relative { + \repeat "unfold" 3 + { f2 bes2 } + \alternative { a1 e b } +} diff --git a/input/regression/rest-collision-beam-note.ly b/input/regression/rest-collision-beam-note.ly new file mode 100644 index 0000000000..d8bdcb13e6 --- /dev/null +++ b/input/regression/rest-collision-beam-note.ly @@ -0,0 +1,17 @@ + +\header { + + texidoc = "Beam/rest collision resolution and normal rest/note +collisions can be combined." + +} + +\version "2.10.7" + +\layout { ragged-right=##t } + +\new Staff \relative +<< + { s8 f4 } \\ + { 8[ r ] } +>> diff --git a/input/regression/rest-collision-beam-quantized.ly b/input/regression/rest-collision-beam-quantized.ly new file mode 100644 index 0000000000..95f1e851fe --- /dev/null +++ b/input/regression/rest-collision-beam-quantized.ly @@ -0,0 +1,19 @@ +\header { + texidoc = "Rests under beams moved by whole staff spaces." +} + +\layout { + ragged-right = ##t +} + +\version "2.10.0" + +fig = \relative c' { + 8[ + r r r ] + r | +} + +\relative c' \new Staff { + \transpose c c, \fig +} diff --git a/input/regression/rest-collision-beam-restdir.ly b/input/regression/rest-collision-beam-restdir.ly new file mode 100644 index 0000000000..cd595d865d --- /dev/null +++ b/input/regression/rest-collision-beam-restdir.ly @@ -0,0 +1,18 @@ +\header { + texidoc = "Beam/rest collision takes offset due to @code{Rest #'direction} into +account properly." +} + +\version "2.10.7" +\paper { + ragged-right = ##t +} + + +\relative c''' { + \override Rest #'direction = #UP + \stemDown b8[ r b] + \override Rest #'direction = #DOWN + \stemDown b8[ r b] +} + diff --git a/input/regression/rest-collision-beam.ly b/input/regression/rest-collision-beam.ly index 7e0e2f5fff..6a38e581bd 100644 --- a/input/regression/rest-collision-beam.ly +++ b/input/regression/rest-collision-beam.ly @@ -1,40 +1,16 @@ \header { - texidoc = "Rests under beams are only moved if necessary." -} - -\layout { - ragged-right = ##t -} -\version "2.10.0" + texidoc = "Rests under beams are shifted upon +collision." -fig = \relative c' { - 8[ r r r ] - r | } - +\version "2.10.7" +\paper { + ragged-right = ##t +} - - \relative c' \new Staff { - \fig - \transpose c c, \fig - \new Voice { \stemUp \transpose c f \fig } - << - \\ - \transpose f c \fig - >> - - << - { \transpose c c' \fig } - \\ - {} - >> - - << \transpose c c' \fig \\ - \transpose f c \fig - >> - } - - - +\relative c''' { + \stemDown b8[ r b] + \stemUp b,,8[ r b] +} diff --git a/input/regression/safe.ly b/input/regression/safe.ly new file mode 100644 index 0000000000..760d60faaf --- /dev/null +++ b/input/regression/safe.ly @@ -0,0 +1,21 @@ +\version "2.10.0" + +"expect-error" = ##t + +% Ugh - this affects other files too. +#(ly:set-option 'protected-scheme-parsing #t) +#(ly:set-option 'safe #t) + +"force-finish" = ##t + +\header{ + texidoc = "This should not survive lilypond --safe-mode" + + #(open-file "w") +} + + +#(open-file "/tmp/safe-guile.scm") + +\include "this-should-fail.ly" + diff --git a/input/regression/semi-tie-manual-direction.ly b/input/regression/semi-tie-manual-direction.ly new file mode 100644 index 0000000000..bfa44106df --- /dev/null +++ b/input/regression/semi-tie-manual-direction.ly @@ -0,0 +1,16 @@ + +\header { + texidoc = "Semi tie directions may be forced from the input." +} + +\version "2.10.0" + +\layout{ + ragged-right=##t +} + +{ + r4 + c'^\laissezVibrer^\repeatTie + r4 +} diff --git a/input/regression/skiptypesetting-bar-check.ly b/input/regression/skiptypesetting-bar-check.ly new file mode 100644 index 0000000000..e4181833e4 --- /dev/null +++ b/input/regression/skiptypesetting-bar-check.ly @@ -0,0 +1,17 @@ +\version "2.10.0" + +\header { + +texidoc = "skipTypesetting doesn't affect bar checks." + +} + +\relative { + c4 + \set Score.skipTypesetting = ##t + c4 c4 + | + c4 c4 + \set Score.skipTypesetting = ##f + d +} diff --git a/input/regression/skiptypesetting-show-last.ly b/input/regression/skiptypesetting-show-last.ly new file mode 100644 index 0000000000..b0ebfda432 --- /dev/null +++ b/input/regression/skiptypesetting-show-last.ly @@ -0,0 +1,18 @@ +\header { + + texidoc = "@code{showLastLength} will only show the last bit of a score" + + } + +\version "2.10.12" + +showLastLength = R1*3 +\paper { + ragged-right = ##T +} + +{ + c1 c1 + c1 c1 + c1 c1 +} diff --git a/input/regression/skyline-debug.ly b/input/regression/skyline-debug.ly new file mode 100644 index 0000000000..0180d0473e --- /dev/null +++ b/input/regression/skyline-debug.ly @@ -0,0 +1,20 @@ +\header { + texidoc = "@code{-ddebug-skyline} draws the outline of the skyline used." + } +\version "2.11.10" + +#(set-default-paper-size "a6" ) + +\header { + tagline = ##f +} + +#(ly:set-option 'debug-skylines #t) +\book { + \score { + { + a,,1 | a'4 b' c'' d'' \break + \repeat unfold 2 {a' b' c'' d''} | b''''1 + } + } +} diff --git a/input/regression/slur-clef.ly b/input/regression/slur-clef.ly index c230f6e55a..1103dfbde6 100644 --- a/input/regression/slur-clef.ly +++ b/input/regression/slur-clef.ly @@ -8,4 +8,4 @@ } \version "2.10.0" -\new Staff { \clef bass c4^( \clef "G" g'4) c''1_( f'') } +\new Staff { \clef bass c4^( \clef "G" g'4) s2 c''1_( f'') } diff --git a/input/regression/slur-nice.ly b/input/regression/slur-nice.ly index bb35666906..8399155a52 100644 --- a/input/regression/slur-nice.ly +++ b/input/regression/slur-nice.ly @@ -8,6 +8,9 @@ run through noteheads or stems. " } +\layout{ + line-width = 120.\mm +} \relative c''{ \time 3/4 @@ -19,8 +22,3 @@ run through noteheads or stems. \stemNeutral c ( \stemUp c \stemNeutral c) c ( a c) c( d, c') c( f, c') \stemDown c( f, c') } -\layout{ - line-width = 120.\mm -} - - diff --git a/input/regression/spacing-bar-accidental.ly b/input/regression/spacing-bar-accidental.ly new file mode 100644 index 0000000000..5a34a107d7 --- /dev/null +++ b/input/regression/spacing-bar-accidental.ly @@ -0,0 +1,23 @@ + +\header { + texidoc = "An accidental following a bar gets space so + the left edge of the acc is at 0.3 - 0.6 staff space of the bar line" +} + + +\version "2.11.10" +\layout{ + ragged-right = ##t +} + + +\relative c'' { + \override Score.NonMusicalPaperColumn #'stencil = #ly:paper-column::print + \override Score.NonMusicalPaperColumn #'layer = #2 + + \time 1/4 + \stemUp + s4 + c4 + cis4 +} diff --git a/input/regression/spacing-bar-arpeggio.ly b/input/regression/spacing-bar-arpeggio.ly new file mode 100644 index 0000000000..fd84be5a9b --- /dev/null +++ b/input/regression/spacing-bar-arpeggio.ly @@ -0,0 +1,16 @@ +\header{ + texidoc = "An arpeggio following a bar gets space" + +} + +\version "2.10.10" + +\layout{ragged-right=##t} +\new Staff { + + \override Score.NonMusicalPaperColumn #'stencil = #ly:paper-column::print + \override Score.NonMusicalPaperColumn #'layer = #1 + + s1 + 1\arpeggio +} diff --git a/input/regression/spacing-bar-stem.ly b/input/regression/spacing-bar-stem.ly index d580160507..59b8fa956a 100644 --- a/input/regression/spacing-bar-stem.ly +++ b/input/regression/spacing-bar-stem.ly @@ -1,26 +1,27 @@ -\version "2.10.0" \header { texidoc = "Downstem notes following a barline are printed with some extra space. This is an optical correction similar to juxtaposed stems. -Accidentals after the barline get some space as well. -" +The bar upstem should be approx 1.1 staff space, the bar downstem 1.3 +to 1.5 staff space." } -\layout { ragged-right = ##t} -\relative c'' -{ - - %%\override Staff.StaffSpacing #'stem-spacing-correction = #10 - %%\override Staff.NoteSpacing #'stem-spacing-correction = #10 - - \time 1/4 \stemDown c4 \stemUp c4 - \stemDown c4 \stemUp c4 - \stemDown f c,4 c'4 cis4 \stemUp c4 +\version "2.11.10" +\layout{ + ragged-right = ##t } - +\relative c'' { + \override Score.NonMusicalPaperColumn #'stencil = #ly:paper-column::print + \override Score.NonMusicalPaperColumn #'layer = #2 + + \time 2/4 + \stemDown + s2 + e4 s4 + e,4 s4 +} diff --git a/input/regression/spacing-bar-whole-measure.ly b/input/regression/spacing-bar-whole-measure.ly new file mode 100644 index 0000000000..f2bbb62cb3 --- /dev/null +++ b/input/regression/spacing-bar-whole-measure.ly @@ -0,0 +1,22 @@ +\header{ + texidoc = "Notes that fill a whole measure are preceded by extra space. " + + } + +\version "2.11.10" + +\layout{ + ragged-right=##t +} + +\new Staff \relative { + \override Score.NonMusicalPaperColumn #'stencil = #ly:paper-column::print + \override Score.NonMusicalPaperColumn #'layer = #1 + + \time 4/4 + s1 + c2. c4 + \time 3/4 + s2. + c2. +} diff --git a/input/regression/spacing-folded-clef-cross-staff.ly b/input/regression/spacing-folded-clef-cross-staff.ly new file mode 100644 index 0000000000..8616fd811d --- /dev/null +++ b/input/regression/spacing-folded-clef-cross-staff.ly @@ -0,0 +1,22 @@ +\version "2.10.7" +\header { + texidoc = "Clefs are also folded under cross staff constructs." +} + +\layout { ragged-right = ##t} + +\context PianoStaff << + \new Staff = "up" + \relative c'' << + { + \stemDown + f16[ \change Staff = down \stemUp + \clef treble g,] + + } \\ + >> + \new Staff = "down" { + \time 3/8 \clef bass s8 + } +>> + diff --git a/input/regression/spacing-loose-grace-linebreak.ly b/input/regression/spacing-loose-grace-linebreak.ly new file mode 100644 index 0000000000..e9fab41136 --- /dev/null +++ b/input/regression/spacing-loose-grace-linebreak.ly @@ -0,0 +1,39 @@ +\header{ + texidoc = "If a floating grace spacing section attaches to a note +across a line break, it gets attached to the end of line." +} + + +\version "2.10.7" + +\new Score \with { + \override SpacingSpanner #'strict-grace-spacing = ##t + \override PaperColumn #'used = ##t +} << + + \new Staff << + + \new Voice { + \time 6/4 s2 + s2 \bar "" \break + s2 + } + + \new Voice { + b'4 + \afterGrace c''4 {b'16} + s4 + s4 + c''4 + } + \new Voice { + c'4 + c'8. + r16 + c'4 + c'4 + c'4 + } + >> +>> + diff --git a/input/regression/spacing-mark-width.ly b/input/regression/spacing-mark-width.ly new file mode 100644 index 0000000000..b0b461440b --- /dev/null +++ b/input/regression/spacing-mark-width.ly @@ -0,0 +1,18 @@ +\header { + + texidoc = "Width of marks does not affect spacing." + +} + +\version "2.10.7" + +\paper { + ragged-right = ##t +} + +\relative c'' +{ + \override Score.RehearsalMark #'break-visibility = #begin-of-line-invisible + c1 + \mark "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " +} diff --git a/input/regression/spacing-stem-bar.ly b/input/regression/spacing-stem-bar.ly index 87e14f00c6..3288f3cef5 100644 --- a/input/regression/spacing-stem-bar.ly +++ b/input/regression/spacing-stem-bar.ly @@ -10,19 +10,17 @@ space. This is an optical correction similar to juxtaposed stems. \layout { ragged-right = ##t} + \relative e' { + \override Score.PaperColumn #'layer = #1 + \override Score.PaperColumn #'stencil = #ly:paper-column::print - %%\override Staff.StaffSpacing #'stem-spacing-correction = #0.5 - %%\override Staff.NoteSpacing #'stem-spacing-correction = #0.5 - - \time 3/8 + + \time 2/8 \stemUp - e8 e e - f f f - a a a - c c c - e e e + e8[ e] + e'[ e] } diff --git a/input/regression/spanner-break-overshoot.ly b/input/regression/spanner-break-overshoot.ly index 7408bd11ae..6926256fdd 100644 --- a/input/regression/spanner-break-overshoot.ly +++ b/input/regression/spanner-break-overshoot.ly @@ -8,13 +8,13 @@ prefatory matter." } -\version "2.10.0" +\version "2.11.10" \paper { ragged-right = ##t } \relative c'' { \override Beam #'break-overshoot = #'(1.0 . 2.0) \override TupletBracket #'break-overshoot = #'(1.0 . 2.0) - \set allowBeamBreak = ##t + \override Beam #'breakable = ##t c2.. \times 2/3 { c8.[ \break c8.] } } diff --git a/input/regression/staff-mixed-size.ly b/input/regression/staff-mixed-size.ly index 72024b3ac2..d1d7cc5021 100644 --- a/input/regression/staff-mixed-size.ly +++ b/input/regression/staff-mixed-size.ly @@ -7,7 +7,7 @@ large on smaller staves." } -\version "2.10.0" +\version "2.11.11" \layout { #(layout-set-staff-size 6) diff --git a/input/regression/stem-shorten.ly b/input/regression/stem-shorten.ly index 346eac519c..25c029ecbc 100644 --- a/input/regression/stem-shorten.ly +++ b/input/regression/stem-shorten.ly @@ -19,6 +19,8 @@ \stemNeutral \stemUp a b c d e f g a \stemNeutral + s4 | + 2 } diff --git a/input/regression/stem-tremolo-forced-dir.ly b/input/regression/stem-tremolo-forced-dir.ly new file mode 100644 index 0000000000..146dd6241a --- /dev/null +++ b/input/regression/stem-tremolo-forced-dir.ly @@ -0,0 +1,8 @@ + +\version "2.10.2" +\layout { ragged-right = ##t } +\relative c +{ + \clef bass + \stemUp f4 : 32 +} diff --git a/input/regression/tie-accidental.ly b/input/regression/tie-accidental.ly new file mode 100644 index 0000000000..2f1ec24218 --- /dev/null +++ b/input/regression/tie-accidental.ly @@ -0,0 +1,19 @@ +\header { texidoc = " + lilypond should flip the tie's direction + to avoid a collision with the sharp. +" } + + +\version "2.11.11" + +\paper { + debug-tie-scoring = ##t + ragged-right = ##t +} + +\relative c'' { + \override Tie #'layer = #2 + a ~ +} + +% EOF diff --git a/input/regression/tie-broken-minimum-length.ly b/input/regression/tie-broken-minimum-length.ly index 51f9708a3c..2d3739e5ec 100644 --- a/input/regression/tie-broken-minimum-length.ly +++ b/input/regression/tie-broken-minimum-length.ly @@ -8,13 +8,13 @@ has a @code{minimum-length} of 5." } +\paper { + indent = 0.0\mm + line-width = 40.0\mm +} + \relative { \override Tie #'minimum-length = #5 f2. f16 f f f ~ | \break f1 } - -\paper { - indent = 0.0\mm - line-width = 40.0\mm -} diff --git a/input/regression/tie-broken-other-staff.ly b/input/regression/tie-broken-other-staff.ly new file mode 100644 index 0000000000..0bfca6aa52 --- /dev/null +++ b/input/regression/tie-broken-other-staff.ly @@ -0,0 +1,15 @@ +\header { + texidoc = "Broken tie lengths are not affected by clefs +in other staves." +} + +\version "2.10.0" + +\layout { + ragged-right = ##t +} + +<< + \new Staff \relative c'''{ e1 ~ \break e } + \new Staff \relative c{ \clef bass a \clef treble cis } +>> diff --git a/input/regression/tie-manual-vertical-tune.ly b/input/regression/tie-manual-vertical-tune.ly new file mode 100644 index 0000000000..ed631d9a01 --- /dev/null +++ b/input/regression/tie-manual-vertical-tune.ly @@ -0,0 +1,23 @@ +\header { + + + texidoc = "If using integers, the tie will vertically tuned for +staff line avoidance. If using a floating point number, this is taken +as the exact location." + +} + +\version "2.11.11" + +\layout { + ragged-right = ##t +} + +\version "2.10.0" +\relative c'' { + \override Tie #'staff-position = #3 + d4 ~ + \override Tie #'staff-position = #3.0 + d ~ + d + } diff --git a/input/regression/tie-single-chord.ly b/input/regression/tie-single-chord.ly new file mode 100644 index 0000000000..c6160ab8d8 --- /dev/null +++ b/input/regression/tie-single-chord.ly @@ -0,0 +1,17 @@ +\header { + + texidoc = "Tie directions are also scored. In hairy configurations, + the default rule for tie directions is overruled." + +} + +\version "2.11.11" + +\paper +{ + ragged-right = ##t +} + +\relative c' { + ~ +} diff --git a/input/regression/tie-single-manual.ly b/input/regression/tie-single-manual.ly index c085a7208b..0187dfbd0c 100644 --- a/input/regression/tie-single-manual.ly +++ b/input/regression/tie-single-manual.ly @@ -18,4 +18,7 @@ specifying their @code{direction} and/or @code{staff-position}." c'4 ~ c' \override Tie #'staff-position = #-7.5 c'4 ~ c' + \revert Tie #'staff-position + \override Tie #'direction = #UP + c'4 ~ c' } diff --git a/input/regression/to-xml.ly b/input/regression/to-xml.ly new file mode 100644 index 0000000000..0a3cc4a35d --- /dev/null +++ b/input/regression/to-xml.ly @@ -0,0 +1,16 @@ +\version "2.10.0" + +testMusic = { << c''4 \\ g'4 >> } + +#(use-modules (scm to-xml)) + +#(ly:progress "\nXML:\n\n~A\n" (call-with-output-string (lambda (p) (music-to-xml testMusic p)))) + + +\header { + texidoc = + "The input representation is generic, and may be translated to XML. " +} + + +{ \testMusic } diff --git a/input/regression/tuplet-full-length.ly b/input/regression/tuplet-full-length.ly index 60da5995fc..110da8a63b 100644 --- a/input/regression/tuplet-full-length.ly +++ b/input/regression/tuplet-full-length.ly @@ -5,14 +5,14 @@ start of the next non-tuplet note. " } -\version "2.10.0" +\version "2.11.10" \paper { ragged-right = ##t indent = 0.0 } \relative c'' \new Voice \with { \remove Forbid_line_break_engraver - allowBeamBreak = ##t + \override Beam #'breakable = ##t } { \set tupletFullLength = ##t diff --git a/input/regression/tuplet-nest-beam.ly b/input/regression/tuplet-nest-beam.ly new file mode 100644 index 0000000000..d7dc560bb2 --- /dev/null +++ b/input/regression/tuplet-nest-beam.ly @@ -0,0 +1,17 @@ +\header { + + texidoc = "Nested tuplets do collision resolution, also when they + span beams." + +} + +\version "2.10.8" +\paper{ + ragged-right=##t +} + +{ + \times 4/7 { + \times 4/5 { c'8 d' e' f' g' } a' b' c'' + } +} diff --git a/input/regression/utf-8.ly b/input/regression/utf-8.ly index 5b4a605361..abd4227671 100644 --- a/input/regression/utf-8.ly +++ b/input/regression/utf-8.ly @@ -47,9 +47,12 @@ japanese = \lyricmode { % "a legal song to you" portuguese = \lyricmode { - à vo cê uma can ção legal + à vo -- cê uma can -- ção legal } +\paper { + ragged-right = ##T +} \relative { c2 d e f g f e diff --git a/input/regression/warn-conflicting-key-signatures.ly b/input/regression/warn-conflicting-key-signatures.ly new file mode 100644 index 0000000000..4b9756ee9f --- /dev/null +++ b/input/regression/warn-conflicting-key-signatures.ly @@ -0,0 +1,11 @@ +\version "2.10.0" +%If you specify two different key sigs at one point, a +%warning is printed. + +\score { +\context Voice << + { \key cis \major cis4 \key bes \major bes4 } + { \key cis \major fis4 \key es \major g4 } +>> +} + diff --git a/input/test/+.ly b/input/test/+.ly deleted file mode 100644 index f19247dc22..0000000000 --- a/input/test/+.ly +++ /dev/null @@ -1,23 +0,0 @@ -\version "2.10.0" -%% +.ly: Be the first .ly file for lys-to-tely.py. -%% Better to make lys-to-tely.py include "introduction.texi" or -%% other .texi documents too? - -\header{ -texidoc = #(string-append " -@section Introduction - -This document shows all kinds of tips and tricks, from simple to -advanced. You may also find dirty tricks, or the very very -latest features that have not been documented or fully implemented -yet. - -In the web version of this document, you can click on the file name -or figure for each example to see the corresponding input file. - -This document is for LilyPond version -" (lilypond-version) ".") -} - -% make sure .png is generated. -\lyrics { "(left blank intentionally)" } diff --git a/input/test/AAA-intro-test.ly b/input/test/AAA-intro-test.ly new file mode 100644 index 0000000000..f19247dc22 --- /dev/null +++ b/input/test/AAA-intro-test.ly @@ -0,0 +1,23 @@ +\version "2.10.0" +%% +.ly: Be the first .ly file for lys-to-tely.py. +%% Better to make lys-to-tely.py include "introduction.texi" or +%% other .texi documents too? + +\header{ +texidoc = #(string-append " +@section Introduction + +This document shows all kinds of tips and tricks, from simple to +advanced. You may also find dirty tricks, or the very very +latest features that have not been documented or fully implemented +yet. + +In the web version of this document, you can click on the file name +or figure for each example to see the corresponding input file. + +This document is for LilyPond version +" (lilypond-version) ".") +} + +% make sure .png is generated. +\lyrics { "(left blank intentionally)" } diff --git a/input/test/ancient-accidentals.ly b/input/test/ancient-accidentals.ly deleted file mode 100644 index 10c5ab79be..0000000000 --- a/input/test/ancient-accidentals.ly +++ /dev/null @@ -1,23 +0,0 @@ - -\header { -texidoc = "@cindex Ancient Accidentals -Accidentals are available in different ancient styles, which all -are collected here. -" -} - -\version "2.10.0" - -\relative c'' { - \time 5/4 - \override Staff.Accidental #'style = #'default - cisis^\markup { \typewriter default } cis c ces ceses - \override Staff.Accidental #'style = #'hufnagel - cisis^\markup { \typewriter hufnagel } cis c ces ceses - \override Staff.Accidental #'style = #'medicaea - cisis^\markup { \typewriter medicaea } cis c ces ceses - \override Staff.Accidental #'style = #'vaticana - cisis^\markup { \typewriter vaticana } cis c ces ceses - \override Staff.Accidental #'style = #'mensural - cisis^\markup { \typewriter mensural } cis c ces ceses -} diff --git a/input/test/ancient-font.ly b/input/test/ancient-font.ly index baaf9eb93c..6ac4481693 100644 --- a/input/test/ancient-font.ly +++ b/input/test/ancient-font.ly @@ -1,4 +1,4 @@ -\version "2.10.0" +\version "2.11.6" % TODO: split ancient-font into seperate files; possibly in % different locations. \header { @@ -17,8 +17,8 @@ upperStaff = \new GregorianStaff = "upperStaff" << \override Staff.StaffSymbol #'line-count = #4 \transpose c c { - \override Staff.KeySignature #'style = #'vaticana - \override Staff.Accidental #'style = #'vaticana + \override Staff.KeySignature #'glyph-name-alist = #alteration-vaticana-glyph-name-alist + \override Staff.Accidental #'glyph-name-alist = #alteration-vaticana-glyph-name-alist \override NoteHead #'style = #'vaticana.punctum \key es \major \clef "vaticana-fa2" @@ -58,8 +58,8 @@ upperStaff = \new GregorianStaff = "upperStaff" << \override NoteHead #'style = #'vaticana.cephalicus es f - \override Staff.KeySignature #'style = #'medicaea - \override Staff.Accidental #'style = #'medicaea + \override Staff.KeySignature #'glyph-name-alist = #alteration-medicaea-glyph-name-alist + \override Staff.Accidental #'glyph-name-alist = #alteration-medicaea-glyph-name-alist \override Staff.Custos #'style = #'medicaea \override NoteHead #'style = #'medicaea.punctum \clef "medicaea-fa2" @@ -81,8 +81,8 @@ upperStaff = \new GregorianStaff = "upperStaff" << \override NoteHead #'style = #'medicaea.rvirga e! des! ces! - \override Staff.KeySignature #'style = #'hufnagel - \override Staff.Accidental #'style = #'hufnagel + \override Staff.KeySignature #'glyph-name-alist = #alteration-hufnagel-glyph-name-alist + \override Staff.Accidental #'glyph-name-alist = #alteration-hufnagel-glyph-name-alist \override Staff.Custos #'style = #'hufnagel \override NoteHead #'style = #'hufnagel.punctum \clef "hufnagel-fa2" @@ -258,8 +258,8 @@ lowerStaff = \new MensuralStaff = "lowerStaff" << \accepts MensuralVoice \consists Custos_engraver \override TimeSignature #'style = #'mensural - \override KeySignature #'style = #'mensural - \override Accidental #'style = #'mensural + \override KeySignature #'glyph-name-alist = #alteration-mensural-glyph-name-alist + \override Accidental #'glyph-name-alist = #alteration-mensural-glyph-name-alist \override Custos #'style = #'mensural \override Custos #'neutral-position = #3 \override Custos #'neutral-direction = #down @@ -276,8 +276,8 @@ lowerStaff = \new MensuralStaff = "lowerStaff" << \remove Time_signature_engraver \override StaffSymbol #'thickness = #2.0 \override StaffSymbol #'line-count = #4 - \override KeySignature #'style = #'vaticana - \override Accidental #'style = #'vaticana + \override KeySignature #'glyph-name-alist = #alteration-vaticana-glyph-name-alist + \override Accidental #'glyph-name-alist = #alteration-vaticana-glyph-name-alist \override Custos #'style = #'vaticana \override Custos #'neutral-position = #4 \override Custos #'neutral-direction = #down diff --git a/input/test/compound-time.ly b/input/test/compound-time.ly index 525c5a776b..a74b0baa8b 100644 --- a/input/test/compound-time.ly +++ b/input/test/compound-time.ly @@ -12,20 +12,16 @@ compound time. \layout{ragged-right = ##t} -#(define (compound-time grob one two num) - (interpret-markup - (ly:grob-layout grob) - '(((baseline-skip . 2) - (word-space . 2) - (font-family . number))) - (markup - #:line ( #:column (one num) #:lower 1 "+" #:column (two num))))) +#(define (compound-time one two num) + (markup #:override '(baseline-skip . 0) #:number + (#:line ((#:column (one num)) #:vcenter "+" (#:column (two num)))))) + \relative { %% compound time signature hack \time 5/8 - \override Staff.TimeSignature #'stencil - = #(lambda (grob) (compound-time grob "2" "3" "8")) + \override Staff.TimeSignature #'stencil = #ly:text-interface::print + \override Staff.TimeSignature #'text = #(compound-time "2" "3" "8" ) #(override-auto-beam-setting '(end 1 8 5 8) 1 4) c8 c c8 c c } diff --git a/input/test/engraver-one-by-one.ly b/input/test/engraver-one-by-one.ly index c4199cb643..1fdb502d1c 100644 --- a/input/test/engraver-one-by-one.ly +++ b/input/test/engraver-one-by-one.ly @@ -105,7 +105,6 @@ MyVoice = \context { \consists "Chord_tremolo_engraver" \consists "Percent_repeat_engraver" \consists "Slash_repeat_engraver" - \consists "Melisma_translator" %{ Must come before text_engraver, but after note_column engraver. diff --git a/input/test/makam.ly b/input/test/makam.ly new file mode 100644 index 0000000000..549df765c8 --- /dev/null +++ b/input/test/makam.ly @@ -0,0 +1,158 @@ +\header { + + texidoc = "Makam is Turkish type of melody that uses 1/9 tone + microtonal alterations." + +} + + +\version "2.11.6" + +%{ + +Define 1/9 alterations. + +%} + + +#(define-public KOMA 1/9) +#(define-public BAKIYE 4/9) +#(define-public KUCUK 5/9) +#(define-public BUYUKMUCENNEB 8/9) + +%{ + +Define pitch names + +%} + +makamPitchNames = #`( + (c . ,(ly:make-pitch -1 0 NATURAL)) + (d . ,(ly:make-pitch -1 1 NATURAL)) + (e . ,(ly:make-pitch -1 2 NATURAL)) + (f . ,(ly:make-pitch -1 3 NATURAL)) + (g . ,(ly:make-pitch -1 4 NATURAL)) + (a . ,(ly:make-pitch -1 5 NATURAL)) + (b . ,(ly:make-pitch -1 6 NATURAL)) + + (cc . ,(ly:make-pitch -1 0 KOMA)) + (dc . ,(ly:make-pitch -1 1 KOMA)) + (ec . ,(ly:make-pitch -1 2 KOMA)) + (fc . ,(ly:make-pitch -1 3 KOMA)) + (gc . ,(ly:make-pitch -1 4 KOMA)) + (ac . ,(ly:make-pitch -1 5 KOMA)) + (bc . ,(ly:make-pitch -1 6 KOMA)) + + (cb . ,(ly:make-pitch -1 0 BAKIYE)) + (db . ,(ly:make-pitch -1 1 BAKIYE)) + (eb . ,(ly:make-pitch -1 2 BAKIYE)) + (fb . ,(ly:make-pitch -1 3 BAKIYE)) + (gb . ,(ly:make-pitch -1 4 BAKIYE)) + (ab . ,(ly:make-pitch -1 5 BAKIYE)) + (bb . ,(ly:make-pitch -1 6 BAKIYE)) + + (ck . ,(ly:make-pitch -1 0 KUCUK)) + (dk . ,(ly:make-pitch -1 1 KUCUK)) + (ek . ,(ly:make-pitch -1 2 KUCUK)) + (fk . ,(ly:make-pitch -1 3 KUCUK)) + (gk . ,(ly:make-pitch -1 4 KUCUK)) + (ak . ,(ly:make-pitch -1 5 KUCUK)) + (bk . ,(ly:make-pitch -1 6 KUCUK)) + + (cbm . ,(ly:make-pitch -1 0 BUYUKMUCENNEB)) + (dbm . ,(ly:make-pitch -1 1 BUYUKMUCENNEB)) + (ebm . ,(ly:make-pitch -1 2 BUYUKMUCENNEB)) + (fbm . ,(ly:make-pitch -1 3 BUYUKMUCENNEB)) + (gbm . ,(ly:make-pitch -1 4 BUYUKMUCENNEB)) + (abm . ,(ly:make-pitch -1 5 BUYUKMUCENNEB)) + (bbm . ,(ly:make-pitch -1 6 BUYUKMUCENNEB)) + + ;; f for flat. + (cfc . ,(ly:make-pitch -1 0 (- KOMA))) + (dfc . ,(ly:make-pitch -1 1 (- KOMA))) + (efc . ,(ly:make-pitch -1 2 (- KOMA))) + (ffc . ,(ly:make-pitch -1 3 (- KOMA))) + (gfc . ,(ly:make-pitch -1 4 (- KOMA))) + (afc . ,(ly:make-pitch -1 5 (- KOMA))) + (bfc . ,(ly:make-pitch -1 6 (- KOMA))) + + (cfb . ,(ly:make-pitch -1 0 (- BAKIYE))) + (dfb . ,(ly:make-pitch -1 1 (- BAKIYE))) + (efb . ,(ly:make-pitch -1 2 (- BAKIYE))) + (ffb . ,(ly:make-pitch -1 3 (- BAKIYE))) + (gfb . ,(ly:make-pitch -1 4 (- BAKIYE))) + (afb . ,(ly:make-pitch -1 5 (- BAKIYE))) + (bfb . ,(ly:make-pitch -1 6 (- BAKIYE))) + + (cfk . ,(ly:make-pitch -1 0 (- KUCUK))) + (dfk . ,(ly:make-pitch -1 1 (- KUCUK))) + (efk . ,(ly:make-pitch -1 2 (- KUCUK))) + (ffk . ,(ly:make-pitch -1 3 (- KUCUK))) + (gfk . ,(ly:make-pitch -1 4 (- KUCUK))) + (afk . ,(ly:make-pitch -1 5 (- KUCUK))) + (bfk . ,(ly:make-pitch -1 6 (- KUCUK))) + + (cfbm . ,(ly:make-pitch -1 0 (- BUYUKMUCENNEB))) + (dfbm . ,(ly:make-pitch -1 1 (- BUYUKMUCENNEB))) + (efbm . ,(ly:make-pitch -1 2 (- BUYUKMUCENNEB))) + (ffbm . ,(ly:make-pitch -1 3 (- BUYUKMUCENNEB))) + (gfbm . ,(ly:make-pitch -1 4 (- BUYUKMUCENNEB))) + (afbm . ,(ly:make-pitch -1 5 (- BUYUKMUCENNEB))) + (bfbm . ,(ly:make-pitch -1 6 (- BUYUKMUCENNEB))) + +) + + +%% set pitch names. +pitchnames = \makamPitchNames +#(ly:parser-set-note-names parser makamPitchNames) + +\paper +{ + ragged-right = ##t +} + + +makamGlyphs = #'((1 . "accidentals.doublesharp") + (8/9 . "accidentals.sharp.slashslashslash.stemstem") + (5/9 . "accidentals.sharp.slashslashslash.stem") + (4/9 . "accidentals.sharp") + (1/9 . "accidentals.sharp.slashslash.stem") + (0 . "accidentals.natural") + (-1/9 . "accidentals.mirroredflat") + (-4/9 . "accidentals.flat.slash") + (-5/9 . "accidentals.flat") + (-8/9 . "accidentals.flat.slashslash") + (-1 . "accidentals.flatflat") + ) + +\relative { + + %{ define alteration <-> symbol mapping. The following glyphs are available. + + accidentals.sharp + accidentals.sharp.slashslash.stem + accidentals.sharp.slashslashslash.stemstem + accidentals.sharp.slashslashslash.stem + accidentals.sharp.slashslash.stemstemstem + accidentals.natural + accidentals.flat + accidentals.flat.slash + accidentals.flat.slashslash + accidentals.mirroredflat.flat + accidentals.mirroredflat + accidentals.flatflat + accidentals.flatflat.slash + accidentals.doublesharp + + %} + + \override Accidental #'glyph-name-alist = \makamGlyphs + + \override Staff.KeySignature #'glyph-name-alist = \makamGlyphs + \set Staff.keySignature = #'( + (3 . 4/9) + (6 . -1/9)) + + c cc db fk gbm gfc gfb efk dfbm +} diff --git a/lily/accidental-engraver.cc b/lily/accidental-engraver.cc index c7eb79955a..351ab2045a 100644 --- a/lily/accidental-engraver.cc +++ b/lily/accidental-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Modified 2001--2002 by Rune Zedeler */ @@ -51,9 +51,9 @@ Accidental_entry::Accidental_entry () class Accidental_engraver : public Engraver { int get_bar_number (); - void update_local_key_signature (); + void update_local_key_signature (SCM new_signature); void create_accidental (Accidental_entry *entry, bool, bool); - Grob *make_standard_accidental (Stream_event *note, Grob *note_head, Engraver *trans); + Grob *make_standard_accidental (Stream_event *note, Grob *note_head, Engraver *trans, bool); Grob *make_suggested_accidental (Stream_event *note, Grob *note_head, Engraver *trans); protected: @@ -72,13 +72,8 @@ protected: virtual void derived_mark () const; public: - SCM last_keysig_; // ugh. + SCM last_keysig_; - /* - Urgh. Since the accidentals depend on lots of variables, we have - to store all information before we can really create the - accidentals. - */ vector left_objects_; vector right_objects_; @@ -89,12 +84,8 @@ public: }; /* - TODO: - - ugh, it is not clear what properties are mutable and which - aren't. eg. localKeySignature is changed at runtime, which means - that references in grobs should always store ly_deep_copy ()s of - those. + localKeySignature is changed at runtime, which means that references + in grobs should always store ly_deep_copy ()s of those. */ @@ -111,12 +102,12 @@ Accidental_engraver::derived_mark () const } void -Accidental_engraver::update_local_key_signature () +Accidental_engraver::update_local_key_signature (SCM new_sig) { - last_keysig_ = get_property ("keySignature"); + last_keysig_ = new_sig; set_context_property_on_children (context (), ly_symbol2scm ("localKeySignature"), - last_keysig_); + new_sig); Context *trans = context ()->get_parent_context (); @@ -168,24 +159,41 @@ extract_alteration (SCM alteration_def) bool is_tied (SCM alteration_def) { - return (alteration_def == SCM_BOOL_T) - || (scm_is_pair (alteration_def) && scm_car (alteration_def) == SCM_BOOL_T); + SCM tied = ly_symbol2scm ("tied"); + return (alteration_def == tied + || (scm_is_pair (alteration_def) && scm_car (alteration_def) == tied)); } -static int -number_accidentals_from_sig (bool *different, SCM sig, Pitch *pitch, - int bar_number, SCM laziness, bool ignore_octave) +struct Accidental_result { - int n = pitch->get_notename (); - int o = pitch->get_octave (); + bool need_acc; + bool need_restore; + + Accidental_result () { + need_restore = need_acc = false; + } + + int score () const { + return need_acc ? 1 : 0 + + need_restore ? 1 : 0; + } +}; + +Accidental_result +check_pitch_against_signature (SCM key_signature, Pitch const &pitch, + int bar_number, SCM laziness, bool ignore_octave) +{ + Accidental_result result; + int n = pitch.get_notename (); + int o = pitch.get_octave (); SCM previous_alteration = SCM_BOOL_F; SCM from_same_octave = ly_assoc_get (scm_cons (scm_from_int (o), - scm_from_int (n)), sig, SCM_BOOL_F); - SCM from_key_signature = ly_assoc_get (scm_from_int (n), sig, SCM_BOOL_F); + scm_from_int (n)), key_signature, SCM_BOOL_F); + SCM from_key_signature = ly_assoc_get (scm_from_int (n), key_signature, SCM_BOOL_F); SCM from_other_octaves = SCM_BOOL_F; - for (SCM s = sig; scm_is_pair (s); s = scm_cdr (s)) + for (SCM s = key_signature; scm_is_pair (s); s = scm_cdr (s)) { SCM entry = scm_car (s); if (scm_is_pair (scm_car (entry)) @@ -207,65 +215,63 @@ number_accidentals_from_sig (bool *different, SCM sig, Pitch *pitch, else if (from_key_signature != SCM_BOOL_F) previous_alteration = from_key_signature; - int num = 1; if (is_tied (previous_alteration)) { - num = 1; - *different = true; + result.need_acc = true; } else { Rational prev = extract_alteration (previous_alteration); - Rational alter = pitch->get_alteration (); - - if (alter == prev) - num = 0; - else if ((alter.abs () < prev.abs () - || (prev * alter).sign () < 0) && alter.sign ()) - num = 2; - *different = (alter != prev); + Rational alter = pitch.get_alteration (); + + if (alter != prev) + { + result.need_acc = true; + if (alter.sign () + && (alter.abs () < prev.abs () + || (prev * alter).sign () < 0)) + result.need_restore = true; + } } - return num; + + return result; } -static int -number_accidentals (bool *different, - Pitch *pitch, Context *origin, - SCM accidentals, int bar_number) +static +Accidental_result +check_pitch_against_rules (Pitch const &pitch, Context *origin, + SCM rules, int bar_number) { - int number = 0; - - *different = false; - if (scm_is_pair (accidentals) && !scm_is_symbol (scm_car (accidentals))) + Accidental_result result; + if (scm_is_pair (rules) && !scm_is_symbol (scm_car (rules))) warning (_f ("accidental typesetting list must begin with context-name: %s", - ly_scm2string (scm_car (accidentals)).c_str ())); + ly_scm2string (scm_car (rules)).c_str ())); - for (; scm_is_pair (accidentals) && origin; - accidentals = scm_cdr (accidentals)) + for (; scm_is_pair (rules) && origin; + rules = scm_cdr (rules)) { - // If pair then it is a new accidentals typesetting rule to be checked - SCM rule = scm_car (accidentals); + SCM rule = scm_car (rules); if (scm_is_pair (rule)) { SCM type = scm_car (rule); SCM laziness = scm_cdr (rule); SCM localsig = origin->get_property ("localKeySignature"); - bool same_octave_b - = scm_is_eq (ly_symbol2scm ("same-octave"), type); - bool any_octave_b - = scm_is_eq (ly_symbol2scm ("any-octave"), type); + bool same_octave + = (ly_symbol2scm ("same-octave") == type); + bool any_octave + = (ly_symbol2scm ("any-octave") == type); - if (same_octave_b || any_octave_b) + if (same_octave || any_octave) { - bool d = false; - int n = number_accidentals_from_sig - (&d, localsig, pitch, bar_number, laziness, any_octave_b); - *different = *different || d; - number = max (number, n); + Accidental_result rule_result = check_pitch_against_signature + (localsig, pitch, bar_number, laziness, any_octave); + + result.need_acc |= rule_result.need_acc; + result.need_restore |= rule_result.need_restore; } else - warning (_f ("ignoring unknown accidental: %s", + warning (_f ("ignoring unknown accidental rule: %s", ly_symbol2string (type).c_str ())); } @@ -285,7 +291,7 @@ number_accidentals (bool *different, ly_scm2string (rule).c_str ())); } - return number; + return result; } int @@ -308,8 +314,8 @@ Accidental_engraver::process_acknowledged () { if (accidentals_.size () && !accidentals_.back ().done_) { - SCM accidentals = get_property ("autoAccidentals"); - SCM cautionaries = get_property ("autoCautionaries"); + SCM accidental_rules = get_property ("autoAccidentals"); + SCM cautionary_rules = get_property ("autoCautionaries"); int barnum = get_bar_number (); for (vsize i = 0; i < accidentals_.size (); i++) @@ -325,34 +331,29 @@ Accidental_engraver::process_acknowledged () if (!pitch) continue; - bool different = false; - bool different_caut = false; - - int num = number_accidentals (&different, - pitch, origin, - accidentals, barnum); - int num_caut = number_accidentals (&different_caut, - pitch, origin, - cautionaries, barnum); - + Accidental_result acc = check_pitch_against_rules (*pitch, origin, + accidental_rules, barnum); + Accidental_result caut = check_pitch_against_rules (*pitch, origin, + cautionary_rules, barnum); bool cautionary = to_boolean (note->get_property ("cautionary")); - if (num_caut > num) + if (caut.score () > acc.score ()) { - num = num_caut; - different = different_caut; + acc.need_acc |= caut.need_acc; + acc.need_restore |= caut.need_restore; + cautionary = true; } bool forced = to_boolean (note->get_property ("force-accidental")); - if (num == 0 && forced) - num = 1; + if (!acc.need_acc && forced) + acc.need_acc = true; /* Cannot look for ties: it's not guaranteed that they reach us before the notes. */ - if (num + if (acc.need_acc && !note->in_event_class ("trill-span-event")) - create_accidental (&accidentals_[i], num > 1, cautionary); + create_accidental (&accidentals_[i], acc.need_restore, cautionary); if (forced || cautionary) accidentals_[i].accidental_->set_property ("forced", SCM_BOOL_T); @@ -367,35 +368,27 @@ Accidental_engraver::create_accidental (Accidental_entry *entry, { Stream_event *note = entry->melodic_; Grob *support = entry->head_; - Pitch *pitch = unsmob_pitch (note->get_property ("pitch")); - bool as_suggestion = to_boolean (entry->origin_->get_property ("suggestAccidentals")); Grob *a = 0; if (as_suggestion) a = make_suggested_accidental (note, support, entry->origin_engraver_); else - a = make_standard_accidental (note, support, entry->origin_engraver_); + a = make_standard_accidental (note, support, entry->origin_engraver_, cautionary); - SCM accs = scm_cons (scm_from_int (pitch->get_alteration () * Rational (4)), - SCM_EOL); if (restore_natural) { if (to_boolean (get_property ("extraNatural"))) - accs = scm_cons (scm_from_int (0), accs); + a->set_property ("restore-first", SCM_BOOL_T); } - /* TODO: add cautionary option in accidental. */ - if (cautionary) - a->set_property ("cautionary", SCM_BOOL_T); - - a->set_property ("accidentals", accs); entry->accidental_ = a; } Grob * Accidental_engraver::make_standard_accidental (Stream_event *note, Grob *note_head, - Engraver *trans) + Engraver *trans, + bool cautionary) { (void)note; @@ -404,7 +397,11 @@ Accidental_engraver::make_standard_accidental (Stream_event *note, level, so that we get the property settings for Accidental from the respective Voice. */ - Grob *a = trans->make_item ("Accidental", note_head->self_scm ()); + Grob *a = 0; + if (cautionary) + a = trans->make_item ("AccidentalCautionary", note_head->self_scm ()); + else + a = trans->make_item ("Accidental", note_head->self_scm ()); /* We add the accidentals to the support of the arpeggio, @@ -416,9 +413,6 @@ Accidental_engraver::make_standard_accidental (Stream_event *note, Side_position_interface::add_support (left_objects_[i], a); } - /* - Hmm. Junkme? - */ for (vsize i = 0; i < right_objects_.size (); i++) Side_position_interface::add_support (a, right_objects_[i]); @@ -430,7 +424,7 @@ Accidental_engraver::make_standard_accidental (Stream_event *note, Accidental_placement::add_accidental (accidental_placement_, a); note_head->set_object ("accidental-grob", a->self_scm ()); - + return a; } @@ -503,8 +497,8 @@ Accidental_engraver::stop_translation_timestep () Remember an alteration that is different both from that of the tied note and of the key signature. */ - localsig = ly_assoc_front_x - (localsig, key, scm_cons (SCM_BOOL_T, scm_from_int (barnum))); + localsig = ly_assoc_prepend_x (localsig, key, scm_cons (ly_symbol2scm ("tied"), + scm_from_int (barnum))); change = true; } @@ -514,7 +508,7 @@ Accidental_engraver::stop_translation_timestep () not really really correct if there are more than one noteheads with the same notename. */ - localsig = ly_assoc_front_x (localsig, key, + localsig = ly_assoc_prepend_x (localsig, key, scm_cons (ly_rational2scm (a), scm_from_int (barnum))); change = true; @@ -544,9 +538,8 @@ Accidental_engraver::acknowledge_rhythmic_head (Grob_info info) /* string harmonics usually don't have accidentals. */ - if (to_boolean (get_property ("harmonicAccidentals")) - || !ly_is_equal (info.grob ()->get_property ("style"), - ly_symbol2scm ("harmonic"))) + if (info.grob ()->get_property ("style") != ly_symbol2scm ("harmonic") + || to_boolean (get_property ("harmonicAccidentals"))) { Accidental_entry entry; entry.head_ = info.grob (); @@ -581,10 +574,8 @@ void Accidental_engraver::process_music () { SCM sig = get_property ("keySignature"); - /* Detect key sig changes. - Update all parents and children. */ if (last_keysig_ != sig) - update_local_key_signature (); + update_local_key_signature (sig); } ADD_ACKNOWLEDGER (Accidental_engraver, arpeggio); @@ -599,8 +590,13 @@ ADD_TRANSLATOR (Accidental_engraver, "This engraver usually lives at Staff level, but " "reads the settings for Accidental at @code{Voice} level, " "so you can @code{\\override} them at @code{Voice}. ", - "Accidental AccidentalSuggestion", + /* grobs */ + "Accidental " + "AccidentalCautionary " + "AccidentalSuggestion ", + + /* props */ "autoAccidentals " "autoCautionaries " "internalBarNumber " diff --git a/lily/accidental-placement.cc b/lily/accidental-placement.cc index 6aaf49b2e6..cbc1478608 100644 --- a/lily/accidental-placement.cc +++ b/lily/accidental-placement.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ @@ -397,8 +397,8 @@ Accidental_placement::calc_positioning_done (SCM smob) Real padding = robust_scm2double (me->get_property ("padding"), 0.2); Skyline left_skyline = head_ape->left_skyline_; - left_skyline.raise (-robust_scm2double (me->get_property ("right-padding"), 0)) -; + left_skyline.raise (-robust_scm2double (me->get_property ("right-padding"), 0)); + /* Add accs entries right-to-left. */ @@ -406,7 +406,7 @@ Accidental_placement::calc_positioning_done (SCM smob) { Real offset = -apes[i]->right_skyline_.distance (left_skyline); if (isinf (offset)) - offset = (i < apes.size () - 1) ? apes[i + 1]->offset_ : 0.0; + offset = (i + 1 < apes.size ()) ? apes[i + 1]->offset_ : 0.0; else offset -= padding; @@ -442,9 +442,10 @@ Accidental_placement::calc_positioning_done (SCM smob) me->flush_extent_cache (X_AXIS); me->set_property ("X-extent", scm_width); - for (vsize i = apes.size (); i--;) - delete apes[i]; + junk_pointers (apes); + delete head_ape; + return SCM_BOOL_T; } diff --git a/lily/accidental.cc b/lily/accidental.cc index 6b9718f61c..3bfd1b816d 100644 --- a/lily/accidental.cc +++ b/lily/accidental.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #include "accidental-interface.hh" @@ -11,16 +11,10 @@ #include "international.hh" #include "item.hh" #include "output-def.hh" +#include "paper-column.hh" #include "pitch.hh" #include "stencil.hh" -/* - TODO: insert support for smaller cautionaries, tie-break-reminders. - Either here or in new-accidental-engraver. - - 'accidentals should go, for a single 'accidental property -- see - accidental-placement.cc -*/ Stencil parenthesize (Grob *me, Stencil m) { @@ -31,233 +25,170 @@ parenthesize (Grob *me, Stencil m) Stencil close = font->find_by_name ("accidentals.rightparen"); - m.add_at_edge (X_AXIS, LEFT, Stencil (open), 0, 0); - m.add_at_edge (X_AXIS, RIGHT, Stencil (close), 0, 0); + m.add_at_edge (X_AXIS, LEFT, Stencil (open), 0); + m.add_at_edge (X_AXIS, RIGHT, Stencil (close), 0); return m; } -/* - Hmm. Need separate callback, or perhaps #'live bool property. - */ -MAKE_SCHEME_CALLBACK (Accidental_interface, after_line_breaking, 1); + +/* This callback exists for the sole purpose of allowing us to override + its pure equivalent to accidental-interface::pure-height */ +MAKE_SCHEME_CALLBACK (Accidental_interface, height, 1); SCM -Accidental_interface::after_line_breaking (SCM smob) +Accidental_interface::height (SCM smob) { - Grob *me = unsmob_grob (smob); - Grob *tie = unsmob_grob (me->get_object ("tie")); + return Grob::stencil_height (smob); +} - if (tie && !tie->original () - && !to_boolean (me->get_property ("forced"))) - { - me->suicide (); - } - - return SCM_UNSPECIFIED; +MAKE_SCHEME_CALLBACK (Accidental_interface, pure_height, 3); +SCM +Accidental_interface::pure_height (SCM smob, SCM start_scm, SCM) +{ + Item *me = dynamic_cast (unsmob_grob (smob)); + int start = scm_to_int (start_scm); + int rank = me->get_column ()->get_rank (); + + bool visible = to_boolean (me->get_property ("forced")) + || !unsmob_grob (me->get_object ("tie")) + || rank != start + 1; /* we are in the middle of a line */ + + return visible ? Grob::stencil_height (smob) : ly_interval2scm (Interval ()); } vector -Accidental_interface::accurate_boxes (Grob *a, Grob **common) +Accidental_interface::accurate_boxes (Grob *me, Grob **common) { Box b; - b[X_AXIS] = a->extent (a, X_AXIS); - b[Y_AXIS] = a->extent (a, Y_AXIS); + b[X_AXIS] = me->extent (me, X_AXIS); + b[Y_AXIS] = me->extent (me, Y_AXIS); vector boxes; - bool parens = false; - if (to_boolean (a->get_property ("cautionary"))) - { - SCM cstyle = a->get_property ("cautionary-style"); - parens = ly_is_equal (cstyle, ly_symbol2scm ("parentheses")); - } + bool parens = to_boolean (me->get_property ("parenthesized")); + if (!me->is_live ()) + return boxes; - SCM accs = a->get_property ("accidentals"); - SCM scm_style = a->get_property ("style"); + SCM scm_style = me->get_property ("style"); if (!scm_is_symbol (scm_style) - && !parens - && scm_ilength (accs) == 1) + && !to_boolean (me->get_property ("restore-first")) + && !parens) { - switch (scm_to_int (scm_car (accs))) + Rational alteration + = robust_scm2rational (me->get_property ("alteration"), 0); + if (alteration == FLAT_ALTERATION) { - case FLAT: - { - Box stem = b; - Box bulb = b; + Box stem = b; + Box bulb = b; - /* - we could make the stem thinner, but that places the flats - really close. - */ - stem[X_AXIS][RIGHT] *= .5; - - /* - To prevent vertical alignment for 6ths - */ - stem[Y_AXIS] *= 1.1; - bulb[Y_AXIS][UP] *= .35; - - boxes.push_back (bulb); - boxes.push_back (stem); - } - break; - case NATURAL: - { - Box lstem = b; - Box rstem = b; - Box belly = b; - - lstem[Y_AXIS] *= 1.1; - rstem[Y_AXIS] *= 1.1; + /* + we could make the stem thinner, but that places the flats + really close. + */ + stem[X_AXIS][RIGHT] *= .5; - belly[Y_AXIS] *= 0.75; - lstem[X_AXIS][RIGHT] *= .33; - rstem[X_AXIS][LEFT] = rstem[X_AXIS].linear_combination (1.0 / 3.0); - lstem[Y_AXIS][DOWN] = belly[Y_AXIS][DOWN]; - rstem[Y_AXIS][UP] = belly[Y_AXIS][UP]; - boxes.push_back (belly); - boxes.push_back (lstem); - boxes.push_back (rstem); - } - break; /* - TODO: add support for, double flat. + To prevent vertical alignment for 6ths */ + stem[Y_AXIS] *= 1.1; + bulb[Y_AXIS][UP] *= .35; + + boxes.push_back (bulb); + boxes.push_back (stem); } + else if (alteration == NATURAL_ALTERATION) + { + Box lstem = b; + Box rstem = b; + Box belly = b; + + lstem[Y_AXIS] *= 1.1; + rstem[Y_AXIS] *= 1.1; + + belly[Y_AXIS] *= 0.75; + lstem[X_AXIS][RIGHT] *= .33; + rstem[X_AXIS][LEFT] = rstem[X_AXIS].linear_combination (1.0 / 3.0); + lstem[Y_AXIS][DOWN] = belly[Y_AXIS][DOWN]; + rstem[Y_AXIS][UP] = belly[Y_AXIS][UP]; + boxes.push_back (belly); + boxes.push_back (lstem); + boxes.push_back (rstem); + } + /* + TODO: add support for, double flat. + */ } if (!boxes.size ()) boxes.push_back (b); - Offset o (a->relative_coordinate (common[X_AXIS], X_AXIS), - a->relative_coordinate (common[Y_AXIS], Y_AXIS)); + Offset o (me->relative_coordinate (common[X_AXIS], X_AXIS), + me->relative_coordinate (common[Y_AXIS], Y_AXIS)); + for (vsize i = boxes.size (); i--;) boxes[i].translate (o); return boxes; } -/* - * Some styles do not provide all flavours of accidentals, e.g. there - * is currently no sharp accidental in vaticana style. In these cases - * this function falls back to one of the other styles. - */ - -/* - todo: this sort of stuff in Scheme. --hwn. -*/ -string -Accidental_interface::get_fontcharname (string style, int alteration) -{ - if (alteration == DOUBLE_FLAT - || alteration == DOUBLE_SHARP) - return to_string (alteration); - - if (style == "hufnagel") - switch (alteration) - { - case FLAT: return "hufnagel-1"; - case 0: return "vaticana0"; - case SHARP: return "mensural1"; - } - if (style == "medicaea") - switch (alteration) - { - case FLAT: return "medicaea-1"; - case 0: return "vaticana0"; - case SHARP: return "mensural1"; - } - if (style == "vaticana") - switch (alteration) - { - case FLAT: return "vaticana-1"; - case 0: return "vaticana0"; - case SHARP: return "mensural1"; - } - if (style == "mensural") - switch (alteration) - { - case FLAT: return "mensural-1"; - case 0: return "vaticana0"; - case SHARP: return "mensural1"; - } - - if (style == "neomensural") - style = ""; // currently same as default - if (style == "default") - style = ""; - return style + to_string (alteration); -} - MAKE_SCHEME_CALLBACK (Accidental_interface, print, 1); SCM Accidental_interface::print (SCM smob) { Grob *me = unsmob_grob (smob); - bool smaller = false; - bool parens = false; + Grob *tie = unsmob_grob (me->get_object ("tie")); - bool caut = to_boolean (me->get_property ("cautionary")); - if (caut) + if (tie && !tie->original () + && !to_boolean (me->get_property ("forced"))) { - SCM cstyle = me->get_property ("cautionary-style"); - parens = ly_is_equal (cstyle, ly_symbol2scm ("parentheses")); - smaller = ly_is_equal (cstyle, ly_symbol2scm ("smaller")); + me->suicide (); + return SCM_EOL; } - - SCM scm_style = me->get_property ("style"); - string style; - if (scm_is_symbol (scm_style)) - style = ly_symbol2string (scm_style); - else - /* - preferably no name for the default style. - */ - style = ""; - - Font_metric *fm = 0; - if (smaller) + + Font_metric *fm = Font_interface::get_default_font (me); + + SCM alist = me->get_property ("glyph-name-alist"); + SCM alt = me->get_property ("alteration"); + SCM glyph_name = ly_assoc_get (alt, alist, SCM_BOOL_F); + + if (!scm_is_string (glyph_name)) { - SCM ac = Font_interface::music_font_alist_chain (me); - /* - TODO: should calc font-size by adding -2 to current font-size - */ - ac = scm_cons (scm_list_1 (scm_cons - (ly_symbol2scm ("font-size"), - scm_from_int (-2))), - ac); - fm = select_font (me->layout (), ac); + me->warning (_f ("Could not find glyph-name for alteration %s", + ly_scm_write_string (alt).c_str ())); + return SCM_EOL; } - else - fm = Font_interface::get_default_font (me); - - Stencil mol; - for (SCM s = me->get_property ("accidentals"); - scm_is_pair (s); s = scm_cdr (s)) + + Stencil mol (fm->find_by_name (scm_i_string_chars (glyph_name))); + if (to_boolean (me->get_property ("restore-first"))) { - int alteration = scm_to_int (scm_car (s)); - string font_char = get_fontcharname (style, alteration); - Stencil acc (fm->find_by_name ("accidentals." + font_char)); + /* + this isn't correct for ancient accidentals, but they don't + use double flats/sharps anyway. + */ + Stencil acc (fm->find_by_name ("accidentals.natural")); if (acc.is_empty ()) - me->warning (_f ("accidental `%s' not found", font_char)); + me->warning (_ ("natural alteration glyph not found")); else - mol.add_at_edge (X_AXIS, RIGHT, acc, 0.1, 0); + mol.add_at_edge (X_AXIS, LEFT, acc, 0.1); } - - if (parens) + + if (to_boolean (me->get_property ("parenthesized"))) mol = parenthesize (me, mol); return mol.smobbed_copy (); } + ADD_INTERFACE (Accidental_interface, "a single accidental", - "accidentals " + + /* props */ + "alteration " "avoid-slur " - "cautionary " - "cautionary-style " "forced " - "style " + "parenthesized " + "restore-first " + "glyph-name-alist " "tie " ); diff --git a/lily/align-interface.cc b/lily/align-interface.cc index 07c9ebe3c9..fc62e45eb3 100644 --- a/lily/align-interface.cc +++ b/lily/align-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "align-interface.hh" @@ -14,7 +14,9 @@ #include "hara-kiri-group-spanner.hh" #include "grob-array.hh" #include "international.hh" +#include "system.hh" #include "warn.hh" +#include "paper-column.hh" /* TODO: for vertical spacing, should also include a rod & spring @@ -145,8 +147,17 @@ get_skylines (Grob *me, vector child_refpoints; for (vsize i = 0; i < elements->size (); i++) { - extract_grob_set ((*elements)[i], "elements", child_elts); - Grob *child_common = common_refpoint_of_array (child_elts, (*elements)[i], other_axis (a)); + Grob *elt = (*elements)[i]; + Grob *child_common = unsmob_grob ((a == Y_AXIS) + ? elt->get_object ("X-common") + : elt->get_object ("Y-common")); + + if (!child_common) + { + extract_grob_set (elt, "elements", child_elts); + child_common = common_refpoint_of_array (child_elts, elt, other_axis (a)); + } + child_refpoints.push_back (child_common); } Grob *common_refpoint = common_refpoint_of_array (child_refpoints, me, other_axis (a)); @@ -216,7 +227,10 @@ Align_interface::get_extents_aligned_translates (Grob *me, SCM line_break_details = SCM_EOL; if (a == Y_AXIS && me_spanner) { - line_break_details = me_spanner->get_bound (LEFT)->get_property ("line-break-system-details"); + if (pure) + line_break_details = get_root_system (me)->column (start)->get_property ("line-break-system-details"); + else + line_break_details = me_spanner->get_bound (LEFT)->get_property ("line-break-system-details"); if (!me->get_system () && !pure) me->warning (_ ("vertical alignment called before line-breaking.\n" diff --git a/lily/all-font-metrics.cc b/lily/all-font-metrics.cc index 61b0a60e6f..f8da4b2ecd 100644 --- a/lily/all-font-metrics.cc +++ b/lily/all-font-metrics.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "all-font-metrics.hh" @@ -65,15 +65,10 @@ All_font_metrics::All_font_metrics (All_font_metrics const &) #if HAVE_PANGO_FT2 Pango_font * -All_font_metrics::find_pango_font (PangoFontDescription *description, - Real magnification, +All_font_metrics::find_pango_font (PangoFontDescription const *description, Real output_scale ) { - pango_font_description_set_size (description, - gint (magnification * - pango_font_description_get_size (description))); - gchar *pango_fn = pango_font_description_to_filename (description); SCM key = ly_symbol2scm (pango_fn); @@ -104,37 +99,12 @@ All_font_metrics::find_pango_font (PangoFontDescription *description, #endif -string -kpathsea_find_file (string name, string ext) -{ - name += "." + ext; - string path = global_path.find (name); - if (path.length () > 0) - return path; - - static SCM proc; - if (!proc) - { - SCM module = scm_c_resolve_module ("scm kpathsea"); - proc = scm_c_module_lookup (module, "ly:kpathsea-find-file"); - proc = scm_variable_ref (proc); - } - - if (ly_is_procedure (proc)) - { - SCM kp_result = scm_call_1 (proc, scm_makfrom0str (name.c_str ())); - if (scm_is_string (kp_result)) - return ly_scm2string (kp_result); - } - - return ""; -} Open_type_font * All_font_metrics::find_otf (string name) { SCM sname = ly_symbol2scm (name.c_str ()); - SCM name_string = scm_makfrom0str (name.c_str ()); + SCM name_string = ly_string2scm (name); SCM val; if (!otf_dict_->try_retrieve (sname, &val)) { diff --git a/lily/ambitus-engraver.cc b/lily/ambitus-engraver.cc index 8f617652bf..e2fdcc9595 100644 --- a/lily/ambitus-engraver.cc +++ b/lily/ambitus-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Juergen Reuter + (c) 2002--2007 Juergen Reuter Han-Wen Nienhuys set_property ("accidentals", l); + accidentals_[d]->set_property ("alteration", ly_rational2scm (p.get_alteration ())); } } while (flip (&d) != DOWN); diff --git a/lily/ambitus.cc b/lily/ambitus.cc index 1e6da083bc..a584834f49 100644 --- a/lily/ambitus.cc +++ b/lily/ambitus.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Juergen Reuter + (c) 2002--2007 Juergen Reuter */ #include "ambitus.hh" @@ -24,7 +24,7 @@ Ambitus::print (SCM smob) Item *me = (Item *) unsmob_grob (smob); Stencil stencil; - // join heads + // FIXME : should be Ambitus_line join heads extract_grob_set (me, "note-heads", heads); if (to_boolean (me->get_property ("join-heads")) && heads.size () > 1) diff --git a/lily/apply-context-iterator.cc b/lily/apply-context-iterator.cc index adf708da35..adccbeea13 100644 --- a/lily/apply-context-iterator.cc +++ b/lily/apply-context-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "context.hh" diff --git a/lily/arpeggio-engraver.cc b/lily/arpeggio-engraver.cc index 0086d121e7..0528f71d9f 100644 --- a/lily/arpeggio-engraver.cc +++ b/lily/arpeggio-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ #include "engraver.hh" diff --git a/lily/arpeggio.cc b/lily/arpeggio.cc index d9e9e80636..234dbc44e3 100644 --- a/lily/arpeggio.cc +++ b/lily/arpeggio.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ #include "arpeggio.hh" @@ -84,11 +84,11 @@ Arpeggio::print (SCM smob) for (Real y = heads[LEFT]; y < heads[RIGHT]; y += squiggle.extent (Y_AXIS).length ()) - mol.add_at_edge (Y_AXIS, UP, squiggle, 0.0, 0); + mol.add_at_edge (Y_AXIS, UP, squiggle, 0.0); mol.translate_axis (heads[LEFT], Y_AXIS); if (dir) - mol.add_at_edge (Y_AXIS, dir, arrow, 0, 0); + mol.add_at_edge (Y_AXIS, dir, arrow, 0); return mol.smobbed_copy (); } diff --git a/lily/audio-column.cc b/lily/audio-column.cc index d0a36518a5..d052c4e8cc 100644 --- a/lily/audio-column.cc +++ b/lily/audio-column.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "audio-column.hh" @@ -11,9 +11,9 @@ #include "audio-item.hh" #include "performance.hh" -Audio_column::Audio_column (Moment at_mom) +Audio_column::Audio_column (Moment when) { - at_mom_ = at_mom; + when_ = when; } void @@ -24,14 +24,21 @@ Audio_column::add_audio_item (Audio_item *l) } Moment -Audio_column::at_mom () const +Audio_column::when () const { - return at_mom_; + return when_; +} + +int +Audio_column::ticks () const +{ + return int (moment_to_ticks (when_)); } void -Audio_column::offset_at_mom (Moment m) +Audio_column::offset_when (Moment m) { - at_mom_ += m; + when_ += m; } + diff --git a/lily/audio-element-info.cc b/lily/audio-element-info.cc index 877828bb94..bcae088b67 100644 --- a/lily/audio-element-info.cc +++ b/lily/audio-element-info.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "audio-element-info.hh" diff --git a/lily/audio-element.cc b/lily/audio-element.cc index f61a356e8b..8d3a3e3953 100644 --- a/lily/audio-element.cc +++ b/lily/audio-element.cc @@ -3,8 +3,9 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ +#include #include "audio-element.hh" diff --git a/lily/audio-item.cc b/lily/audio-item.cc index 4a3b9d4a41..41381458f6 100644 --- a/lily/audio-item.cc +++ b/lily/audio-item.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "audio-item.hh" @@ -16,6 +16,17 @@ Audio_instrument::Audio_instrument (string instrument_string) str_ = instrument_string; } +void +Audio_item::render () +{ +} + +Audio_column * +Audio_item::get_column () const +{ + return audio_column_; +} + Audio_item::Audio_item () { audio_column_ = 0; @@ -47,11 +58,90 @@ Audio_key::Audio_key (int acc, bool major) major_ = major; } -Audio_dynamic::Audio_dynamic (Real volume) +Audio_dynamic::Audio_dynamic () +{ + volume_ = -1; +} + +Audio_span_dynamic::Audio_span_dynamic () { - volume_ = volume; + grow_dir_ = CENTER; } +void +Audio_span_dynamic::add_absolute (Audio_dynamic *d) +{ + assert (d); + dynamics_.push_back (d); +} + +Moment +remap_grace_duration (Moment m) +{ + return Moment (m.main_part_ + Rational (9,40) * m.grace_part_, + Rational (0)); +} + +Real +moment_to_real (Moment m) +{ + return remap_grace_duration (m).main_part_.to_double (); +} + +int +moment_to_ticks (Moment m) +{ + return int (moment_to_real (m) * 384 * 4); +} + +void +Audio_span_dynamic::render () +{ + if (dynamics_.size () <= 1) + return ; + + assert (dynamics_[0]->volume_ >= 0); + + while (dynamics_.back ()->volume_ > 0 + && dynamics_.size () > 1 + && sign (dynamics_.back ()->volume_ - dynamics_[0]->volume_) != grow_dir_) + { + dynamics_.erase (dynamics_.end () - 1); + } + + if (dynamics_.size () <= 1) + { + programming_error ("(de)crescendo on items with specified volume."); + return ; + } + + Real delta_v = grow_dir_ * 0.1; + + Real start_v = dynamics_[0]->volume_; + if (dynamics_.back ()->volume_ < 0) + dynamics_.back ()->volume_ = max (min (start_v + grow_dir_ * 0.25, 1.0), 0.0); + + delta_v = dynamics_.back ()->volume_ - dynamics_[0]->volume_; + + Moment start = dynamics_[0]->get_column ()->when (); + + Real total_t = moment_to_real (dynamics_.back ()->get_column ()->when () - start); + + for (vsize i = 1; i < dynamics_.size(); i ++) + { + Moment dt_moment = dynamics_[i]->get_column ()->when () + - start; + + Real dt = moment_to_real (dt_moment); + + Real v = start_v + delta_v * (dt / total_t); + + dynamics_[i]->volume_ = v; + } +} + + + Audio_tempo::Audio_tempo (int per_minute_4) { per_minute_4_ = per_minute_4; diff --git a/lily/audio-staff.cc b/lily/audio-staff.cc index 1616ceb3c8..353a26f270 100644 --- a/lily/audio-staff.cc +++ b/lily/audio-staff.cc @@ -3,12 +3,12 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "audio-staff.hh" -#include "midi-item.hh" +#include "midi-chunk.hh" #include "midi-stream.hh" #include "midi-walker.hh" @@ -28,10 +28,13 @@ Audio_staff::output (Midi_stream &midi_stream, int channel) { Midi_track midi_track; midi_track.number_ = channel; - - for (Midi_walker i (this, &midi_track, channel); i.ok (); i++) + + Midi_walker i (this, &midi_track, channel); + for (; i.ok (); i++) i.process (); + + i.finalize (); - midi_stream << midi_track; + midi_stream.write (midi_track); } diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc index 48766e7e52..d2cef6ae16 100644 --- a/lily/auto-beam-engraver.cc +++ b/lily/auto-beam-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Jan Nieuwenhuizen + (c) 1999--2007 Jan Nieuwenhuizen */ #include "bar-line.hh" @@ -68,15 +68,17 @@ private: Moment beam_start_moment_; Moment beam_start_location_; - bool subdivide_beams_; - Moment beat_length_; - // We act as if beam were created, and start a grouping anyway. Beaming_pattern *grouping_; SCM beam_settings_; Beaming_pattern *finished_grouping_; + + Beaming_options beaming_options_; + Beaming_options finished_beaming_options_; + + void check_bar_property (); }; @@ -186,8 +188,7 @@ Auto_beam_engraver::create_beam () Can't use make_spanner_from_properties() because we have to use beam_settings_. */ - Spanner *beam = new Spanner (beam_settings_, - context ()->get_grob_key ("Beam")); + Spanner *beam = new Spanner (beam_settings_); for (vsize i = 0; i < stems_->size (); i++) Beam::add_stem (beam, (*stems_)[i]); @@ -208,6 +209,7 @@ Auto_beam_engraver::begin_beam () stems_ = new vector; grouping_ = new Beaming_pattern (); + beaming_options_.from_context (context ()); beam_settings_ = updated_grob_properties (context (), ly_symbol2scm ("Beam")); beam_start_moment_ = now_mom (); @@ -238,8 +240,13 @@ Auto_beam_engraver::end_beam () else { finished_beam_ = create_beam (); + if (finished_beam_) - finished_grouping_ = grouping_; + { + announce_end_grob (finished_beam_, SCM_EOL); + finished_grouping_ = grouping_; + finished_beaming_options_ = beaming_options_; + } delete stems_; stems_ = 0; grouping_ = 0; @@ -257,7 +264,7 @@ Auto_beam_engraver::typeset_beam () if (!finished_beam_->get_bound (RIGHT)) finished_beam_->set_bound (RIGHT, finished_beam_->get_bound (LEFT)); - finished_grouping_->beamify (context ()); + finished_grouping_->beamify (finished_beaming_options_); Beam::set_beaming (finished_beam_, finished_grouping_); finished_beam_ = 0; @@ -427,5 +434,11 @@ ADD_TRANSLATOR (Auto_beam_engraver, "@ref{Stem_engraver} properties @code{stemLeftBeamCount} and " "@code{stemRightBeamCount}. ", /* create */ "Beam", - /* read */ "autoBeaming autoBeamSettings beatLength subdivideBeams", + + /* read */ + "autoBeaming " + "autoBeamSettings " + "beatLength " + "subdivideBeams ", + /* write */ ""); diff --git a/lily/axis-group-engraver.cc b/lily/axis-group-engraver.cc index e6ad51e683..3d83349526 100644 --- a/lily/axis-group-engraver.cc +++ b/lily/axis-group-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "axis-group-engraver.hh" diff --git a/lily/axis-group-interface-scheme.cc b/lily/axis-group-interface-scheme.cc index bc1449f8da..d0470b5a75 100644 --- a/lily/axis-group-interface-scheme.cc +++ b/lily/axis-group-interface-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "axis-group-interface.hh" diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 4319bb8b92..23c3087247 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "axis-group-interface.hh" @@ -68,6 +68,14 @@ Axis_group_interface::relative_group_extent (vector const &elts, return r; } + +/* + FIXME: pure extent handling has a lot of ad-hoc caching. + This should be done with grob property callbacks. + + --hwn +*/ + Interval Axis_group_interface::cached_pure_height (Grob *me, vector const &elts, @@ -101,7 +109,7 @@ Axis_group_interface::cached_pure_height (Grob *me, if (!scm_is_vector (extents)) { extents = scm_c_make_vector (breaks.size () - 1, SCM_EOL); - for (vsize i = 0; i < breaks.size () - 1; i++) + for (vsize i = 0; i + 1 < breaks.size (); i++) { int st = Paper_column::get_rank (cols[breaks[i]]); int ed = Paper_column::get_rank (cols[breaks[i+1]]); @@ -177,6 +185,17 @@ Axis_group_interface::pure_height (SCM smob, SCM start_scm, SCM end_scm) int end = robust_scm2int (end_scm, INT_MAX); Grob *me = unsmob_grob (smob); + /* Maybe we are in the second pass of a two-pass spacing run. In that + case, the Y-extent of a system is already given to us */ + System *system = dynamic_cast (me); + if (system) + { + SCM line_break_details = system->column (start)->get_property ("line-break-system-details"); + SCM system_y_extent = scm_assq (ly_symbol2scm ("system-Y-extent"), line_break_details); + if (scm_is_pair (system_y_extent)) + return scm_cdr (system_y_extent); + } + return pure_group_height (me, start, end); } @@ -235,44 +254,73 @@ Axis_group_interface::generic_group_extent (Grob *me, Axis a) return ly_interval2scm (r - my_coord); } -SCM -Axis_group_interface::pure_group_height (Grob *me, int start, int end) + +Grob * +Axis_group_interface::calc_pure_elts_and_common (Grob *me) { - Grob *common = unsmob_grob (me->get_object ("common-refpoint-of-elements")); + if (Grob *c = unsmob_grob (me->get_object ("pure-Y-common"))) + return c; + + extract_grob_set (me, "elements", elts); - if (!common) + vector relevant_elts; + SCM pure_relevant_p = ly_lily_module_constant ("pure-relevant?"); + + for (vsize i = 0; i < elts.size (); i++) { - extract_grob_set (me, "elements", elts); + if (to_boolean (scm_apply_1 (pure_relevant_p, elts[i]->self_scm (), SCM_EOL))) + relevant_elts.push_back (elts[i]); - vector relevant_elts; - SCM is_relevant = ly_lily_module_constant ("pure-relevant"); + Item *it = dynamic_cast (elts[i]); + Direction d = LEFT; + if (it) + do + { + Item *piece = it->find_prebroken_piece (d); + if (piece && to_boolean (scm_apply_1 (pure_relevant_p, piece->self_scm (), SCM_EOL))) + relevant_elts.push_back (piece); + } + while (flip (&d) != LEFT); + } - for (vsize i = 0; i < elts.size (); i++) - { - if (to_boolean (scm_apply_1 (is_relevant, elts[i]->self_scm (), SCM_EOL))) - relevant_elts.push_back (elts[i]); - - Item *it = dynamic_cast (elts[i]); - Direction d = LEFT; - if (it) - do - { - Item *piece = it->find_prebroken_piece (d); - if (piece && to_boolean (scm_apply_1 (is_relevant, piece->self_scm (), SCM_EOL))) - relevant_elts.push_back (piece); - } - while (flip (&d) != LEFT); - } + Grob *common = common_refpoint_of_array (relevant_elts, me, Y_AXIS); + me->set_object ("pure-Y-common", common->self_scm ()); + + SCM ga_scm = Grob_array::make_array (); + Grob_array *ga = unsmob_grob_array (ga_scm); + ga->set_array (relevant_elts); + me->set_object ("pure-relevant-elements", ga_scm); - common = common_refpoint_of_array (relevant_elts, me, Y_AXIS); - me->set_object ("common-refpoint-of-elements", common->self_scm ()); + return common; +} - SCM ga_scm = Grob_array::make_array (); - Grob_array *ga = unsmob_grob_array (ga_scm); - ga->set_array (relevant_elts); - me->set_object ("pure-relevant-elements", ga_scm); - } +MAKE_SCHEME_CALLBACK(Axis_group_interface,calc_x_common, 1); +SCM +Axis_group_interface::calc_x_common (SCM grob) +{ + Grob *me = unsmob_grob (grob); + + extract_grob_set (me, "elements", elts); + Grob *common = common_refpoint_of_array (elts, me, X_AXIS); + return common->self_scm (); +} + +MAKE_SCHEME_CALLBACK(Axis_group_interface,calc_y_common, 1); +SCM +Axis_group_interface::calc_y_common (SCM grob) +{ + Grob *me = unsmob_grob (grob); + + extract_grob_set (me, "elements", elts); + Grob *common = common_refpoint_of_array (elts, me, Y_AXIS); + return common->self_scm (); +} +SCM +Axis_group_interface::pure_group_height (Grob *me, int start, int end) +{ + Grob *common = calc_pure_elts_and_common (me); + extract_grob_set (me, "pure-relevant-elements", elts); Real my_coord = me->relative_coordinate (common, Y_AXIS); Interval r (relative_pure_height (me, elts, common, start, end, true)); @@ -398,6 +446,10 @@ add_grobs_of_one_priority (Skyline_pair *const skylines, elements[i]->set_property ("outside-staff-priority", SCM_BOOL_F); last_affected_position[dir] = b[X_AXIS][RIGHT]; } + + /* + Ugh: quadratic. --hwn + */ elements.erase (elements.begin () + i); } } @@ -425,7 +477,7 @@ Axis_group_interface::skyline_spacing (Grob *me, vector elements) SCM priority = elements[i]->get_property ("outside-staff-priority"); vector current_elts; current_elts.push_back (elements[i]); - while (i < elements.size () - 1 + while (i + 1 < elements.size () && scm_eq_p (elements[i+1]->get_property ("outside-staff-priority"), priority)) current_elts.push_back (elements[++i]); @@ -439,9 +491,11 @@ ADD_INTERFACE (Axis_group_interface, "An object that groups other layout objects.", /* properties */ + "X-common " + "Y-common " "axes " "elements " - "common-refpoint-of-elements " + "pure-Y-common " "pure-relevant-elements " "skylines " "cached-pure-extents " diff --git a/lily/balloon-engraver.cc b/lily/balloon-engraver.cc index 9db33d90d1..6239b9e31c 100644 --- a/lily/balloon-engraver.cc +++ b/lily/balloon-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ diff --git a/lily/balloon.cc b/lily/balloon.cc index 065d61c159..739fffcaf7 100644 --- a/lily/balloon.cc +++ b/lily/balloon.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "text-interface.hh" diff --git a/lily/bar-check-iterator.cc b/lily/bar-check-iterator.cc index 9f9f20fee0..fb3ebd341f 100644 --- a/lily/bar-check-iterator.cc +++ b/lily/bar-check-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #include "context.hh" diff --git a/lily/bar-engraver.cc b/lily/bar-engraver.cc index ce456c8963..57457c3777 100644 --- a/lily/bar-engraver.cc +++ b/lily/bar-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/lily/bar-line.cc b/lily/bar-line.cc index 840a1de15d..75dbc6c1be 100644 --- a/lily/bar-line.cc +++ b/lily/bar-line.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "bar-line.hh" @@ -78,37 +78,37 @@ Bar_line::compound_barline (Grob *me, string str, Real h, return thin; else if (str == "|." || (h == 0 && str == ":|")) { - m.add_at_edge (X_AXIS, LEFT, thick, 0, 0); - m.add_at_edge (X_AXIS, LEFT, thin, kern, 0); + m.add_at_edge (X_AXIS, LEFT, thick, 0); + m.add_at_edge (X_AXIS, LEFT, thin, kern); } else if (str == ".|" || (h == 0 && str == "|:")) { - m.add_at_edge (X_AXIS, RIGHT, thick, 0, 0); - m.add_at_edge (X_AXIS, RIGHT, thin, kern, 0); + m.add_at_edge (X_AXIS, RIGHT, thick, 0); + m.add_at_edge (X_AXIS, RIGHT, thin, kern); } else if (str == ":|") { - m.add_at_edge (X_AXIS, LEFT, thick, 0, 0); - m.add_at_edge (X_AXIS, LEFT, thin, kern, 0); - m.add_at_edge (X_AXIS, LEFT, colon, kern, 0); + m.add_at_edge (X_AXIS, LEFT, thick, 0); + m.add_at_edge (X_AXIS, LEFT, thin, kern); + m.add_at_edge (X_AXIS, LEFT, colon, kern); } else if (str == "|:") { - m.add_at_edge (X_AXIS, RIGHT, thick, 0, 0); - m.add_at_edge (X_AXIS, RIGHT, thin, kern, 0); - m.add_at_edge (X_AXIS, RIGHT, colon, kern, 0); + m.add_at_edge (X_AXIS, RIGHT, thick, 0); + m.add_at_edge (X_AXIS, RIGHT, thin, kern); + m.add_at_edge (X_AXIS, RIGHT, colon, kern); } else if (str == ":|:") { - m.add_at_edge (X_AXIS, LEFT, thick, thinkern, 0); - m.add_at_edge (X_AXIS, LEFT, colon, kern, 0); - m.add_at_edge (X_AXIS, RIGHT, thick, kern, 0); - m.add_at_edge (X_AXIS, RIGHT, colon, kern, 0); + m.add_at_edge (X_AXIS, LEFT, thick, thinkern); + m.add_at_edge (X_AXIS, LEFT, colon, kern); + m.add_at_edge (X_AXIS, RIGHT, thick, kern); + m.add_at_edge (X_AXIS, RIGHT, colon, kern); } else if (str == ".|.") { - m.add_at_edge (X_AXIS, LEFT, thick, thinkern, 0); - m.add_at_edge (X_AXIS, RIGHT, thick, kern, 0); + m.add_at_edge (X_AXIS, LEFT, thick, thinkern); + m.add_at_edge (X_AXIS, RIGHT, thick, kern); } else if (str == "||") { @@ -116,8 +116,8 @@ Bar_line::compound_barline (Grob *me, string str, Real h, should align to other side? this never appears on the system-start? */ - m.add_at_edge (X_AXIS, RIGHT, thin, 0, 0); - m.add_at_edge (X_AXIS, RIGHT, thin, thinkern, 0); + m.add_at_edge (X_AXIS, RIGHT, thin, 0); + m.add_at_edge (X_AXIS, RIGHT, thin, thinkern); } else if (str == ":") { diff --git a/lily/bar-number-engraver.cc b/lily/bar-number-engraver.cc index 88055cb0bb..f53cfd6f26 100644 --- a/lily/bar-number-engraver.cc +++ b/lily/bar-number-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "paper-column.hh" diff --git a/lily/beam-concave.cc b/lily/beam-concave.cc index ee351d0a26..e703f9e9f7 100644 --- a/lily/beam-concave.cc +++ b/lily/beam-concave.cc @@ -23,7 +23,7 @@ is_concave_single_notes (vector const &positions, Direction beam_dir) /* notes above and below the interval covered by 1st and last note. */ - for (vsize i = 1; i < positions.size () - 1; i++) + for (vsize i = 1; i + 1 < positions.size (); i++) { above = above || (positions[i] > covering[UP]); below = below || (positions[i] < covering[DOWN]); @@ -36,7 +36,7 @@ is_concave_single_notes (vector const &positions, Direction beam_dir) */ int dy = positions.back () - positions[0]; int closest = max (beam_dir * positions.back (), beam_dir * positions[0]); - for (vsize i = 2; !concave && i < positions.size () - 1; i++) + for (vsize i = 2; !concave && i + 1 < positions.size (); i++) { int inner_dy = positions[i] - positions[i - 1]; if (sign (inner_dy) != sign (dy) @@ -46,7 +46,7 @@ is_concave_single_notes (vector const &positions, Direction beam_dir) } bool all_closer = true; - for (vsize i = 1; all_closer && i < positions.size () - 1; i++) + for (vsize i = 1; all_closer && i + 1 < positions.size (); i++) { all_closer = all_closer && (beam_dir * positions[i] > closest); @@ -62,7 +62,7 @@ calc_positions_concaveness (vector const &positions, Direction beam_dir) Real dy = positions.back () - positions[0]; Real slope = dy / Real (positions.size () - 1); Real concaveness = 0.0; - for (vsize i = 1; i < positions.size () - 1; i++) + for (vsize i = 1; i + 1 < positions.size (); i++) { Real line_y = slope * i + positions[0]; @@ -96,17 +96,17 @@ Beam::calc_concaveness (SCM smob) Direction beam_dir = CENTER; for (vsize i = stems.size (); i--;) { - if (Stem::is_invisible (stems[i])) - stems.erase (stems.begin () + i); - else + if (Stem::is_normal_stem (stems[i])) { if (Direction dir = get_grob_direction (stems[i])) beam_dir = dir; } + else + stems.erase (stems.begin () + i); } if (stems.size () <= 2) - return SCM_UNSPECIFIED; + return scm_from_int (0); vector close_positions; vector far_positions; diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc index 53d1234547..51569b0e27 100644 --- a/lily/beam-engraver.cc +++ b/lily/beam-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "beam.hh" @@ -27,6 +27,7 @@ class Beam_engraver : public Engraver public: DECLARE_ACKNOWLEDGER (stem); DECLARE_ACKNOWLEDGER (rest); + protected: Stream_event *start_ev_; @@ -34,7 +35,7 @@ protected: Spanner *beam_; Stream_event *prev_start_ev_; - Stream_event *now_stop_ev_; + Stream_event *stop_ev_; Beaming_pattern *beam_info_; Beaming_pattern *finished_beam_info_; @@ -45,9 +46,9 @@ protected: /// moment (global time) where beam started. Moment beam_start_mom_; - bool subdivide_beams_; - Moment beat_length_; - + Beaming_options beaming_options_; + Beaming_options finished_beaming_options_; + void typeset_beam (); void set_melisma (bool); @@ -90,7 +91,7 @@ Beam_engraver::Beam_engraver () finished_beam_ = 0; finished_beam_info_ = 0; beam_info_ = 0; - now_stop_ev_ = 0; + stop_ev_ = 0; start_ev_ = 0; prev_start_ev_ = 0; } @@ -104,7 +105,7 @@ Beam_engraver::listen_beam (Stream_event *ev) if (d == START && valid_start_point ()) ASSIGN_EVENT_ONCE (start_ev_, ev); else if (d == STOP && valid_end_point ()) - ASSIGN_EVENT_ONCE (now_stop_ev_, ev); + ASSIGN_EVENT_ONCE (stop_ev_, ev); } void @@ -118,9 +119,6 @@ Beam_engraver::set_melisma (bool ml) void Beam_engraver::process_music () { - if (beam_ && !to_boolean (get_property ("allowBeamBreak"))) - context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T); - if (start_ev_) { if (beam_) @@ -137,9 +135,17 @@ Beam_engraver::process_music () beam_start_location_ = mp; beam_start_mom_ = now_mom (); + beaming_options_.from_context (context ()); beam_info_ = new Beaming_pattern; /* urg, must copy to Auto_beam_engraver too */ } + + typeset_beam (); + if (stop_ev_ && beam_) + { + announce_end_grob (beam_, stop_ev_->self_scm ()); + + } } void @@ -149,8 +155,8 @@ Beam_engraver::typeset_beam () { if (!finished_beam_->get_bound (RIGHT)) finished_beam_->set_bound (RIGHT, finished_beam_->get_bound (LEFT)); - - finished_beam_info_->beamify (context ()); + + finished_beam_info_->beamify (finished_beaming_options_); Beam::set_beaming (finished_beam_, finished_beam_info_); delete finished_beam_info_; @@ -173,13 +179,13 @@ Beam_engraver::start_translation_timestep () void Beam_engraver::stop_translation_timestep () { - typeset_beam (); - if (now_stop_ev_) + if (stop_ev_) { finished_beam_ = beam_; finished_beam_info_ = beam_info_; - - now_stop_ev_ = 0; + finished_beaming_options_ = beaming_options_; + + stop_ev_ = 0; beam_ = 0; beam_info_ = 0; typeset_beam (); @@ -321,7 +327,7 @@ Grace_beam_engraver::listen_beam (Stream_event *ev) if (d == START && valid_start_point ()) start_ev_ = ev; else if (d == STOP && valid_end_point ()) - now_stop_ev_ = ev; + stop_ev_ = ev; } @@ -340,7 +346,6 @@ ADD_TRANSLATOR (Grace_beam_engraver, /* read */ "beamMelismaBusy " "beatLength " - "allowBeamBreak " "subdivideBeams " , /* write */ ""); diff --git a/lily/beam-performer.cc b/lily/beam-performer.cc index 9ef23055fb..544dbfb3b1 100644 --- a/lily/beam-performer.cc +++ b/lily/beam-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Jan Nieuwenhuizen + (c) 1996--2007 Jan Nieuwenhuizen */ #include "performer.hh" diff --git a/lily/beam-quanting.cc b/lily/beam-quanting.cc index e150a51594..695cb80b6e 100644 --- a/lily/beam-quanting.cc +++ b/lily/beam-quanting.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -37,15 +37,17 @@ Beam_quant_parameters::fill (Grob *him) { SCM details = him->get_property ("details"); + /* + TODO: put in define-grobs.scm + */ INTER_QUANT_PENALTY = get_detail (details, ly_symbol2scm ("inter-quant-penalty"), 1000.0); SECONDARY_BEAM_DEMERIT = get_detail (details, ly_symbol2scm ("secondary-beam-demerit"), 10.0); STEM_LENGTH_DEMERIT_FACTOR = get_detail (details, ly_symbol2scm ("stem-length-demerit-factor"), 5); REGION_SIZE = get_detail (details, ly_symbol2scm ("region-size"), 2); BEAM_EPS = get_detail (details, ly_symbol2scm ("beam-eps"), 1e-3); - - // possibly ridiculous, but too short stems just won't do STEM_LENGTH_LIMIT_PENALTY = get_detail (details, ly_symbol2scm ("stem-length-limit-penalty"), 5000); DAMPING_DIRECTION_PENALTY = get_detail (details, ly_symbol2scm ("damping-direction-penalty"), 800); + HINT_DIRECTION_PENALTY = get_detail (details, ly_symbol2scm ("hint-direction-penalty"), 20); MUSICAL_DIRECTION_FACTOR = get_detail (details, ly_symbol2scm ("musical-direction-factor"), 400); IDEAL_SLOPE_FACTOR = get_detail (details, ly_symbol2scm ("ideal-slope-factor"), 10); ROUND_TO_ZERO_SLOPE = get_detail (details, ly_symbol2scm ("round-to-zero-slope"), 0.02); @@ -152,8 +154,8 @@ Beam::quanting (SCM smob, SCM posns) for (int a = 2; a--;) common[a] = common_refpoint_of_array (stems, me, Axis (a)); - Grob *fvs = first_visible_stem (me); - Grob *lvs = last_visible_stem (me); + Grob *fvs = first_normal_stem (me); + Grob *lvs = last_normal_stem (me); Real xl = fvs ? fvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0; Real xr = fvs ? lvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0; @@ -321,7 +323,7 @@ Beam::quanting (SCM smob, SCM posns) // debug quanting me->set_property ("quant-score", - scm_makfrom0str (qscores[best_idx].score_card_.c_str ())); + ly_string2scm (qscores[best_idx].score_card_)); } #endif @@ -401,10 +403,19 @@ Beam::score_slopes_dy (Real yl, Real yr, TODO: find a way to incorporate the complexity of the beam in this penalty. */ - if (fabs (dy / dx) > parameters->ROUND_TO_ZERO_SLOPE - && sign (dy_damp) != sign (dy)) - dem += parameters->DAMPING_DIRECTION_PENALTY; - + if (sign (dy_damp) != sign (dy)) + { + if (!dy) + { + if (fabs (dy_damp / dx) > parameters->ROUND_TO_ZERO_SLOPE) + dem += parameters->DAMPING_DIRECTION_PENALTY; + else + dem += parameters->HINT_DIRECTION_PENALTY; + } + else + dem += parameters->DAMPING_DIRECTION_PENALTY; + } + dem += parameters->MUSICAL_DIRECTION_FACTOR * max (0.0, (fabs (dy) - fabs (dy_mus))); diff --git a/lily/beam.cc b/lily/beam.cc index 77953070c9..ecc9d0b5a6 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -41,6 +41,7 @@ #include "staff-symbol-referencer.hh" #include "stem.hh" #include "warn.hh" +#include "grob-array.hh" #if DEBUG_BEAM_SCORING #include "text-interface.hh" // debug output. @@ -119,6 +120,21 @@ Beam::get_beam_count (Grob *me) return m; } +MAKE_SCHEME_CALLBACK (Beam, calc_normal_stems, 1); +SCM +Beam::calc_normal_stems (SCM smob) +{ + Grob *me = unsmob_grob (smob); + + extract_grob_set (me, "stems", stems); + SCM val = Grob_array::make_array (); + Grob_array *ga = unsmob_grob_array (val); + for (vsize i = 0; i < stems.size (); i++) + if (Stem::is_normal_stem (stems[i])) + ga->add (stems[i]); + + return val; +} MAKE_SCHEME_CALLBACK (Beam, calc_direction, 1); SCM @@ -135,7 +151,7 @@ Beam::calc_direction (SCM smob) Direction dir = CENTER; - int count = visible_stem_count (me); + int count = normal_stem_count (me); if (count < 2) { extract_grob_set (me, "stems", stems); @@ -148,7 +164,7 @@ Beam::calc_direction (SCM smob) } else { - Grob *stem = first_visible_stem (me); + Grob *stem = first_normal_stem (me); /* ugh: stems[0] case happens for chord tremolo. @@ -265,6 +281,9 @@ Beam::calc_beaming (SCM smob) } else { + /* + FIXME: what's this for? + */ SCM s = scm_cdr (this_beaming); for (; scm_is_pair (s); s = scm_cdr (s)) { @@ -298,7 +317,7 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common) { /* ugh, this has a side-effect that we need to ensure that Stem #'beaming is correct */ - (void) me_grob->get_property ("quantized-positions"); + (void) me_grob->get_property ("beaming"); Spanner *me = dynamic_cast (me_grob); @@ -390,7 +409,7 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common) bool inside_stem = (event_dir == LEFT) ? segs[j].stem_index_ > 0 - : segs[j].stem_index_ < stems.size () - 1; + : segs[j].stem_index_ + 1 < stems.size () ; bool event = on_bound || abs (segs[j].rank_ - segs[j+event_dir].rank_) > 1 @@ -460,10 +479,10 @@ Beam::print (SCM grob) vector segments = get_beam_segments (me, &commonx); Interval span; - if (visible_stem_count (me)) + if (normal_stem_count (me)) { - span[LEFT] = first_visible_stem (me)->relative_coordinate (commonx, X_AXIS); - span[RIGHT] = last_visible_stem (me)->relative_coordinate (commonx, X_AXIS); + span[LEFT] = first_normal_stem (me)->relative_coordinate (commonx, X_AXIS); + span[RIGHT] = last_normal_stem (me)->relative_coordinate (commonx, X_AXIS); } else { @@ -535,7 +554,7 @@ Beam::print (SCM grob) (me->layout ()->self_scm (), properties, quant_score)); if (!score.is_empty ()) - the_beam.add_at_edge (Y_AXIS, stem_dir, score, 1.0, 0); + the_beam.add_at_edge (Y_AXIS, stem_dir, score, 1.0); } #endif @@ -654,7 +673,7 @@ Beam::consider_auto_knees (Grob *me) gaps.set_full (); - extract_grob_set (me, "stems", stems); + extract_grob_set (me, "normal-stems", stems); Grob *common = common_refpoint_of_array (stems, me, Y_AXIS); Real staff_space = Staff_symbol_referencer::staff_space (me); @@ -663,8 +682,6 @@ Beam::consider_auto_knees (Grob *me) for (vsize i = 0; i < stems.size (); i++) { Grob *stem = stems[i]; - if (Stem::is_invisible (stem)) - continue; Interval head_extents = Stem::head_positions (stem); if (!head_extents.is_empty ()) @@ -724,9 +741,6 @@ Beam::consider_auto_knees (Grob *me) for (vsize i = 0; i < stems.size (); i++) { Grob *stem = stems[i]; - if (Stem::is_invisible (stem)) - continue; - Interval head_extents = head_extents_array[j++]; Direction d = (head_extents.center () < max_gap.center ()) @@ -789,7 +803,7 @@ Beam::calc_stem_shorten (SCM smob) return scm_from_int (0); Real forced_fraction = 1.0 * forced_stem_count (me) - / visible_stem_count (me); + / normal_stem_count (me); int beam_count = get_beam_count (me); @@ -825,27 +839,27 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns) Grob *me = unsmob_grob (smob); - int count = visible_stem_count (me); + int count = normal_stem_count (me); Interval pos (0,0); if (count < 1) return ly_interval2scm (pos); vector x_posns; - extract_grob_set (me, "stems", stems); + extract_grob_set (me, "normal-stems", stems); Grob *commonx = common_refpoint_of_array (stems, me, X_AXIS); Grob *commony = common_refpoint_of_array (stems, me, Y_AXIS); Real my_y = me->relative_coordinate (commony, Y_AXIS); - Grob *fvs = first_visible_stem (me); - Grob *lvs = last_visible_stem (me); + Grob *fvs = first_normal_stem (me); + Grob *lvs = last_normal_stem (me); Interval ideal (Stem::get_stem_info (fvs).ideal_y_ + fvs->relative_coordinate (commony, Y_AXIS) - my_y, Stem::get_stem_info (lvs).ideal_y_ + lvs->relative_coordinate (commony, Y_AXIS) - my_y); - Real x0 = first_visible_stem (me)->relative_coordinate (commonx, X_AXIS); + Real x0 = first_normal_stem (me)->relative_coordinate (commonx, X_AXIS); for (vsize i = 0; i < stems.size (); i++) { Grob *s = stems[i]; @@ -853,7 +867,7 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns) Real x = s->relative_coordinate (commonx, X_AXIS) - x0; x_posns.push_back (x); } - Real dx = last_visible_stem (me)->relative_coordinate (commonx, X_AXIS) - x0; + Real dx = last_normal_stem (me)->relative_coordinate (commonx, X_AXIS) - x0; Real y = 0; Real slope = 0; @@ -861,8 +875,8 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns) Real ldy = 0.0; if (!ideal.delta ()) { - Interval chord (Stem::chord_start_y (first_visible_stem (me)), - Stem::chord_start_y (last_visible_stem (me))); + Interval chord (Stem::chord_start_y (stems[0]), + Stem::chord_start_y (stems.back ())); /* Simple beams (2 stems) on middle line should be allowed to be slightly sloped. @@ -894,8 +908,6 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns) for (vsize i = 0; i < stems.size (); i++) { Grob *s = stems[i]; - if (Stem::is_invisible (s)) - continue; ideals.push_back (Offset (x_posns[i], Stem::get_stem_info (s).ideal_y_ + s->relative_coordinate (commony, Y_AXIS) @@ -941,7 +953,7 @@ Beam::shift_region_to_valid (SCM grob, SCM posns) Grob *commonx = common_refpoint_of_array (stems, me, X_AXIS); Grob *commony = common_refpoint_of_array (stems, me, Y_AXIS); - Grob *fvs = first_visible_stem (me); + Grob *fvs = first_normal_stem (me); if (!fvs) return posns; @@ -955,7 +967,7 @@ Beam::shift_region_to_valid (SCM grob, SCM posns) x_posns.push_back (x); } - Grob *lvs = last_visible_stem (me); + Grob *lvs = last_normal_stem (me); if (!lvs) return posns; @@ -1032,7 +1044,7 @@ Beam::slope_damping (SCM smob, SCM posns) Grob *me = unsmob_grob (smob); Drul_array pos = ly_scm2interval (posns); - if (visible_stem_count (me) <= 1) + if (normal_stem_count (me) <= 1) return posns; @@ -1052,13 +1064,13 @@ Beam::slope_damping (SCM smob, SCM posns) Real dy = pos[RIGHT] - pos[LEFT]; - Grob *fvs = first_visible_stem (me); - Grob *lvs = last_visible_stem (me); + Grob *fvs = first_normal_stem (me); + Grob *lvs = last_normal_stem (me); Grob *commonx = fvs->common_refpoint (lvs, X_AXIS); - Real dx = last_visible_stem (me)->relative_coordinate (commonx, X_AXIS) - - first_visible_stem (me)->relative_coordinate (commonx, X_AXIS); + Real dx = last_normal_stem (me)->relative_coordinate (commonx, X_AXIS) + - first_normal_stem (me)->relative_coordinate (commonx, X_AXIS); Real slope = dy && dx ? dy / dx : 0; @@ -1172,8 +1184,8 @@ Beam::set_stem_lengths (SCM smob) thick = get_thickness (me); } - Grob *fvs = first_visible_stem (me); - Grob *lvs = last_visible_stem (me); + Grob *fvs = first_normal_stem (me); + Grob *lvs = last_normal_stem (me); Real xl = fvs ? fvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0; Real xr = lvs ? lvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0; @@ -1225,7 +1237,7 @@ Beam::set_beaming (Grob *me, Beaming_pattern const *beaming) { int count = beaming->beamlet_count (i, d); if (i > 0 - && i < stems.size () -1 + && i + 1 < stems.size () && Stem::is_invisible (stem)) count = min (count, beaming->beamlet_count (i,-d)); @@ -1245,16 +1257,13 @@ Beam::set_beaming (Grob *me, Beaming_pattern const *beaming) int Beam::forced_stem_count (Grob *me) { - extract_grob_set (me, "stems", stems); + extract_grob_set (me, "normal-stems", stems); int f = 0; for (vsize i = 0; i < stems.size (); i++) { Grob *s = stems[i]; - if (Stem::is_invisible (s)) - continue; - /* I can imagine counting those boundaries as a half forced stem, but let's count them full for now. */ Direction defdir = to_dir (s->get_property ("default-direction")); @@ -1268,42 +1277,24 @@ Beam::forced_stem_count (Grob *me) } int -Beam::visible_stem_count (Grob *me) +Beam::normal_stem_count (Grob *me) { - extract_grob_set (me, "stems", stems); - int c = 0; - for (vsize i = stems.size (); i--;) - { - if (!Stem::is_invisible (stems[i])) - c++; - } - return c; + extract_grob_set (me, "normal-stems", stems); + return stems.size (); } Grob * -Beam::first_visible_stem (Grob *me) +Beam::first_normal_stem (Grob *me) { - extract_grob_set (me, "stems", stems); - - for (vsize i = 0; i < stems.size (); i++) - { - if (!Stem::is_invisible (stems[i])) - return stems[i]; - } - return 0; + extract_grob_set (me, "normal-stems", stems); + return stems.size () ? stems[0] : 0; } Grob * -Beam::last_visible_stem (Grob *me) +Beam::last_normal_stem (Grob *me) { - extract_grob_set (me, "stems", stems); - - for (vsize i = stems.size (); i--;) - { - if (!Stem::is_invisible (stems[i])) - return stems[i]; - } - return 0; + extract_grob_set (me, "normal-stems", stems); + return stems.size () ? stems.back () : 0; } /* @@ -1333,15 +1324,11 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) Grob *beam = unsmob_grob (stem->get_object ("beam")); if (!beam || !Beam::has_interface (beam) - || !Beam::visible_stem_count (beam)) + || !Beam::normal_stem_count (beam)) return scm_from_double (0.0); - Drul_array pos (0, 0); - SCM s = beam->get_property ("positions"); - if (scm_is_pair (s) && scm_is_number (scm_car (s))) - pos = ly_scm2interval (s); - else - programming_error ("positions property should always be pair of numbers."); + Drul_array pos (robust_scm2drul (beam->get_property ("positions"), + Drul_array (0,0))); Real staff_space = Staff_symbol_referencer::staff_space (rest); @@ -1349,8 +1336,8 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) Real dy = pos[RIGHT] - pos[LEFT]; - Drul_array visible_stems (first_visible_stem (beam), - last_visible_stem (beam)); + Drul_array visible_stems (first_normal_stem (beam), + last_normal_stem (beam)); extract_grob_set (beam, "stems", stems); Grob *common = common_refpoint_of_array (stems, beam, X_AXIS); @@ -1377,6 +1364,11 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) Real beam_y = stem_y - d * height_of_my_beams; Grob *common_y = rest->common_refpoint (beam, Y_AXIS); + + /* + TODO: this is dubious, because this call needs the info we're + computing right now. + */ Interval rest_extent = rest->extent (common_y, Y_AXIS); rest_extent.translate (offset); @@ -1385,7 +1377,7 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) = staff_space * (robust_scm2double (stem->get_property ("stemlet-length"), 0.0) + robust_scm2double (rest->get_property ("minimum-distance"), 0.0)); - Real shift = d * min (((beam_y - d * minimum_distance) - rest_dim) * d, 0.0); + Real shift = d * min (d * (beam_y - d * minimum_distance - rest_dim), 0.0); shift /= staff_space; Real rad = Staff_symbol_referencer::line_count (rest) * staff_space / 2; @@ -1400,7 +1392,7 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) < rad) shift = ceil (fabs (shift)) * sign (shift); - return scm_from_double (staff_space * shift); + return scm_from_double (offset + staff_space * shift); } bool @@ -1475,6 +1467,7 @@ ADD_INTERFACE (Beam, "length-fraction " "least-squares-dy " "neutral-direction " + "normal-stems " "positions " "quant-score " "quantized-positions " diff --git a/lily/beaming-pattern.cc b/lily/beaming-pattern.cc index 092c6b673d..ba5b8a4a72 100644 --- a/lily/beaming-pattern.cc +++ b/lily/beaming-pattern.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "beaming-pattern.hh" @@ -116,28 +116,24 @@ Beaming_pattern::de_grace () } void -Beaming_pattern::beamify (Context *context) +Beaming_pattern::beamify (Beaming_options const &options) { if (infos_.size () <= 1) return; if (infos_[0].start_moment_.grace_part_) de_grace (); - - bool subdivide_beams = to_boolean (context->get_property ("subdivideBeams")); - Moment beat_length = robust_scm2moment (context->get_property ("beatLength"), Moment (1, 4)); - Moment measure_length = robust_scm2moment (context->get_property ("measureLength"), Moment (1, 4)); if (infos_[0].start_moment_ < Moment (0)) for (vsize i = 0; i < infos_.size(); i++) - infos_[i].start_moment_ += measure_length; + infos_[i].start_moment_ += options.measure_length_; - SCM grouping = context->get_property ("beatGrouping"); Moment measure_pos (0); vector group_starts; vector beat_starts; - + + SCM grouping = options.grouping_; while (measure_pos <= infos_.back().start_moment_) { int count = 2; @@ -150,29 +146,32 @@ Beaming_pattern::beamify (Context *context) group_starts.push_back (measure_pos); for (int i = 0; i < count; i++) { - beat_starts.push_back (measure_pos + beat_length * i); + beat_starts.push_back (measure_pos + options.beat_length_ * i); } - measure_pos += beat_length * count; + measure_pos += options.beat_length_ * count; } vsize j = 0; vsize k = 0; for (vsize i = 0; i < infos_.size(); i++) { - while (j < group_starts.size() - 1 + while (j + 1 < group_starts.size() && group_starts[j+1] <= infos_[i].start_moment_) j++; - infos_[i].group_start_ = group_starts[j]; - infos_[i].beat_length_ = beat_length; - while (k < beat_starts.size() - 1 + if (j < group_starts.size ()) + infos_[i].group_start_ = group_starts[j]; + + infos_[i].beat_length_ = options.beat_length_; + while (k + 1 < beat_starts.size() && beat_starts[k+1] <= infos_[i].start_moment_) k++; - infos_[i].beat_start_ = beat_starts[k]; + if (k < beat_starts.size()) + infos_[i].beat_start_ = beat_starts[k]; } - beamify (subdivide_beams); + beamify (options.subdivide_beams_); } @@ -234,3 +233,18 @@ Beaming_pattern::beamlet_count (int i, Direction d) const { return infos_.at (i).beam_count_drul_[d]; } + +void +Beaming_options::from_context (Context *context) +{ + grouping_ = context->get_property ("beatGrouping"); + subdivide_beams_ = to_boolean (context->get_property ("subdivideBeams")); + beat_length_ = robust_scm2moment (context->get_property ("beatLength"), Moment (1, 4)); + measure_length_ = robust_scm2moment (context->get_property ("measureLength"), Moment (1, 4)); +} + +Beaming_options::Beaming_options () +{ + grouping_ = SCM_EOL; + subdivide_beams_ = false; +} diff --git a/lily/bend-engraver.cc b/lily/bend-engraver.cc new file mode 100644 index 0000000000..4287084c1e --- /dev/null +++ b/lily/bend-engraver.cc @@ -0,0 +1,116 @@ +/* + bend-engraver.cc -- implement Bend_engraver + + (c) 2006--2007 Han-Wen Nienhuys + + +*/ + +#include "engraver.hh" +#include "item.hh" +#include "moment.hh" +#include "spanner.hh" +#include "stream-event.hh" + +#include "translator.icc" + +class Bend_engraver : public Engraver +{ +public: + TRANSLATOR_DECLARATIONS (Bend_engraver); + DECLARE_ACKNOWLEDGER (note_head); + +protected: + DECLARE_TRANSLATOR_LISTENER (bend_after); + void process_music (); + void stop_translation_timestep (); + void start_translation_timestep (); + void stop_fall (); + +private: + Moment stop_moment_; + Stream_event *fall_event_; + Spanner *fall_; + Grob *note_head_; +}; + +void +Bend_engraver::stop_fall () +{ + bool bar = scm_is_string (get_property ("whichBar")); + + + fall_->set_bound (RIGHT, unsmob_grob (bar + ? get_property ("currentCommandColumn") + : get_property ("currentMusicalColumn"))); + fall_ = 0; + note_head_ = 0; + fall_event_ = 0; +} + +void +Bend_engraver::stop_translation_timestep () +{ + if (fall_ && !fall_->get_bound (LEFT)) + { + fall_->set_bound (LEFT, note_head_); + fall_->set_parent (note_head_, Y_AXIS); + } +} + +void +Bend_engraver::start_translation_timestep () +{ + if (fall_ && now_mom ().main_part_ >= stop_moment_.main_part_) + { + stop_fall (); + } +} + +void +Bend_engraver::acknowledge_note_head (Grob_info info) +{ + if (!fall_event_) + return; + + if (note_head_ && fall_) + { + stop_fall (); + } + + note_head_ = info.grob (); + stop_moment_ = now_mom () + get_event_length (info.event_cause ()); +} + +Bend_engraver::Bend_engraver () +{ + fall_ = 0; + note_head_ = 0; + fall_event_ = 0; +} + +IMPLEMENT_TRANSLATOR_LISTENER (Bend_engraver, bend_after); +void +Bend_engraver::listen_bend_after (Stream_event *ev) +{ + ASSIGN_EVENT_ONCE (fall_event_, ev); +} + +void +Bend_engraver::process_music () +{ + if (fall_event_ && !fall_) + { + fall_ = make_spanner ("BendAfter", fall_event_->self_scm ()); + fall_->set_property ("delta-position", + scm_from_double (robust_scm2double (fall_event_->get_property ("delta-step"), 0))); + } +} + +ADD_ACKNOWLEDGER (Bend_engraver, note_head); + +ADD_TRANSLATOR (Bend_engraver, + /* doc */ "Create fall spanners.", + /* create */ "BendAfter", + /* read */ "", + /* write */ ""); diff --git a/lily/bezier-bow.cc b/lily/bezier-bow.cc index d9510704ee..ccb27d58ea 100644 --- a/lily/bezier-bow.cc +++ b/lily/bezier-bow.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #include "misc.hh" diff --git a/lily/bezier.cc b/lily/bezier.cc index 77f3949992..1808821029 100644 --- a/lily/bezier.cc +++ b/lily/bezier.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #include "bezier.hh" @@ -14,21 +14,6 @@ Real binomial_coefficient_3[] = { 1, 3, 3, 1 }; -Real -binomial_coefficient (Real over, int under) -{ - Real x = 1.0; - - while (under) - { - x *= over / Real (under); - - over -= 1.0; - under--; - } - return x; -} - void scale (vector *array, Real x, Real y) { diff --git a/lily/book-scheme.cc b/lily/book-scheme.cc index 750917187f..23237dbb0d 100644 --- a/lily/book-scheme.cc +++ b/lily/book-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "book.hh" @@ -64,3 +64,33 @@ LY_DEFINE (ly_parser_print_book, "ly:book-process", return SCM_UNSPECIFIED; } + +LY_DEFINE (ly_parser_print_book_to_systems, "ly:book-process-to-systems", + 4, 0, 0, (SCM book_smob, + SCM default_paper, + SCM default_layout, + SCM output), + "Print book. @var{output} is passed to the backend unchanged. " + "Eg. it may be " + "a string (for file based outputs) or a socket (for network based " + "output).") +{ + Book *book = unsmob_book (book_smob); + + SCM_ASSERT_TYPE (book, book_smob, SCM_ARG1, __FUNCTION__, "Book"); + SCM_ASSERT_TYPE (unsmob_output_def (default_paper), + default_layout, SCM_ARG2, __FUNCTION__, "\\paper block"); + SCM_ASSERT_TYPE (unsmob_output_def (default_layout), + default_layout, SCM_ARG3, __FUNCTION__, "\\layout block"); + + Paper_book *pb = book->process (unsmob_output_def (default_paper), + unsmob_output_def (default_layout)); + if (pb) + { + pb->classic_output (output); + pb->unprotect (); + } + + return SCM_UNSPECIFIED; +} + diff --git a/lily/book.cc b/lily/book.cc index 44f7ee4ef9..f4d4dd790e 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "book.hh" @@ -11,7 +11,6 @@ #include using namespace std; -#include "lilypond-key.hh" #include "main.hh" #include "music.hh" #include "output-def.hh" @@ -44,13 +43,17 @@ Book::Book (Book const &s) smobify_self (); if (s.paper_) - paper_ = s.paper_->clone (); + { + paper_ = s.paper_->clone (); + paper_->unprotect (); + } input_location_ = make_input (*s.origin ()); + header_ = ly_make_anonymous_module (false); if (ly_is_module (s.header_)) ly_module_copy (header_, s.header_); - + SCM *t = &scores_; for (SCM p = s.scores_; scm_is_pair (p); p = scm_cdr (p)) { @@ -126,9 +129,6 @@ Book::process (Output_def *default_paper, Real scale = scm_to_double (paper->c_variable ("output-scale")); Output_def *scaled_bookdef = scale_output_def (paper, scale); - Object_key *key = new Lilypond_general_key (0, user_key_, 0); - SCM scm_key = key->unprotect (); - paper_book->paper_ = scaled_bookdef; scaled_bookdef->unprotect (); @@ -140,7 +140,7 @@ Book::process (Output_def *default_paper, if (Score *score = unsmob_score (scm_car (s))) { SCM outputs = score - ->book_rendering (paper_book->paper_, default_layout, key); + ->book_rendering (paper_book->paper_, default_layout); while (scm_is_pair (outputs)) { @@ -164,7 +164,6 @@ Book::process (Output_def *default_paper, assert (0); } - scm_remember_upto_here_1 (scm_key); return paper_book; } diff --git a/lily/box.cc b/lily/box.cc index 93356ac482..e44f166dbc 100644 --- a/lily/box.cc +++ b/lily/box.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #include "box.hh" diff --git a/lily/break-align-engraver.cc b/lily/break-align-engraver.cc index dcce285bdf..899fee3c61 100644 --- a/lily/break-align-engraver.cc +++ b/lily/break-align-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "engraver.hh" #include "protected-scm.hh" diff --git a/lily/break-alignment-interface.cc b/lily/break-alignment-interface.cc index 37eae38297..61eca90ab6 100644 --- a/lily/break-alignment-interface.cc +++ b/lily/break-alignment-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ @@ -21,22 +21,6 @@ #include "warn.hh" -MAKE_SCHEME_CALLBACK (Break_alignment_interface, self_align_callback, 1); -SCM -Break_alignment_interface::self_align_callback (SCM smob) -{ - Grob *me = unsmob_grob (smob); - - Item *item = dynamic_cast (me); - Direction bsd = item->break_status_dir (); - if (bsd == LEFT) - me->set_property ("self-alignment-X", scm_from_int (RIGHT)); - - /* - Force break alignment itself to be done first, in the case - */ - return Self_alignment_interface::aligned_on_self (me, X_AXIS); -} /* This is tricky: we cannot modify 'elements, since callers are @@ -233,7 +217,7 @@ Break_alignment_interface::calc_positioning_done (SCM smob) else { extra_right_space = distance; - if (idx < offsets.size() - 1) + if (idx + 1 < offsets.size ()) offsets[idx+1] = extents[idx][RIGHT] + distance; } diff --git a/lily/break-substitution.cc b/lily/break-substitution.cc index 4885c6ed72..f283010303 100644 --- a/lily/break-substitution.cc +++ b/lily/break-substitution.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #include diff --git a/lily/breathing-sign-engraver.cc b/lily/breathing-sign-engraver.cc index f24d85541f..02d4c0942d 100644 --- a/lily/breathing-sign-engraver.cc +++ b/lily/breathing-sign-engraver.cc @@ -1,7 +1,7 @@ /* breathing_sign-engraver.cc -- implement Breathing_sign_engraver - (c) 1999--2006 Michael Krause + (c) 1999--2007 Michael Krause written for the GNU LilyPond music typesetter diff --git a/lily/breathing-sign.cc b/lily/breathing-sign.cc index d0acbcea05..3c32a766d2 100644 --- a/lily/breathing-sign.cc +++ b/lily/breathing-sign.cc @@ -1,13 +1,13 @@ /* breathing_sign.cc -- implement Breathing_sign - (c) 1999--2006 Michael Krause + (c) 1999--2007 Michael Krause written for the GNU LilyPond music typesetter TODO: --> see breathing-sign-engraver.cc - Extensions for ancient notation (c) 2003--2006 by Juergen Reuter + Extensions for ancient notation (c) 2003--2007 by Juergen Reuter */ #include "breathing-sign.hh" @@ -41,14 +41,9 @@ Breathing_sign::divisio_minima (SCM smob) { Grob *me = unsmob_grob (smob); Real staff_space = Staff_symbol_referencer::staff_space (me); - Real staff_size; Real thickness = Staff_symbol_referencer::line_thickness (me); thickness *= robust_scm2double (me->get_property ("thickness"), 1.0); - if (Staff_symbol_referencer::get_staff_symbol (me)) - staff_size = (Staff_symbol_referencer::line_count (me) - 1) * staff_space; - else - staff_size = 0.0; Real blotdiameter = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter")); diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc index ec7efd9fcc..274e3ec390 100644 --- a/lily/chord-name-engraver.cc +++ b/lily/chord-name-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #include "chord-name.hh" diff --git a/lily/chord-name.cc b/lily/chord-name.cc index 959898e3a7..8ff3ffe763 100644 --- a/lily/chord-name.cc +++ b/lily/chord-name.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Jan Nieuwenhuizen + (c) 1999--2007 Jan Nieuwenhuizen */ #include "chord-name.hh" diff --git a/lily/chord-tremolo-engraver.cc b/lily/chord-tremolo-engraver.cc index bd380facc7..805cb52554 100644 --- a/lily/chord-tremolo-engraver.cc +++ b/lily/chord-tremolo-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys Erik Sandberg */ @@ -108,6 +108,7 @@ Chord_tremolo_engraver::finalize () if (beam_) { repeat_->origin ()->warning (_ ("unterminated chord tremolo")); + announce_end_grob (beam_, SCM_EOL); beam_->suicide (); } } @@ -125,8 +126,11 @@ Chord_tremolo_engraver::acknowledge_stem (Grob_info info) beam_->set_property ("gap-count", scm_from_int (flags_ - expected_beam_count_)); if (beam_dir_ == RIGHT) - beam_dir_ = LEFT; - + { + beam_dir_ = LEFT; + announce_end_grob (beam_, s->self_scm ()); + } + if (info.ultimate_event_cause ()->in_event_class ("rhythmic-event")) Beam::add_stem (beam_, s); else diff --git a/lily/chord-tremolo-iterator.cc b/lily/chord-tremolo-iterator.cc index 45ddbc443d..05e56e24a5 100644 --- a/lily/chord-tremolo-iterator.cc +++ b/lily/chord-tremolo-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys Erik Sandberg */ @@ -29,7 +29,9 @@ Chord_tremolo_iterator::get_music_list () const int elt_count = body_is_sequential ? scm_ilength (body->get_property ("elements")) : 1; - if (body_is_sequential && elt_count != 2) + if (body_is_sequential && + (elt_count != 2 + && elt_count != 1)) mus->origin ()->warning (_f ("expect 2 elements for chord tremolo, found %d", elt_count)); if (elt_count <= 0) diff --git a/lily/clef-engraver.cc b/lily/clef-engraver.cc index 258b047397..d9b2e27dea 100644 --- a/lily/clef-engraver.cc +++ b/lily/clef-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys , + (c) 1997--2007 Han-Wen Nienhuys , Mats Bengtsson */ diff --git a/lily/clef.cc b/lily/clef.cc index 36427055f5..90b5480087 100644 --- a/lily/clef.cc +++ b/lily/clef.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "clef.hh" @@ -31,7 +31,7 @@ Clef::calc_glyph_name (SCM smob) str += "_change"; } - return scm_makfrom0str (str.c_str ()); + return ly_string2scm (str); } s->suicide (); diff --git a/lily/cluster-engraver.cc b/lily/cluster-engraver.cc index c1cb5a4025..e5ed481f6a 100644 --- a/lily/cluster-engraver.cc +++ b/lily/cluster-engraver.cc @@ -1,7 +1,7 @@ /* cluster-engraver.cc -- implement Cluster_engraver - (c) 2002--2006 Juergen Reuter + (c) 2002--2007 Juergen Reuter Han-Wen Nienhuys */ @@ -122,8 +122,11 @@ Cluster_spanner_engraver::acknowledge_note_column (Grob_info info) ADD_ACKNOWLEDGER (Cluster_spanner_engraver, note_column); ADD_TRANSLATOR (Cluster_spanner_engraver, - /* doc */ "Engraves a cluster using Spanner notation ", - /* create */ "ClusterSpanner ClusterSpannerBeacon", + /* doc */ + "Engraves a cluster using Spanner notation ", + /* create */ + "ClusterSpanner " + "ClusterSpannerBeacon ", /* read */ "", /* write */ ""); diff --git a/lily/cluster.cc b/lily/cluster.cc index 90c2adcf50..54b45ab862 100644 --- a/lily/cluster.cc +++ b/lily/cluster.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Juergen Reuter + (c) 2002--2007 Juergen Reuter Han-Wen Nienhuys */ @@ -164,32 +164,22 @@ Cluster::print (SCM smob) /* Across a line break we anticipate on the next pitches. */ - if (spanner->original ()) + if (Spanner *next = spanner->broken_neighbor (RIGHT)) { - Spanner *orig = dynamic_cast (spanner->original ()); - - if (spanner->get_break_index () < orig->broken_intos_.size () - 1) + extract_grob_set (next, "columns", next_cols); + if (next_cols.size () > 0) { - Spanner *next = orig->broken_intos_[spanner->get_break_index () + 1]; - vector const &next_cols = extract_grob_array (next, "columns"); - if (next_cols.size () > 0) - { - Grob *next_commony = common_refpoint_of_array (next_cols, next, Y_AXIS); - Grob *col = next_cols[0]; - - Interval v = col->extent (next_commony, Y_AXIS); - Real x = right_bound->relative_coordinate (commonx, X_AXIS) - left_coord; - - bottom_points.insert (bottom_points.begin (), - Offset (x, v[DOWN])); - top_points.insert (top_points.begin (), Offset (x, v[UP])); - } + Grob *next_commony = common_refpoint_of_array (next_cols, next, Y_AXIS); + Grob *col = next_cols[0]; + + Interval v = col->extent (next_commony, Y_AXIS); + Real x = right_bound->relative_coordinate (commonx, X_AXIS) - left_coord; + + bottom_points.push_back (Offset (x, v[DOWN])); + top_points.push_back (Offset (x, v[UP])); } } - reverse (bottom_points); - reverse (top_points); - Stencil out = brew_cluster_piece (me, bottom_points, top_points); out.translate_axis (- me->relative_coordinate (commony, Y_AXIS), Y_AXIS); return out.smobbed_copy (); @@ -203,9 +193,12 @@ ADD_INTERFACE (Cluster, "The property @code{style} controls the shape of cluster segments. Valid values " "include @code{leftsided-stairs}, @code{rightsided-stairs}, @code{centered-stairs}, " "and @code{ramp}.\n", + + /* props */ "style " "padding " - "columns "); + "columns " + ); struct Cluster_beacon { diff --git a/lily/coherent-ligature-engraver.cc b/lily/coherent-ligature-engraver.cc index 198b954b98..004cf8d78e 100644 --- a/lily/coherent-ligature-engraver.cc +++ b/lily/coherent-ligature-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Juergen Reuter + (c) 2003--2007 Juergen Reuter */ #include "coherent-ligature-engraver.hh" diff --git a/lily/collision-engraver.cc b/lily/collision-engraver.cc index 43974170de..7bff5a8cd4 100644 --- a/lily/collision-engraver.cc +++ b/lily/collision-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/column-x-positions.cc b/lily/column-x-positions.cc index 51eebbed23..52a95d65dd 100644 --- a/lily/column-x-positions.cc +++ b/lily/column-x-positions.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "column-x-positions.hh" diff --git a/lily/completion-note-heads-engraver.cc b/lily/completion-note-heads-engraver.cc index 66e31aaf52..cb44715286 100644 --- a/lily/completion-note-heads-engraver.cc +++ b/lily/completion-note-heads-engraver.cc @@ -1,7 +1,7 @@ /* completion-note-heads-engraver.cc -- Completion_heads_engraver - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include diff --git a/lily/constrained-breaking.cc b/lily/constrained-breaking.cc index d01bc2ab2e..a4f3ac4b57 100644 --- a/lily/constrained-breaking.cc +++ b/lily/constrained-breaking.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #include "constrained-breaking.hh" @@ -322,20 +322,23 @@ Constrained_breaking::initialize () Output_def *l = pscore_->layout (); System *sys = pscore_->root_system (); - Real padding = robust_scm2double (l->c_variable ("page-breaking-between-system-padding"), 0); Real space = robust_scm2double (l->c_variable ("ideal-system-space"), 0); + SCM padding_scm = l->c_variable ("page-breaking-between-system-padding"); + if (!scm_is_number (padding_scm)) + padding_scm = l->c_variable ("between-system-padding"); + Real padding = robust_scm2double (padding_scm, 0.0); Interval first_line = line_dimensions_int (pscore_->layout (), 0); Interval other_lines = line_dimensions_int (pscore_->layout (), 1); /* do all the rod/spring problems */ breaks_ = pscore_->find_break_indices (); - all_ = pscore_->root_system ()->columns (); + all_ = pscore_->root_system ()->used_columns (); lines_.resize (breaks_.size (), breaks_.size (), Line_details ()); vector forces = get_line_forces (all_, other_lines.length (), other_lines.length () - first_line.length (), ragged_right_); - for (vsize i = 0; i < breaks_.size () - 1; i++) + for (vsize i = 0; i + 1 < breaks_.size (); i++) { Real max_ext = 0; for (vsize j = i + 1; j < breaks_.size (); j++) @@ -373,7 +376,7 @@ Constrained_breaking::initialize () for (vsize i = 0; i < start_.size (); i++) { vsize j; - for (j = 0; j < breaks_.size () - 1 && breaks_[j] < start_[i]; j++) + for (j = 0; j + 1 < breaks_.size () && breaks_[j] < start_[i]; j++) ; starting_breakpoints_.push_back (j); start_[i] = breaks_[j]; diff --git a/lily/context-def.cc b/lily/context-def.cc index c3a2a6c293..a5c13305d4 100644 --- a/lily/context-def.cc +++ b/lily/context-def.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ /* TODO: should junk this class an replace by @@ -261,9 +261,9 @@ Context_def::get_translator_names (SCM user_mod) const } Context * -Context_def::instantiate (SCM ops, Object_key const *key) +Context_def::instantiate (SCM ops) { - Context *context = new Context (key); + Context *context = new Context (); context->definition_ = self_scm (); context->definition_mods_ = ops; diff --git a/lily/context-handle.cc b/lily/context-handle.cc index 80aa6a1a2f..065a74f2d4 100644 --- a/lily/context-handle.cc +++ b/lily/context-handle.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "context-handle.hh" diff --git a/lily/context-key-manager.cc b/lily/context-key-manager.cc deleted file mode 100644 index 2f1fbe310b..0000000000 --- a/lily/context-key-manager.cc +++ /dev/null @@ -1,100 +0,0 @@ -/* - context-key-manager.cc -- implement Context_key_manager - - source file of the GNU LilyPond music typesetter - - (c) 2006 Han-Wen Nienhuys - -*/ - -#include "context-key-manager.hh" -#include "object-key.hh" -#include "lilypond-key.hh" -#include "main.hh" - -Context_key_manager::Context_key_manager (Object_key const *key) -{ - key_ = key; -} - -void -Context_key_manager::unprotect () const -{ - if (key_) - ((Object_key *)key_)->unprotect (); -} - - -Object_key const * -Context_key_manager::get_context_key (Moment now, string type, string id) -{ - if (!use_object_keys) - return 0; - - string now_key = type + "@" + id; - - int disambiguation_count = 0; - if (context_counts_.find (now_key) != context_counts_.end ()) - disambiguation_count = context_counts_[now_key]; - - context_counts_[now_key] = disambiguation_count + 1; - - return new Lilypond_context_key (key (), - now, - type, id, - disambiguation_count); -} - - -Object_key const * -Context_key_manager::get_grob_key (Moment m, string name) -{ - if (!use_object_keys) - return 0; - - return create_grob_key (m, name); -} - -/* - We want to have a key for some objects anyway, so we can invent a - unique identifier for each (book,score) tuple. -*/ -Object_key const * -Context_key_manager::create_grob_key (Moment now, string name) -{ - int disambiguation_count = 0; - if (grob_counts_.find (name) != grob_counts_.end ()) - disambiguation_count = grob_counts_[name]; - grob_counts_[name] = disambiguation_count + 1; - - Object_key *k = new Lilypond_grob_key (key (), - now, - name, - disambiguation_count); - - return k; -} - -void -Context_key_manager::gc_mark () const -{ - if (key_) - scm_gc_mark (key_->self_scm ()); - -} - -void -Context_key_manager::clear () -{ - if (!use_object_keys) - return; - - grob_counts_.clear (); - context_counts_.clear (); -} - -Context_key_manager::Context_key_manager (Context_key_manager const &src) -{ - (void)src; - assert (false); -} diff --git a/lily/context-property.cc b/lily/context-property.cc index 9496518a23..d2210b3e10 100644 --- a/lily/context-property.cc +++ b/lily/context-property.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "context.hh" diff --git a/lily/context-scheme.cc b/lily/context-scheme.cc index 9827c8bd41..a6ee973a1c 100644 --- a/lily/context-scheme.cc +++ b/lily/context-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ @@ -20,7 +20,7 @@ LY_DEFINE (ly_context_id, "ly:context-id", Context *tr = unsmob_context (context); SCM_ASSERT_TYPE (tr, context, SCM_ARG1, __FUNCTION__, "Context"); - return scm_makfrom0str (tr->id_string ().c_str ()); + return ly_string2scm (tr->id_string ()); } LY_DEFINE (ly_context_name, "ly:context-name", diff --git a/lily/context-specced-music-iterator.cc b/lily/context-specced-music-iterator.cc index 59b3ba907c..fc4f35d666 100644 --- a/lily/context-specced-music-iterator.cc +++ b/lily/context-specced-music-iterator.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "music-wrapper-iterator.hh" diff --git a/lily/context.cc b/lily/context.cc index 45a1562b1f..7e5ea8ae2a 100644 --- a/lily/context.cc +++ b/lily/context.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "context.hh" @@ -47,8 +47,8 @@ Context::check_removal () } Context::Context (Context const &src) - : key_manager_ (src.key_manager_) { + (void) src; assert (false); } @@ -69,8 +69,7 @@ Context::add_context (Context *child) } -Context::Context (Object_key const *key) - : key_manager_ (key) +Context::Context () { daddy_context_ = 0; aliases_ = SCM_EOL; @@ -92,12 +91,6 @@ Context::Context (Object_key const *key) event_source_->unprotect (); events_below_ = new Dispatcher (); events_below_->unprotect (); - - /* - UGH UGH - const correctness. - */ - key_manager_.unprotect(); } /* TODO: this shares code with find_create_context (). */ @@ -267,7 +260,6 @@ Context::create_context_from_event (SCM sev) SCM ops = ev->get_property ("ops"); SCM type_scm = ev->get_property ("type"); string type = ly_symbol2string (type_scm); - Object_key const *key = key_manager_.get_context_key (now_mom(), type, id); vector path = unsmob_context_def (definition_)->path_to_acceptable_context (type_scm, get_output_def ()); @@ -278,7 +270,7 @@ Context::create_context_from_event (SCM sev) } Context_def *cdef = path[0]; - Context *new_context = cdef->instantiate (ops, key); + Context *new_context = cdef->instantiate (ops); new_context->id_string_ = id; @@ -337,7 +329,7 @@ Context::create_context (Context_def *cdef, send_stream_event (this, "CreateContext", 0, ly_symbol2scm ("ops"), ops, ly_symbol2scm ("type"), cdef->get_context_name (), - ly_symbol2scm ("id"), scm_makfrom0str (id.c_str ())); + ly_symbol2scm ("id"), ly_string2scm (id)); event_source_-> remove_listener (GET_LISTENER (acknowledge_infant), ly_symbol2scm ("AnnounceNewContext")); @@ -469,18 +461,8 @@ Context::add_alias (SCM sym) } void -Context::internal_set_property (SCM sym, SCM val -#ifndef NDEBUG - , char const *file, int line, char const *fun -#endif - ) +Context::internal_set_property (SCM sym, SCM val) { -#ifndef NDEBUG - (void) file; - (void) line; - (void) fun; -#endif - if (do_internal_type_checking_global) assert (type_check_assignment (sym, val, ly_symbol2scm ("translation-type?"))); @@ -629,23 +611,10 @@ Context::print_smob (SCM s, SCM port, scm_print_state *) return 1; } -Object_key const * -Context::get_grob_key (string name) -{ - return key_manager_.get_grob_key (now_mom (), name); -} - -Object_key const * -Context::get_context_key (string name, string id) -{ - return key_manager_.get_context_key (now_mom (), name, id); -} - SCM Context::mark_smob (SCM sm) { Context *me = (Context *) SCM_CELL_WORD_1 (sm); - me->key_manager_.gc_mark(); scm_gc_mark (me->context_list_); scm_gc_mark (me->aliases_); @@ -689,17 +658,6 @@ Context::get_parent_context () const return daddy_context_; } -void -Context::clear_key_disambiguations () -{ - if (!use_object_keys) - return; - - key_manager_.clear (); - for (SCM s = context_list_; scm_is_pair (s); s = scm_cdr (s)) - unsmob_context (scm_car (s))->clear_key_disambiguations (); -} - /* Ugh. Where to put this? */ diff --git a/lily/custos-engraver.cc b/lily/custos-engraver.cc index 847c552566..94bc4910ce 100644 --- a/lily/custos-engraver.cc +++ b/lily/custos-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Juergen Reuter , + (c) 2000--2007 Juergen Reuter , Han-Wen Nienhuys */ diff --git a/lily/custos.cc b/lily/custos.cc index 7a3c09bbfa..3ed96f6a99 100644 --- a/lily/custos.cc +++ b/lily/custos.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Juergen Reuter + (c) 2000--2007 Juergen Reuter */ /* TODO: diff --git a/lily/default-bar-line-engraver.cc b/lily/default-bar-line-engraver.cc index 4e65fe6c83..d96110e87b 100644 --- a/lily/default-bar-line-engraver.cc +++ b/lily/default-bar-line-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/dimension-cache.cc b/lily/dimension-cache.cc index 1a98ab2a43..d129093936 100644 --- a/lily/dimension-cache.cc +++ b/lily/dimension-cache.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ diff --git a/lily/dimensions-scheme.cc b/lily/dimensions-scheme.cc index 106eb05c23..0d6ed607f7 100644 --- a/lily/dimensions-scheme.cc +++ b/lily/dimensions-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "lily-guile.hh" diff --git a/lily/directional-element-interface.cc b/lily/directional-element-interface.cc index d828544977..fdfe6d1341 100644 --- a/lily/directional-element-interface.cc +++ b/lily/directional-element-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "directional-element-interface.hh" diff --git a/lily/dispatcher-scheme.cc b/lily/dispatcher-scheme.cc index 8500cf9811..9e491e0a9a 100644 --- a/lily/dispatcher-scheme.cc +++ b/lily/dispatcher-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Erik Sandberg + (c) 2006--2007 Erik Sandberg */ #include "dispatcher.hh" diff --git a/lily/dot-column-engraver.cc b/lily/dot-column-engraver.cc index ede002049f..3f2982df74 100644 --- a/lily/dot-column-engraver.cc +++ b/lily/dot-column-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "rhythmic-head.hh" @@ -16,7 +16,6 @@ class Dot_column_engraver : public Engraver { Grob *dotcol_; - vector heads_; public: TRANSLATOR_DECLARATIONS (Dot_column_engraver); @@ -36,7 +35,6 @@ void Dot_column_engraver::stop_translation_timestep () { dotcol_ = 0; - heads_.clear (); } void diff --git a/lily/dot-column.cc b/lily/dot-column.cc index a07dfcde11..173a9ad981 100644 --- a/lily/dot-column.cc +++ b/lily/dot-column.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "dot-column.hh" @@ -256,6 +256,10 @@ Dot_column::calc_positioning_done (SCM smob) } int p = Staff_symbol_referencer::get_rounded_position (dp.dot_); + + /* icky, since this should go via a Staff_symbol_referencer + offset callback but adding a dot overwrites Y-offset. */ + p += (int) robust_scm2double (dp.dot_->get_property ("staff-position"), 0.0); dp.pos_ = p; if (dp.extremal_head_) diff --git a/lily/dots-engraver.cc b/lily/dots-engraver.cc index 7850b907e7..16a5b0a290 100644 --- a/lily/dots-engraver.cc +++ b/lily/dots-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ diff --git a/lily/dots.cc b/lily/dots.cc index afa82868a8..97ac61128e 100644 --- a/lily/dots.cc +++ b/lily/dots.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "dots.hh" @@ -13,7 +13,6 @@ #include "font-interface.hh" #include "lookup.hh" #include "staff-symbol-referencer.hh" -#include "directional-element-interface.hh" #include "international.hh" MAKE_SCHEME_CALLBACK (Dots, print, 1); @@ -53,7 +52,7 @@ Dots::print (SCM d) for (int i = scm_to_int (c); i--;) { d.translate_axis (2 * dw, X_AXIS); - mol.add_at_edge (X_AXIS, RIGHT, d, dw, 0); + mol.add_at_edge (X_AXIS, RIGHT, d, dw); } } return mol.smobbed_copy (); diff --git a/lily/drum-note-engraver.cc b/lily/drum-note-engraver.cc index fc1b77a034..1db3e611f9 100644 --- a/lily/drum-note-engraver.cc +++ b/lily/drum-note-engraver.cc @@ -1,7 +1,7 @@ /* drum-note-engraver.cc - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include @@ -132,6 +132,8 @@ Drum_notes_engraver::stop_translation_timestep () ADD_ACKNOWLEDGER (Drum_notes_engraver, stem); ADD_ACKNOWLEDGER (Drum_notes_engraver, note_column); + + ADD_TRANSLATOR (Drum_notes_engraver, /* doc */ "Generate noteheads.", /* create */ diff --git a/lily/drum-note-performer.cc b/lily/drum-note-performer.cc index 49a8d27001..c81fca0482 100644 --- a/lily/drum-note-performer.cc +++ b/lily/drum-note-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Jan Nieuwenhuizen + (c) 1996--2007 Jan Nieuwenhuizen */ #include "performer.hh" @@ -64,7 +64,15 @@ Drum_note_performer::process_music () tie_event = ev; } - Audio_note *p = new Audio_note (*pit, get_event_length (n), + Moment len = get_event_length (n); + if (now_mom().grace_part_) + { + len.grace_part_ = len.main_part_; + len.main_part_ = Rational (0); + } + + + Audio_note *p = new Audio_note (*pit, len, tie_event, Pitch (0, 0, 0)); Audio_element_info info (p, n); announce_element (info); diff --git a/lily/duration-scheme.cc b/lily/duration-scheme.cc index 361036256d..4b8c4605c0 100644 --- a/lily/duration-scheme.cc +++ b/lily/duration-scheme.cc @@ -3,7 +3,7 @@ source file of the LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ @@ -121,6 +121,14 @@ LY_DEFINE (ly_duration_length, "ly:duration-length", return Moment (unsmob_duration (dur)->get_length ()).smobbed_copy (); } +LY_DEFINE (ly_duration2string, "ly:duration->string", + 1, 0, 0, (SCM dur), + "Convert @var{dur} to string.") +{ + SCM_ASSERT_TYPE (unsmob_duration (dur), dur, SCM_ARG1, __FUNCTION__, "duration"); + return ly_string2scm (unsmob_duration (dur)->to_string ()); +} + LY_DEFINE (ly_duration_factor, "ly:duration-factor", 1, 0, 0, (SCM dur), "Extract the compression factor from @var{dur}. Return as a pair.") diff --git a/lily/duration.cc b/lily/duration.cc index 413ac889ec..1618489027 100644 --- a/lily/duration.cc +++ b/lily/duration.cc @@ -3,7 +3,7 @@ source file of the LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ @@ -91,7 +91,7 @@ Duration::print_smob (SCM s, SCM port, scm_print_state *) Duration *r = (Duration *) SCM_CELL_WORD_1 (s); scm_puts ("#to_string ().c_str ()), port); + scm_display (ly_string2scm (r->to_string ()), port); scm_puts (" >", port); return 1; diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index 6882939d88..49687a6b9b 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "axis-group-interface.hh" @@ -261,7 +261,7 @@ Dynamic_engraver::process_music () if (scm_is_string (s) || scm_is_pair (s)) { cresc_->set_property ("edge-text", - scm_cons (s, scm_makfrom0str (""))); + scm_cons (s, scm_from_locale_string (""))); context ()->set_property ((start_type + "Text").c_str (), SCM_EOL); } @@ -339,10 +339,18 @@ Dynamic_engraver::typeset_all () if (!finished_cresc_->get_bound (RIGHT) || use_bar) { - Grob *column_bound = unsmob_grob (use_bar - ? get_property ("currentCommandColumn") - : get_property ("currentMusicalColumn")); - + + Grob *column_bound = 0; + if (use_bar) + { + column_bound = unsmob_grob (get_property ("breakableSeparationItem")); + } + + if (!column_bound) + column_bound = unsmob_grob (use_bar + ? get_property ("currentCommandColumn") + : get_property ("currentMusicalColumn")); + finished_cresc_->set_bound (RIGHT, script_ ? script_ : column_bound); @@ -390,7 +398,6 @@ Dynamic_engraver::typeset_all () } } - void Dynamic_engraver::acknowledge_accidental (Grob_info info) { @@ -398,7 +405,6 @@ Dynamic_engraver::acknowledge_accidental (Grob_info info) Side_position_interface::add_support (line_spanner_, info.grob ()); } - void Dynamic_engraver::acknowledge_stem_tremolo (Grob_info info) { @@ -406,7 +412,6 @@ Dynamic_engraver::acknowledge_stem_tremolo (Grob_info info) Side_position_interface::add_support (line_spanner_, info.grob ()); } - void Dynamic_engraver::acknowledge_slur (Grob_info info) { @@ -414,7 +419,6 @@ Dynamic_engraver::acknowledge_slur (Grob_info info) Side_position_interface::add_support (line_spanner_, info.grob ()); } - void Dynamic_engraver::acknowledge_note_column (Grob_info info) { diff --git a/lily/dynamic-performer.cc b/lily/dynamic-performer.cc index 0dd4556060..fc85166f72 100644 --- a/lily/dynamic-performer.cc +++ b/lily/dynamic-performer.cc @@ -3,22 +3,15 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ #include "performer.hh" - #include "audio-item.hh" #include "stream-event.hh" -#include "translator.icc" - -/* - TODO: - handle multiple events +#include "translator.icc" - perform absolute (text) dynamics -*/ class Dynamic_performer : public Performer { public: @@ -26,87 +19,169 @@ public: protected: void stop_translation_timestep (); void process_music (); + Real equalize_volume (Real); + DECLARE_TRANSLATOR_LISTENER (decrescendo); + DECLARE_TRANSLATOR_LISTENER (crescendo); DECLARE_TRANSLATOR_LISTENER (absolute_dynamic); private: Stream_event *script_event_; - Audio_dynamic *audio_; + Drul_array span_events_; + Drul_array grow_dir_; + Real last_volume_; + Audio_dynamic *absolute_; + Audio_span_dynamic *span_dynamic_; + Audio_span_dynamic *finished_span_dynamic_; }; Dynamic_performer::Dynamic_performer () { + last_volume_ = 0.5; script_event_ = 0; - audio_ = 0; + absolute_ = 0; + span_events_[LEFT] = + span_events_[RIGHT] = 0; + span_dynamic_ = 0; + finished_span_dynamic_ = 0; } -void -Dynamic_performer::process_music () +Real +Dynamic_performer::equalize_volume (Real volume) { - if (script_event_) + /* + properties override default equaliser setting + */ + SCM min = get_property ("midiMinimumVolume"); + SCM max = get_property ("midiMaximumVolume"); + if (scm_is_number (min) || scm_is_number (max)) + { + Interval iv (0, 1); + if (scm_is_number (min)) + iv[MIN] = scm_to_double (min); + if (scm_is_number (max)) + iv[MAX] = scm_to_double (max); + volume = iv[MIN] + iv.length () * volume; + } + else { - SCM proc = get_property ("dynamicAbsoluteVolumeFunction"); + /* + urg, code duplication:: staff_performer + */ + SCM s = get_property ("midiInstrument"); - SCM svolume = SCM_EOL; - if (ly_is_procedure (proc)) - { - // urg - svolume = scm_call_1 (proc, script_event_->get_property ("text")); - } + if (!scm_is_string (s)) + s = get_property ("instrumentName"); - Real volume = robust_scm2double (svolume, 0.5); + if (!scm_is_string (s)) + s = scm_from_locale_string ("piano"); - /* - properties override default equaliser setting - */ - SCM min = get_property ("midiMinimumVolume"); - SCM max = get_property ("midiMaximumVolume"); - if (scm_is_number (min) || scm_is_number (max)) + SCM eq = get_property ("instrumentEqualizer"); + if (ly_is_procedure (eq)) + s = scm_call_1 (eq, s); + + if (is_number_pair (s)) { - Interval iv (0, 1); - if (scm_is_number (min)) - iv[MIN] = scm_to_double (min); - if (scm_is_number (max)) - iv[MAX] = scm_to_double (max); + Interval iv = ly_scm2interval (s); volume = iv[MIN] + iv.length () * volume; } - else - { - /* - urg, code duplication:: staff_performer - */ - SCM s = get_property ("midiInstrument"); + } + return volume; +} + + +void +Dynamic_performer::process_music () +{ + if (span_events_[STOP] || script_event_) + { + finished_span_dynamic_ = span_dynamic_; + span_dynamic_ = 0; + } - if (!scm_is_string (s)) - s = get_property ("instrumentName"); + if (span_events_[START]) + { + span_dynamic_ = new Audio_span_dynamic(); + announce_element (Audio_element_info (span_dynamic_, span_events_[START])); - if (!scm_is_string (s)) - s = scm_makfrom0str ("piano"); + span_dynamic_->grow_dir_ = grow_dir_[START]; + } - SCM eq = get_property ("instrumentEqualizer"); - if (ly_is_procedure (eq)) - s = scm_call_1 (eq, s); + if (script_event_ + || span_dynamic_ + || finished_span_dynamic_) + { + absolute_ = new Audio_dynamic (); - if (is_number_pair (s)) + if (script_event_) + { + SCM proc = get_property ("dynamicAbsoluteVolumeFunction"); + + SCM svolume = SCM_EOL; + if (ly_is_procedure (proc)) { - Interval iv = ly_scm2interval (s); - volume = iv[MIN] + iv.length () * volume; + // urg + svolume = scm_call_1 (proc, script_event_->get_property ("text")); } - } - audio_ = new Audio_dynamic (volume); - Audio_element_info info (audio_, script_event_); + Real volume = robust_scm2double (svolume, 0.5); + + last_volume_ + = absolute_->volume_ = equalize_volume (volume); + } + + Audio_element_info info (absolute_, script_event_); announce_element (info); - script_event_ = 0; } + + + if (span_dynamic_) + span_dynamic_->add_absolute (absolute_); + + if (finished_span_dynamic_) + finished_span_dynamic_->add_absolute (absolute_); } void Dynamic_performer::stop_translation_timestep () { - if (audio_) + if (finished_span_dynamic_) + { + finished_span_dynamic_->render (); + finished_span_dynamic_ = 0; + } + + + if (absolute_ && absolute_->volume_ < 0) + { + absolute_->volume_ = last_volume_; + } + else if (absolute_) { - audio_ = 0; + last_volume_ = absolute_->volume_; } + + absolute_ = 0; + script_event_ = 0; + span_events_[LEFT] = + span_events_[RIGHT] = 0; +} + +IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_performer, decrescendo); +void +Dynamic_performer::listen_decrescendo (Stream_event *r) +{ + Direction d = to_dir (r->get_property ("span-direction")); + span_events_[d] = r; + grow_dir_[d] = SMALLER; +} + +IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_performer, crescendo); +void +Dynamic_performer::listen_crescendo (Stream_event *r) +{ + Direction d = to_dir (r->get_property ("span-direction")); + span_events_[d] = r; + grow_dir_[d] = BIGGER; } IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_performer, absolute_dynamic); diff --git a/lily/dynamic-text-spanner.cc b/lily/dynamic-text-spanner.cc index ff6eac541e..e6a9f336a1 100644 --- a/lily/dynamic-text-spanner.cc +++ b/lily/dynamic-text-spanner.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen Revised over good by Han-Wen. */ diff --git a/lily/easy-notation.cc b/lily/easy-notation.cc index c6ecb0e20f..34c0a97f78 100644 --- a/lily/easy-notation.cc +++ b/lily/easy-notation.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "note-head.hh" @@ -47,7 +47,7 @@ Note_head::brew_ez_stencil (SCM smob) char s[2] = "a"; s[0] = (pit->get_notename () + 2) % 7 + 'a'; s[0] = toupper (s[0]); - charstr = scm_makfrom0str (s); + charstr = scm_from_locale_string (s); } SCM letter diff --git a/lily/enclosing-bracket.cc b/lily/enclosing-bracket.cc index 60e98f0944..ef2dd18b6b 100644 --- a/lily/enclosing-bracket.cc +++ b/lily/enclosing-bracket.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -85,7 +85,11 @@ Enclosing_bracket::print (SCM grob) Grob *common_x = common_refpoint_of_array (elements, me, X_AXIS); Interval xext = Axis_group_interface::relative_group_extent (elements, common_x, X_AXIS); - + if (xext.is_empty ()) + { + me->programming_error ("elements have no X extent."); + xext = Interval (0, 0); + } Stencil left_br = Horizontal_bracket::make_enclosing_bracket (me, me, elements, Y_AXIS, LEFT); diff --git a/lily/engraver-group.cc b/lily/engraver-group.cc index 4c5a5864c3..0158c532cd 100644 --- a/lily/engraver-group.cc +++ b/lily/engraver-group.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "context.hh" diff --git a/lily/engraver.cc b/lily/engraver.cc index c8eb805638..ac74d5e930 100644 --- a/lily/engraver.cc +++ b/lily/engraver.cc @@ -3,14 +3,13 @@ Sourcefile of GNU LilyPond music type setter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" #include "context.hh" #include "international.hh" -#include "lilypond-key.hh" #include "music.hh" #include "paper-column.hh" #include "score-engraver.hh" @@ -112,21 +111,21 @@ Engraver::internal_make_grob (SCM symbol, SCM cause, char const *name, char cons (void) file; (void) fun; (void) line; + (void) name; SCM props = updated_grob_properties (context (), symbol); - Object_key const *key = context ()->get_grob_key (name); Grob *grob = 0; SCM handle = scm_sloppy_assq (ly_symbol2scm ("meta"), props); SCM klass = scm_cdr (scm_sloppy_assq (ly_symbol2scm ("class"), scm_cdr (handle))); if (klass == ly_symbol2scm ("Item")) - grob = new Item (props, key); + grob = new Item (props); else if (klass == ly_symbol2scm ("Spanner")) - grob = new Spanner (props, key); + grob = new Spanner (props); else if (klass == ly_symbol2scm ("Paper_column")) - grob = new Paper_column (props, key); + grob = new Paper_column (props); assert (grob); announce_grob (grob, cause); @@ -134,8 +133,8 @@ Engraver::internal_make_grob (SCM symbol, SCM cause, char const *name, char cons #ifndef NDEBUG if (ly_is_procedure (creation_callback)) scm_apply_0 (creation_callback, - scm_list_n (grob->self_scm (), scm_makfrom0str (file), - scm_from_int (line), scm_makfrom0str (fun), SCM_UNDEFINED)); + scm_list_n (grob->self_scm (), scm_from_locale_string (file), + scm_from_int (line), scm_from_locale_string (fun), SCM_UNDEFINED)); #endif return grob; diff --git a/lily/event-chord-iterator.cc b/lily/event-chord-iterator.cc index ea1a105ea4..08ee9b620e 100644 --- a/lily/event-chord-iterator.cc +++ b/lily/event-chord-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "event-chord-iterator.hh" diff --git a/lily/event-iterator.cc b/lily/event-iterator.cc index 9f3b353c50..89dbe0b6ef 100644 --- a/lily/event-iterator.cc +++ b/lily/event-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "event-iterator.hh" diff --git a/lily/extender-engraver.cc b/lily/extender-engraver.cc index efea867822..efbb82d05c 100644 --- a/lily/extender-engraver.cc +++ b/lily/extender-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Glen Prideaux , + (c) 1999--2007 Glen Prideaux , Han-Wen Nienhuys , Jan Nieuwenhuizen */ @@ -98,7 +98,15 @@ Extender_engraver::stop_translation_timestep () ly_symbol2scm ("heads"), h); } } - + else + { + if (pending_extender_) + { + completize_extender (pending_extender_); + pending_extender_ = 0; + } + + } if (extender_) { pending_extender_ = extender_; diff --git a/lily/fall-engraver.cc b/lily/fall-engraver.cc index 08ca8e15e8..e69de29bb2 100644 --- a/lily/fall-engraver.cc +++ b/lily/fall-engraver.cc @@ -1,116 +0,0 @@ -/* - fall-engraver.cc -- implement Bend_after_engraver - - (c) 2006 Han-Wen Nienhuys - - -*/ - -#include "engraver.hh" -#include "item.hh" -#include "moment.hh" -#include "spanner.hh" -#include "stream-event.hh" - -#include "translator.icc" - -class Bend_after_engraver : public Engraver -{ -public: - TRANSLATOR_DECLARATIONS (Bend_after_engraver); - DECLARE_ACKNOWLEDGER (note_head); - -protected: - DECLARE_TRANSLATOR_LISTENER (bend_after); - void process_music (); - void stop_translation_timestep (); - void start_translation_timestep (); - void stop_fall (); - -private: - Moment stop_moment_; - Stream_event *fall_event_; - Spanner *fall_; - Grob *note_head_; -}; - -void -Bend_after_engraver::stop_fall () -{ - bool bar = scm_is_string (get_property ("whichBar")); - - - fall_->set_bound (RIGHT, unsmob_grob (bar - ? get_property ("currentCommandColumn") - : get_property ("currentMusicalColumn"))); - fall_ = 0; - note_head_ = 0; - fall_event_ = 0; -} - -void -Bend_after_engraver::stop_translation_timestep () -{ - if (fall_ && !fall_->get_bound (LEFT)) - { - fall_->set_bound (LEFT, note_head_); - fall_->set_parent (note_head_, Y_AXIS); - } -} - -void -Bend_after_engraver::start_translation_timestep () -{ - if (fall_ && now_mom ().main_part_ >= stop_moment_.main_part_) - { - stop_fall (); - } -} - -void -Bend_after_engraver::acknowledge_note_head (Grob_info info) -{ - if (!fall_event_) - return; - - if (note_head_ && fall_) - { - stop_fall (); - } - - note_head_ = info.grob (); - stop_moment_ = now_mom () + get_event_length (info.event_cause ()); -} - -Bend_after_engraver::Bend_after_engraver () -{ - fall_ = 0; - note_head_ = 0; - fall_event_ = 0; -} - -IMPLEMENT_TRANSLATOR_LISTENER (Bend_after_engraver, bend_after); -void -Bend_after_engraver::listen_bend_after (Stream_event *ev) -{ - ASSIGN_EVENT_ONCE (fall_event_, ev); -} - -void -Bend_after_engraver::process_music () -{ - if (fall_event_ && !fall_) - { - fall_ = make_spanner ("BendAfter", fall_event_->self_scm ()); - fall_->set_property ("delta-position", - scm_from_double (robust_scm2double (fall_event_->get_property ("delta-step"), 0))); - } -} - -ADD_ACKNOWLEDGER (Bend_after_engraver, note_head); - -ADD_TRANSLATOR (Bend_after_engraver, - /* doc */ "Create fall spanners.", - /* create */ "BendAfter", - /* read */ "", - /* write */ ""); diff --git a/lily/figured-bass-continuation.cc b/lily/figured-bass-continuation.cc index 0020b11e7f..2f97de6dac 100644 --- a/lily/figured-bass-continuation.cc +++ b/lily/figured-bass-continuation.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/figured-bass-engraver.cc b/lily/figured-bass-engraver.cc index 025f7de6ed..5fe9624041 100644 --- a/lily/figured-bass-engraver.cc +++ b/lily/figured-bass-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -286,7 +286,7 @@ Figured_bass_engraver::add_brackets () void Figured_bass_engraver::process_music () { - if (!to_boolean (get_property ("useBassFigureExtenders"))) + if (alignment_ && !to_boolean (get_property ("useBassFigureExtenders"))) clear_spanners (); if (rest_event_) diff --git a/lily/figured-bass-position-engraver.cc b/lily/figured-bass-position-engraver.cc index caab84bf4a..a3ed1528f9 100644 --- a/lily/figured-bass-position-engraver.cc +++ b/lily/figured-bass-position-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/file-name-map.cc b/lily/file-name-map.cc index c5c168bc14..2521d97175 100644 --- a/lily/file-name-map.cc +++ b/lily/file-name-map.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include diff --git a/lily/fingering-engraver.cc b/lily/fingering-engraver.cc index b5f36ef79b..874771f774 100644 --- a/lily/fingering-engraver.cc +++ b/lily/fingering-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/folded-repeat-iterator.cc b/lily/folded-repeat-iterator.cc index 79bfcb2fc7..f22e8b879b 100644 --- a/lily/folded-repeat-iterator.cc +++ b/lily/folded-repeat-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "folded-repeat-iterator.hh" diff --git a/lily/font-config-scheme.cc b/lily/font-config-scheme.cc index 482a240c9f..5d734899b2 100644 --- a/lily/font-config-scheme.cc +++ b/lily/font-config-scheme.cc @@ -3,18 +3,21 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "lily-guile.hh" -#include "std-string.hh" +#include "string-convert.hh" +#include "warn.hh" #include -void +string display_fontset (FcFontSet *fs) { + string retval; + int j; for (j = 0; j < fs->nfont; j++) { @@ -23,36 +26,42 @@ display_fontset (FcFontSet *fs) font = FcNameUnparse (fs->fonts[j]); if (FcPatternGetString (fs->fonts[j], FC_FILE, 0, &str) == FcResultMatch) - printf ("FILE %s\n", str); + retval += String_convert::form_string ("FILE %s\n", str); if (FcPatternGetString (fs->fonts[j], FC_FAMILY, 0, &str) == FcResultMatch) - printf ("family %s\n ", str); + retval += String_convert::form_string ("family %s\n ", str); if (FcPatternGetString (fs->fonts[j], "designsize", 0, &str) == FcResultMatch) - printf ("designsize %s\n ", str); + retval += String_convert::form_string ("designsize %s\n ", str); - printf ("%s\n", (const char*) font); + retval += String_convert::form_string ("%s\n", (const char*) font); free (font); } + + return retval; } -void +string display_strlist (char const*what, FcStrList *slist) { + string retval; while (FcChar8 *dir = FcStrListNext (slist)) { - printf("%s: %s\n", what, dir); + retval += String_convert::form_string ("%s: %s\n", what, dir); } + return retval; } -void +string display_config (FcConfig *fcc) { - display_strlist ("Config files", FcConfigGetConfigFiles(fcc)); - display_strlist ("Config dir", FcConfigGetConfigDirs(fcc)); - display_strlist ("Font dir", FcConfigGetFontDirs(fcc)); + string retval; + retval += display_strlist ("Config files", FcConfigGetConfigFiles(fcc)); + retval += display_strlist ("Config dir", FcConfigGetConfigDirs(fcc)); + retval += display_strlist ("Font dir", FcConfigGetFontDirs(fcc)); + return retval; } -void +string display_list (FcConfig *fcc) { FcPattern*pat = FcPatternCreate (); @@ -66,11 +75,13 @@ display_list (FcConfig *fcc) if (pat) FcPatternDestroy (pat); + string retval; if (fs) { - display_fontset (fs); + retval = display_fontset (fs); FcFontSetDestroy (fs); } + return retval; } @@ -98,7 +109,7 @@ LY_DEFINE (ly_font_config_get_font_file, "ly:font-config-get-font-file", 1, 0, 0 pat = FcFontMatch(NULL, pat, &result); FcChar8 *str = 0; if (FcPatternGetString (pat, FC_FILE, 0, &str) == FcResultMatch) - scm_result = scm_makfrom0str ((char const*) str); + scm_result = scm_from_locale_string ((char const*) str); FcPatternDestroy (pat); @@ -109,8 +120,10 @@ LY_DEFINE (ly_font_config_display_fonts, "ly:font-config-display-fonts", 0, 0, 0 (), "Dump a list of all fonts visible to FontConfig.") { - display_list (NULL); - display_config (NULL); + string str = display_list (NULL); + str += display_config (NULL); + + progress_indication (str); return SCM_UNSPECIFIED; } diff --git a/lily/font-config.cc b/lily/font-config.cc index cbf77c7944..ab530eabfd 100644 --- a/lily/font-config.cc +++ b/lily/font-config.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "config.hh" diff --git a/lily/font-interface.cc b/lily/font-interface.cc index 482f91af7a..5dc2129c14 100644 --- a/lily/font-interface.cc +++ b/lily/font-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "font-interface.hh" diff --git a/lily/font-metric-scheme.cc b/lily/font-metric-scheme.cc index d04d1eab8a..18edb7513a 100644 --- a/lily/font-metric-scheme.cc +++ b/lily/font-metric-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "font-metric.hh" @@ -122,7 +122,7 @@ LY_DEFINE (ly_font_name, "ly:font-name", Font_metric *fm = unsmob_metrics (font); SCM_ASSERT_TYPE (fm, font, SCM_ARG1, __FUNCTION__, "font-metric"); - return scm_makfrom0str (fm->font_name ().c_str ()); + return ly_string2scm (fm->font_name ()); } LY_DEFINE (ly_font_magnification, "ly:font-magnification", 1, 0, 0, diff --git a/lily/font-metric.cc b/lily/font-metric.cc index 03625cc946..2f61d53f3f 100644 --- a/lily/font-metric.cc +++ b/lily/font-metric.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys Mats Bengtsson (the ugly TeX parsing in text_dimension) */ @@ -40,7 +40,7 @@ Font_metric::find_by_name (string s) const { expr = scm_list_3 (ly_symbol2scm ("named-glyph"), self_scm (), - scm_makfrom0str (s.c_str ())); + ly_string2scm (s)); b = get_indexed_char (idx); } @@ -187,12 +187,9 @@ Font_metric::word_stencil (string str) const Stencil Font_metric::text_stencil (string str) const { - SCM lst = scm_list_3 (ly_symbol2scm ("text"), - this->self_scm (), - scm_makfrom0str (str.c_str ())); - - Box b = text_dimension (str); - return Stencil (b, lst); + (void) str; + assert (false); + return Stencil (Box (), SCM_EOL); } Box diff --git a/lily/font-select.cc b/lily/font-select.cc index 2765aa8c14..a5445853f5 100644 --- a/lily/font-select.cc +++ b/lily/font-select.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Han-Wen Nienhuys + (c) 2003--2007 Han-Wen Nienhuys */ diff --git a/lily/font-size-engraver.cc b/lily/font-size-engraver.cc index 9e740964a9..39b36586ba 100644 --- a/lily/font-size-engraver.cc +++ b/lily/font-size-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #include "grob.hh" diff --git a/lily/freetype-error.cc b/lily/freetype-error.cc new file mode 100644 index 0000000000..683671146c --- /dev/null +++ b/lily/freetype-error.cc @@ -0,0 +1,42 @@ +/* + freetype-error.cc -- implement freetype error messages + + source file of the GNU LilyPond music typesetter + + (c) 2007 Han-Wen Nienhuys + +*/ + +#include "freetype.hh" + +#undef __FTERRORS_H__ +#define FT_ERRORDEF( e, v, s ) { e, s }, +#define FT_ERROR_START_LIST { +#define FT_ERROR_END_LIST { 0, 0 } }; + +const struct Freetype_error_message +{ + int err_code; + const char* err_msg; +} ft_errors[] = + +#include + + ; + + +#include + +string +freetype_error_string (int code) +{ + for (Freetype_error_message const *p = ft_errors; + p->err_msg; p ++) + { + if (p->err_code == code) + return p->err_msg; + } + + return ""; +} + diff --git a/lily/freetype.cc b/lily/freetype.cc index 1988ed556e..18882125d6 100644 --- a/lily/freetype.cc +++ b/lily/freetype.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "freetype.hh" diff --git a/lily/function-documentation.cc b/lily/function-documentation.cc index 5081d7eb58..7e450528ae 100644 --- a/lily/function-documentation.cc +++ b/lily/function-documentation.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include @@ -29,8 +29,8 @@ void ly_add_function_documentation (SCM func, + "\n" + doc; scm_set_procedure_property_x (func, ly_symbol2scm ("documentation"), - scm_makfrom0str (s.c_str ())); - SCM entry = scm_cons (scm_makfrom0str (varlist), scm_makfrom0str (doc)); + ly_string2scm (s)); + SCM entry = scm_cons (scm_from_locale_string (varlist), scm_from_locale_string (doc)); scm_hashq_set_x (doc_hash_table, ly_symbol2scm (fname), entry); } diff --git a/lily/general-scheme.cc b/lily/general-scheme.cc index 1cb51a10ff..cbc3b605ed 100644 --- a/lily/general-scheme.cc +++ b/lily/general-scheme.cc @@ -3,13 +3,14 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ #include "config.hh" #include +#include #include /* memset */ using namespace std; @@ -22,6 +23,9 @@ using namespace std; #include "dimensions.hh" #include "main.hh" #include "file-path.hh" +#include "relocate.hh" +#include "file-name.hh" +#include "string-convert.hh" LY_DEFINE (ly_find_file, "ly:find-file", 1, 0, 0, (SCM name), @@ -35,7 +39,7 @@ LY_DEFINE (ly_find_file, "ly:find-file", if (file_name.empty ()) return SCM_BOOL_F; - return scm_makfrom0str (file_name.c_str ()); + return ly_string2scm (file_name); } /* @@ -135,15 +139,29 @@ LY_DEFINE (ly_assoc_get, "ly:assoc-get", "(or #f if not specified).") { SCM handle = scm_assoc (key, alist); - + if (scm_is_pair (handle)) + return scm_cdr (handle); + if (default_value == SCM_UNDEFINED) default_value = SCM_BOOL_F; - if (scm_is_pair (handle)) - return scm_cdr (handle); return default_value; } +LY_DEFINE (ly_string_substitute, "ly:string-substitute", + 3, 0, 0, (SCM a, SCM b, SCM s), + "Replace @var{a} by @var{b} in @var{s}.") +{ + SCM_ASSERT_TYPE (scm_is_string (a), s, SCM_ARG1, __FUNCTION__, "string"); + SCM_ASSERT_TYPE (scm_is_string (b), s, SCM_ARG2, __FUNCTION__, "string"); + SCM_ASSERT_TYPE (scm_is_string (s), s, SCM_ARG3, __FUNCTION__, "string"); + + string ss = ly_scm2string (s); + replace_all (ss, string (scm_i_string_chars (a)), + string (scm_i_string_chars (b))); + return ly_string2scm (ss); +} + LY_DEFINE (ly_number2string, "ly:number->string", 1, 0, 0, (SCM s), "Convert @var{num} to a string without generating many decimals.") @@ -163,12 +181,12 @@ LY_DEFINE (ly_number2string, "ly:number->string", r = 0.0; } - snprintf (str, sizeof (str), "%08.4f", r); + snprintf (str, sizeof (str), "%.4f", r); } else snprintf (str, sizeof (str), "%d", int (scm_to_int (s))); - return scm_makfrom0str (str); + return scm_from_locale_string (str); } LY_DEFINE (ly_version, "ly:version", 0, 0, 0, (), @@ -182,7 +200,7 @@ LY_DEFINE (ly_version, "ly:version", 0, 0, 0, (), LY_DEFINE (ly_unit, "ly:unit", 0, 0, 0, (), "Return the unit used for lengths as a string.") { - return scm_makfrom0str (INTERNAL_UNIT); + return scm_from_locale_string (INTERNAL_UNIT); } LY_DEFINE (ly_dimension_p, "ly:dimension?", 1, 0, 0, (SCM d), @@ -208,14 +226,14 @@ LY_DEFINE (ly_gettext, "ly:gettext", { SCM_ASSERT_TYPE (scm_is_string (string), string, SCM_ARG1, __FUNCTION__, "string"); - return scm_makfrom0str (_ (scm_i_string_chars (string)).c_str ()); + return ly_string2scm (_ (scm_i_string_chars (string))); } LY_DEFINE (ly_output_backend, "ly:output-backend", 0, 0, 0, (), "Return name of output backend.") { - return scm_makfrom0str (output_backend_global.c_str ()); + return ly_string2scm (output_backend_global); } LY_DEFINE (ly_output_formats, "ly:output-formats", @@ -228,7 +246,7 @@ LY_DEFINE (ly_output_formats, "ly:output-formats", SCM lst = SCM_EOL; int output_formats_count = output_formats.size (); for (int i = 0; i < output_formats_count; i++) - lst = scm_cons (scm_makfrom0str (output_formats[i].c_str ()), lst); + lst = scm_cons (ly_string2scm (output_formats[i]), lst); return lst; } @@ -265,14 +283,14 @@ LY_DEFINE (ly_wchar_to_utf_8, "ly:wide-char->utf-8", } *p = 0; - return scm_makfrom0str (buf); + return scm_from_locale_string (buf); } LY_DEFINE (ly_effective_prefix, "ly:effective-prefix", 0, 0, 0, (), "Return effective prefix.") { - return scm_makfrom0str (prefix_directory.c_str ()); + return ly_string2scm (prefix_directory); } LY_DEFINE (ly_chain_assoc_get, "ly:chain-assoc-get", @@ -292,18 +310,21 @@ LY_DEFINE (ly_chain_assoc_get, "ly:chain-assoc-get", return dfault == SCM_UNDEFINED ? SCM_BOOL_F : dfault; } + LY_DEFINE (ly_stderr_redirect, "ly:stderr-redirect", 1, 1, 0, (SCM file_name, SCM mode), "Redirect stderr to FILE-NAME, opened with MODE.") { SCM_ASSERT_TYPE (scm_is_string (file_name), file_name, SCM_ARG1, __FUNCTION__, "file_name"); - char const *m = "w"; + + string m = "w"; if (mode != SCM_UNDEFINED && scm_string_p (mode)) - m = ly_scm2newstr (mode, 0); + m = ly_scm2string (mode); /* dup2 and (fileno (current-error-port)) do not work with mingw'c gcc -mwindows. */ - freopen (ly_scm2newstr (file_name, 0), m, stderr); + fflush (stderr); + freopen (ly_scm2string (file_name).c_str (), m.c_str (), stderr); return SCM_UNSPECIFIED; } @@ -339,3 +360,157 @@ LY_DEFINE (ly_camel_case_to_lisp_identifier, "ly:camel-case->lisp-identifier", return ly_symbol2scm (result.c_str ()); } + +LY_DEFINE (ly_expand_environment, "ly:expand-environment", + 1, 0, 0, (SCM str), + "Expand $VAR and $@{VAR@} in @var{str}.") +{ + SCM_ASSERT_TYPE(scm_is_string (str), str, + SCM_ARG1, __FUNCTION__, "string"); + + return ly_string2scm (expand_environment_variables (ly_scm2string (str))); +} + + +LY_DEFINE (ly_truncate_list_x, "ly:truncate-list!", + 2, 0, 0, (SCM lst, SCM i), + "Take at most the first @var{i} of list @var{lst}") +{ + SCM_ASSERT_TYPE(scm_is_integer (i), i, + SCM_ARG1, __FUNCTION__, "integer"); + + int k = scm_to_int (i); + if (k == 0) + lst = SCM_EOL; + else + { + SCM s = lst; + k--; + for (; scm_is_pair (s) && k--; s = scm_cdr (s)) + ; + + if (scm_is_pair (s)) + scm_set_cdr_x (s, SCM_EOL); + } + return lst; +} + +string +format_single_argument (SCM arg, int precision) +{ + if (scm_is_integer (arg) && scm_exact_p (arg) == SCM_BOOL_T) + return (String_convert::int_string (scm_to_int (arg))); + else if (scm_is_number (arg)) + { + Real val = scm_to_double (arg); + + if (isnan (val) || isinf (val)) + { + warning (_ ("Found infinity or nan in output. Substituting 0.0")); + return ("0.0"); + if (strict_infinity_checking) + abort(); + } + else + return (String_convert::form_string ("%.*lf", precision, val)); + } + else if (scm_is_string (arg)) + return (ly_scm2string (arg)); + else if (scm_is_symbol (arg)) + return (ly_symbol2string (arg)); + else + { + ly_progress (scm_from_locale_string ("Unsupported SCM value for format: ~a"), + scm_list_1 (arg)); + } + + + return ""; +} + +LY_DEFINE (ly_format, "ly:format", + 1, 0, 1, (SCM str, SCM rest), + "LilyPond specific format, supporting ~a ~[0-9]f.") +{ + SCM_ASSERT_TYPE (scm_is_string (str), str, SCM_ARG1, __FUNCTION__, "string"); + + string format = ly_scm2string (str); + vector results; + + vsize i = 0; + while (i < format.size()) + { + vsize tilde = format.find ('~', i); + + results.push_back (format.substr (i, (tilde-i))); + + if (tilde == NPOS) + break ; + + tilde ++; + + char spec = format.at (tilde ++); + if (spec == '~') + results.push_back ("~"); + else + { + if (!scm_is_pair (rest)) + { + programming_error (string (__FUNCTION__) + + ": not enough arguments for format."); + return ly_string2scm (""); + } + + SCM arg = scm_car (rest); + rest = scm_cdr (rest); + + int precision = 8; + + if (spec == '$') + precision = '2'; + else if (isdigit (spec)) + { + precision = spec - '0'; + spec = format.at (tilde ++); + } + + if (spec == 'a' || spec == 'f') + results.push_back (format_single_argument (arg, precision)); + else if (spec == 'l') + { + SCM s = arg; + for (; scm_is_pair (s); s = scm_cdr (s)) + { + results.push_back (format_single_argument (scm_car (s), precision)); + if (scm_cdr (s) != SCM_EOL) + results.push_back (" "); + } + + if (s != SCM_EOL) + results.push_back (format_single_argument (s, precision)); + + } + } + + i = tilde; + } + + if (scm_is_pair (rest)) + programming_error (string (__FUNCTION__) + + ": too many arguments"); + + vsize len = 0; + for (vsize i = 0; i < results.size(); i++) + len += results[i].size(); + + char *result = (char*) scm_malloc (len + 1); + char *ptr = result; + for (vsize i = 0; i < results.size(); i++) + { + strncpy (ptr, results[i].c_str (), results[i].size()); + ptr += results[i].size(); + } + *ptr = '\0'; + + return scm_take_locale_stringn (result, len); +} diff --git a/lily/glissando-engraver.cc b/lily/glissando-engraver.cc index 4c506df38d..ff91888677 100644 --- a/lily/glissando-engraver.cc +++ b/lily/glissando-engraver.cc @@ -3,15 +3,17 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ #include "engraver.hh" + #include "international.hh" #include "rhythmic-head.hh" #include "spanner.hh" #include "stream-event.hh" #include "warn.hh" +#include "item.hh" #include "translator.icc" @@ -65,15 +67,19 @@ Glissando_engraver::acknowledge_rhythmic_head (Grob_info info) line_->set_bound (LEFT, g); if (last_line_) - last_line_->set_bound (RIGHT, g); + { + last_line_->set_bound (RIGHT, g); + announce_end_grob (last_line_, g->self_scm ()); + } } void Glissando_engraver::stop_translation_timestep () { if (last_line_ && last_line_->get_bound (RIGHT)) - last_line_ = 0; - + { + last_line_ = 0; + } if (line_) { if (last_line_) diff --git a/lily/global-context-scheme.cc b/lily/global-context-scheme.cc index 219dc267c1..c5f4d561f9 100644 --- a/lily/global-context-scheme.cc +++ b/lily/global-context-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "cpu-timer.hh" #include "global-context.hh" @@ -12,7 +12,6 @@ #include "music-iterator.hh" #include "music-output.hh" #include "music.hh" -#include "object-key.hh" #include "output-def.hh" #include "translator-group.hh" #include "warn.hh" @@ -50,20 +49,18 @@ LY_DEFINE (ly_make_global_translator, "ly:make-global-translator", } LY_DEFINE (ly_make_global_context, "ly:make-global-context", - 1, 1, 0, (SCM output_def, SCM key), + 1, 0, 0, (SCM output_def), "Set up a global interpretation context, using the output\n" "block @var{output_def}.\n" "The context is returned.\n" - - "\n\nOptionally, this routine takes an Object-key to\n" - "to uniquely identify the Score block containing it.\n") + ) { Output_def *odef = unsmob_output_def (output_def); SCM_ASSERT_TYPE (odef, output_def, SCM_ARG1, __FUNCTION__, "Output definition"); - Global_context *glob = new Global_context (odef, unsmob_key (key)); + Global_context *glob = new Global_context (odef); if (!glob) { @@ -123,7 +120,7 @@ LY_DEFINE (ly_interpret_music_expression, "ly:interpret-music-expression", } LY_DEFINE (ly_run_translator, "ly:run-translator", - 2, 1, 0, (SCM mus, SCM output_def, SCM key), + 2, 1, 0, (SCM mus, SCM output_def), "Process @var{mus} according to @var{output_def}. \n" "An interpretation context is set up,\n" "and @var{mus} is interpreted with it. \n" @@ -132,7 +129,7 @@ LY_DEFINE (ly_run_translator, "ly:run-translator", "Optionally, this routine takes an Object-key to\n" "to uniquely identify the Score block containing it.\n") { - SCM glob = ly_make_global_context (output_def, key); + SCM glob = ly_make_global_context (output_def); ly_make_global_translator (glob); ly_interpret_music_expression (mus, glob); return glob; diff --git a/lily/global-context.cc b/lily/global-context.cc index 6e0e1c4379..f4aff0398e 100644 --- a/lily/global-context.cc +++ b/lily/global-context.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "global-context.hh" @@ -14,16 +14,13 @@ using namespace std; #include "context-def.hh" #include "dispatcher.hh" #include "international.hh" -#include "lilypond-key.hh" #include "music-iterator.hh" #include "music.hh" #include "output-def.hh" #include "warn.hh" -Global_context::Global_context (Output_def *o, Object_key *key) - : Context (new Lilypond_context_key (key, - Moment (0), - "Global", "", 0)) +Global_context::Global_context (Output_def *o) + : Context () { output_def_ = o; definition_ = find_context_def (o, ly_symbol2scm ("Global")); @@ -92,8 +89,6 @@ Global_context::prepare (SCM sev) else prev_mom_ = now_mom_; now_mom_ = *mom; - - clear_key_disambiguations (); } Moment diff --git a/lily/global-ctor.cc b/lily/global-ctor.cc index dd340e9941..8ce294bbe1 100644 --- a/lily/global-ctor.cc +++ b/lily/global-ctor.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "global-ctor.hh" diff --git a/lily/grace-engraver.cc b/lily/grace-engraver.cc index bb410981a3..5be9307f08 100644 --- a/lily/grace-engraver.cc +++ b/lily/grace-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/grace-iterator.cc b/lily/grace-iterator.cc index f0dd19063a..237ebc81ee 100644 --- a/lily/grace-iterator.cc +++ b/lily/grace-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "grace-iterator.hh" diff --git a/lily/grace-music.cc b/lily/grace-music.cc index 51ea066f1a..f92d4ebb8c 100644 --- a/lily/grace-music.cc +++ b/lily/grace-music.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "music.hh" diff --git a/lily/grace-spacing-engraver.cc b/lily/grace-spacing-engraver.cc index 0e1f8740c5..689f76212f 100644 --- a/lily/grace-spacing-engraver.cc +++ b/lily/grace-spacing-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen + (c) 2006--2007 Han-Wen */ @@ -51,6 +51,11 @@ Grace_spacing_engraver::process_music () column); column->set_object ("grace-spacing", grace_spacing_->self_scm ()); + + if (!grace_spacing_->get_bound (LEFT)) + grace_spacing_->set_bound (LEFT, column); + else + grace_spacing_->set_bound (RIGHT, column); } } diff --git a/lily/gregorian-ligature-engraver.cc b/lily/gregorian-ligature-engraver.cc index 73ba7e1fed..3f08b7131c 100644 --- a/lily/gregorian-ligature-engraver.cc +++ b/lily/gregorian-ligature-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Juergen Reuter + (c) 2003--2007 Juergen Reuter */ #include "gregorian-ligature-engraver.hh" diff --git a/lily/gregorian-ligature.cc b/lily/gregorian-ligature.cc index fa790b368e..0bfdde3efa 100644 --- a/lily/gregorian-ligature.cc +++ b/lily/gregorian-ligature.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Han-Wen Nienhuys + (c) 2003--2007 Han-Wen Nienhuys */ #include "gregorian-ligature.hh" diff --git a/lily/grid-line-interface.cc b/lily/grid-line-interface.cc index f24f96829f..409c4e8ff4 100644 --- a/lily/grid-line-interface.cc +++ b/lily/grid-line-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "grid-line-interface.hh" diff --git a/lily/grid-line-span-engraver.cc b/lily/grid-line-span-engraver.cc index 8bcc8a3f6a..ede6afdf42 100644 --- a/lily/grid-line-span-engraver.cc +++ b/lily/grid-line-span-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/grid-point-engraver.cc b/lily/grid-point-engraver.cc index 8cd53cbe89..1a3641717b 100644 --- a/lily/grid-point-engraver.cc +++ b/lily/grid-point-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/grob-array-scheme.cc b/lily/grob-array-scheme.cc index d9f7d20e98..b242addf9b 100644 --- a/lily/grob-array-scheme.cc +++ b/lily/grob-array-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/grob-array.cc b/lily/grob-array.cc index bf85be414c..b89325bded 100644 --- a/lily/grob-array.cc +++ b/lily/grob-array.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "grob-array.hh" diff --git a/lily/grob-info.cc b/lily/grob-info.cc index 62af8f3256..45bacb9bb9 100644 --- a/lily/grob-info.cc +++ b/lily/grob-info.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "context.hh" @@ -19,6 +19,11 @@ Grob_info::Grob_info (Translator *t, Grob *g) origin_trans_ = t; grob_ = g; start_end_ = START; + + /* + assert here, because this is easier to debug. + */ + assert (g); } Grob_info::Grob_info () diff --git a/lily/grob-interface-scheme.cc b/lily/grob-interface-scheme.cc index e8e9e9200c..5d5947cbb7 100644 --- a/lily/grob-interface-scheme.cc +++ b/lily/grob-interface-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "lily-guile.hh" diff --git a/lily/grob-interface.cc b/lily/grob-interface.cc index c47937db0f..73cf230de7 100644 --- a/lily/grob-interface.cc +++ b/lily/grob-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "grob-interface.hh" @@ -26,7 +26,7 @@ SCM add_interface (char const *cxx_name, lispy_name += suffix; SCM s = ly_symbol2scm (lispy_name.c_str ()); - SCM d = scm_makfrom0str (descr); + SCM d = scm_from_locale_string (descr); SCM l = parse_symbol_list (vars); ly_add_interface (s, d, l); diff --git a/lily/grob-pitch-tuple.cc b/lily/grob-pitch-tuple.cc deleted file mode 100644 index eb72a367e1..0000000000 --- a/lily/grob-pitch-tuple.cc +++ /dev/null @@ -1,46 +0,0 @@ -/* - grob-pitch-tuple.cc -- implement Grob_pitch_tuple - - source file of the GNU LilyPond music typesetter - - (c) 2001--2006 Han-Wen Nienhuys -*/ - -#include "grob-pitch-tuple.hh" - -#include "music.hh" - -int compare (Grob_pitch_tuple const &a, Grob_pitch_tuple const &b) -{ - return Grob_pitch_tuple::time_compare (a, b); -} - -Grob_pitch_tuple::Grob_pitch_tuple () -{ - head_ = 0; - end_ = 0; -} - -Grob_pitch_tuple::Grob_pitch_tuple (Grob *h, Music *m, Moment mom) -{ - head_ = h; - pitch_ = *unsmob_pitch (m->get_property ("pitch")); - end_ = mom; -} - -/* - signed compare, should use pitch + (c) 2001--2007 Han-Wen Nienhuys */ #include "context.hh" @@ -32,7 +32,8 @@ protected: DECLARE_ACKNOWLEDGER (grob); void start_translation_timestep (); void stop_translation_timestep (); - + void process_acknowledged (); + vector started_now_; }; @@ -88,14 +89,8 @@ Grob_pq_engraver::acknowledge_grob (Grob_info gi) } void -Grob_pq_engraver::stop_translation_timestep () +Grob_pq_engraver::process_acknowledged () { - Moment now = now_mom (); - SCM start_busy = get_property ("busyGrobs"); - SCM busy = start_busy; - while (scm_is_pair (busy) && *unsmob_moment (scm_caar (busy)) == now) - busy = scm_cdr (busy); - vector_sort (started_now_, less ()); SCM lst = SCM_EOL; SCM *tail = &lst; @@ -107,12 +102,24 @@ Grob_pq_engraver::stop_translation_timestep () tail = SCM_CDRLOC (*tail); } + SCM busy = get_property ("busyGrobs"); busy = scm_merge_x (lst, busy, ly_grob_pq_less_p_proc); context ()->set_property ("busyGrobs", busy); started_now_.clear (); } +void +Grob_pq_engraver::stop_translation_timestep () +{ + Moment now = now_mom (); + SCM start_busy = get_property ("busyGrobs"); + SCM busy = start_busy; + while (scm_is_pair (busy) && *unsmob_moment (scm_caar (busy)) == now) + busy = scm_cdr (busy); + +} + void Grob_pq_engraver::start_translation_timestep () { diff --git a/lily/grob-property.cc b/lily/grob-property.cc index f1242994d5..b62a6bb9f9 100644 --- a/lily/grob-property.cc +++ b/lily/grob-property.cc @@ -53,8 +53,14 @@ Grob::get_property_alist_chain (SCM def) const extern void check_interfaces_for_property (Grob const *me, SCM sym); +#if 0 + +/* + We can't change signatures depending on NDEBUG, since NDEBUG comes + over the command line and may be different per .cc file. This + should be done through the macro expansion of get_property(). + */ void -#ifndef NDEBUG Grob::internal_set_property (SCM sym, SCM v, char const *file, int line, char const *fun) { SCM grob_p = ly_lily_module_constant ("ly:grob?"); @@ -68,11 +74,34 @@ Grob::internal_set_property (SCM sym, SCM v, char const *file, int line, char co scm_display (scm_list_2 (sym, type), scm_current_output_port ()); assert (0); } + + internal_set_value_on_alist (&mutable_property_alist_, + sym, v); + + + if (ly_is_procedure (modification_callback)) + scm_apply_0 (modification_callback, + scm_list_n (self_scm (), + scm_from_locale_string (file), + scm_from_int (line), + scm_from_locale_string (fun), + sym, v, SCM_UNDEFINED)); +} #else + + +void Grob::internal_set_property (SCM sym, SCM v) { + internal_set_value_on_alist (&mutable_property_alist_, + sym, v); + +} #endif +void +Grob::internal_set_value_on_alist (SCM *alist, SCM sym, SCM v) +{ /* Perhaps we simply do the assq_set, but what the heck. */ if (!is_live ()) return; @@ -81,26 +110,15 @@ Grob::internal_set_property (SCM sym, SCM v) { if (!ly_is_procedure (v) && !is_simple_closure (v) - && v != ly_symbol2scm ("calculation-in-progress") - && !type_check_assignment (sym, v, ly_symbol2scm ("backend-type?"))) - abort (); + && v != ly_symbol2scm ("calculation-in-progress")) + type_check_assignment (sym, v, ly_symbol2scm ("backend-type?")); + check_interfaces_for_property (this, sym); } -#ifndef NDEBUG - if (ly_is_procedure (modification_callback)) - scm_apply_0 (modification_callback, - scm_list_n (self_scm (), - scm_makfrom0str (file), - scm_from_int (line), - scm_makfrom0str (fun), - sym, v, SCM_UNDEFINED)); -#endif - - mutable_property_alist_ = scm_assq_set_x (mutable_property_alist_, sym, v); + *alist = scm_assq_set_x (*alist, sym, v); } -//#define PROFILE_PROPERTY_ACCESSES SCM Grob::internal_get_property_data (SCM sym) const { @@ -118,11 +136,8 @@ Grob::internal_get_property_data (SCM sym) const if (do_internal_type_checking_global && scm_is_pair (handle)) { SCM val = scm_cdr (handle); - if (!ly_is_procedure (val) - && !is_simple_closure (val) - && !type_check_assignment (sym, val, - ly_symbol2scm ("backend-type?"))) - abort (); + if (!ly_is_procedure (val) && !is_simple_closure (val)) + type_check_assignment (sym, val, ly_symbol2scm ("backend-type?")); check_interfaces_for_property (this, sym); } @@ -137,7 +152,8 @@ Grob::internal_get_property (SCM sym) const if (ly_is_procedure (val) || is_simple_closure (val)) { - val = ((Grob*)this)->try_callback (sym, val); + Grob *me = ((Grob*)this); + val = me->try_callback_on_alist (&me->mutable_property_alist_, sym, val); } return val; @@ -151,15 +167,14 @@ bool debug_property_callbacks = 0; #endif SCM -Grob::try_callback (SCM sym, SCM proc) +Grob::try_callback_on_alist (SCM *alist, SCM sym, SCM proc) { SCM marker = ly_symbol2scm ("calculation-in-progress"); /* need to put a value in SYM to ensure that we don't get a cyclic call chain. */ - mutable_property_alist_ - = scm_assq_set_x (mutable_property_alist_, sym, marker); + *alist = scm_assq_set_x (*alist, sym, marker); #ifndef NDEBUG if (debug_property_callbacks) @@ -175,6 +190,7 @@ Grob::try_callback (SCM sym, SCM proc) simple_closure_expression (proc), false, 0, 0); } + #ifndef NDEBUG if (debug_property_callbacks) grob_property_callback_stack = scm_cdr (grob_property_callback_stack); @@ -188,12 +204,13 @@ Grob::try_callback (SCM sym, SCM proc) if (value == SCM_UNSPECIFIED) { value = internal_get_property (sym); + assert (value == SCM_EOL || value == marker); if (value == marker) - mutable_property_alist_ = scm_assq_remove_x (mutable_property_alist_, marker); + *alist = scm_assq_remove_x (*alist, marker); } else - set_property (sym, value); - + internal_set_value_on_alist (alist, sym, value); + return value; } @@ -216,13 +233,25 @@ Grob::internal_del_property (SCM sym) SCM Grob::internal_get_object (SCM sym) const { -#ifdef PROFILE_PROPERTY_ACCESSES - note_property_access (&grob_property_lookup_table, sym); -#endif + if (profile_property_accesses) + note_property_access (&grob_property_lookup_table, sym); SCM s = scm_sloppy_assq (sym, object_alist_); + + if (s != SCM_BOOL_F) + { + SCM val = scm_cdr (s); + if (ly_is_procedure (val) + || is_simple_closure (val)) + { + Grob *me = ((Grob*)this); + val = me->try_callback_on_alist (&me->object_alist_, sym, val); + } + + return val; + } - return (s == SCM_BOOL_F) ? SCM_EOL : scm_cdr (s); + return SCM_EOL; } bool diff --git a/lily/grob-scheme.cc b/lily/grob-scheme.cc index be431b7e10..8d3cc0b4a4 100644 --- a/lily/grob-scheme.cc +++ b/lily/grob-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ @@ -87,16 +87,7 @@ LY_DEFINE (ly_grob_object, "ly:grob-object", return sc->internal_get_object (sym); } -LY_DEFINE (ly_spanner_get_bound, "ly:spanner-bound", - 2, 0, 0, (SCM slur, SCM dir), - "Get one of the bounds of @var{spanner}. @var{dir} is @code{-1} " - "for left, and @code{1} for right.") -{ - Spanner *sl = dynamic_cast (unsmob_grob (slur)); - SCM_ASSERT_TYPE (sl, slur, SCM_ARG1, __FUNCTION__, "spanner grob"); - SCM_ASSERT_TYPE (is_direction (dir), slur, SCM_ARG2, __FUNCTION__, "dir"); - return sl->get_bound (to_dir (dir))->self_scm (); -} + /* TODO: make difference between scaled and unscalead variable in calling (i.e different funcs.) */ @@ -257,20 +248,6 @@ LY_DEFINE (ly_grob_original, "ly:grob-original", return me->original () ? me->original ()->self_scm () : me->self_scm (); } -/* TODO: maybe we should return a vector -- random access is more - logical for this list? */ -LY_DEFINE (ly_spanner_broken_into, "ly:spanner-broken-into", - 1, 0, 0, (SCM spanner), - "Return broken-into list for @var{spanner}.") -{ - Spanner *me = dynamic_cast (unsmob_grob (spanner)); - SCM_ASSERT_TYPE (me, spanner, SCM_ARG1, __FUNCTION__, "spanner"); - - SCM s = SCM_EOL; - for (vsize i = me->broken_intos_.size (); i--;) - s = scm_cons (me->broken_intos_[i]->self_scm (), s); - return s; -} LY_DEFINE (ly_grob_suicide_x, "ly:grob-suicide!", 1, 0, 0, (SCM g), @@ -296,27 +273,6 @@ LY_DEFINE (ly_grob_translate_axis_x, "ly:grob-translate-axis!", return SCM_UNSPECIFIED; } -LY_DEFINE (ly_spanner_p, "ly:spanner?", - 1, 0, 0, (SCM g), - "Is @var{g} a spanner object?") -{ - Grob *me = unsmob_grob (g); - bool b = dynamic_cast (me); - - return ly_bool2scm (b); -} - -LY_DEFINE (ly_grob_key, "ly:grob-key", - 1, 0, 0, - (SCM grob), - "Return the object-key for @var{grob}.") -{ - Grob *me = unsmob_grob (grob); - SCM_ASSERT_TYPE (me, grob, SCM_ARG1, __FUNCTION__, "Grob"); - - return me->key () ? me->key ()->self_scm () : SCM_EOL; -} - LY_DEFINE (ly_grob_default_font, "ly:grob-default-font", 1, 0, 0, (SCM grob), "Return the default font for grob @var{gr}.") diff --git a/lily/grob-smob.cc b/lily/grob-smob.cc index 4fb42c9237..1011d47fdc 100644 --- a/lily/grob-smob.cc +++ b/lily/grob-smob.cc @@ -3,12 +3,13 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "grob.hh" #include "paper-score.hh" +#include "warn.hh" #include "ly-smobs.icc" @@ -19,12 +20,11 @@ IMPLEMENT_TYPE_P (Grob, "ly:grob?"); SCM Grob::mark_smob (SCM ses) { + ASSERT_LIVE_IS_ALLOWED(); + Grob *s = (Grob *) SCM_CELL_WORD_1 (ses); scm_gc_mark (s->immutable_property_alist_); - if (s->key_) - scm_gc_mark (s->key_->self_scm ()); - /* Do not mark the parents. The pointers in the mutable property list form two tree like structures (one for X relations, one for Y relations). Marking these can be done diff --git a/lily/grob.cc b/lily/grob.cc index 139a387989..01b2c7f3e3 100644 --- a/lily/grob.cc +++ b/lily/grob.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "grob.hh" @@ -27,15 +27,13 @@ #include "ly-smobs.icc" Grob * -Grob::clone (int count) const +Grob::clone () const { - return new Grob (*this, count); + return new Grob (*this); } -Grob::Grob (SCM basicprops, - Object_key const *key) +Grob::Grob (SCM basicprops) { - key_ = key; /* FIXME: default should be no callback. */ self_scm_ = SCM_EOL; @@ -51,15 +49,18 @@ Grob::Grob (SCM basicprops, GC. After smobify_self (), they are. */ smobify_self (); - /* - We always get a new key object for a new grob. - */ - if (key_) - ((Object_key *)key_)->unprotect (); - SCM meta = get_property ("meta"); if (scm_is_pair (meta)) - interfaces_ = scm_cdr (scm_assq (ly_symbol2scm ("interfaces"), meta)); + { + interfaces_ = scm_cdr (scm_assq (ly_symbol2scm ("interfaces"), meta)); + + SCM object_cbs = scm_assq (ly_symbol2scm ("object-callbacks"), meta); + if (scm_is_pair (object_cbs)) + { + for (SCM s = scm_cdr (object_cbs); scm_is_pair (s); s = scm_cdr (s)) + set_object (scm_caar (s), scm_cdar (s)); + } + } if (get_property_data ("X-extent") == SCM_EOL) set_property ("X-extent", Grob::stencil_width_proc); @@ -67,10 +68,9 @@ Grob::Grob (SCM basicprops, set_property ("Y-extent", Grob::stencil_height_proc); } -Grob::Grob (Grob const &s, int copy_index) +Grob::Grob (Grob const &s) : dim_cache_ (s.dim_cache_) { - key_ = (use_object_keys) ? new Copied_key (s.key_, copy_index) : 0; original_ = (Grob *) & s; self_scm_ = SCM_EOL; @@ -82,8 +82,6 @@ Grob::Grob (Grob const &s, int copy_index) layout_ = 0; smobify_self (); - if (key_) - ((Object_key *)key_)->unprotect (); } Grob::~Grob () @@ -420,11 +418,11 @@ Grob::extent (Grob *refp, Axis a) const Interval Grob::pure_height (Grob *refp, int start, int end) { - SCM proc = get_property_data ( ly_symbol2scm ("Y-extent")); - Interval iv = robust_scm2interval (call_pure_function (proc, - scm_list_1 (self_scm ()), - start, end), - Interval (0, 0)); + SCM proc = get_property_data (ly_symbol2scm ("Y-extent")); + SCM iv_scm = call_pure_function (proc, + scm_list_1 (self_scm ()), + start, end); + Interval iv = robust_scm2interval (iv_scm, Interval (0, 0)); Real offset = pure_relative_y_coordinate (refp, start, end); SCM min_ext = get_property ("minimum-Y-extent"); @@ -633,15 +631,10 @@ ADD_INTERFACE (Grob, "transparent " ); - - - - /**************************************************************** CALLBACKS ****************************************************************/ - static SCM grob_stencil_extent (Grob *me, Axis a) { diff --git a/lily/guile-init.cc b/lily/guile-init.cc index 77fd7c59f3..8f7cbd8737 100644 --- a/lily/guile-init.cc +++ b/lily/guile-init.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ @@ -41,7 +41,7 @@ ly_init_ly_module (void *) progress_indication ("]\n"); } - scm_primitive_load_path (scm_makfrom0str ("lily.scm")); + scm_primitive_load_path (scm_from_locale_string ("lily.scm")); } SCM global_lily_module; diff --git a/lily/hairpin.cc b/lily/hairpin.cc index e0916cd99d..20808956ae 100644 --- a/lily/hairpin.cc +++ b/lily/hairpin.cc @@ -3,22 +3,21 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "hairpin.hh" #include "dimensions.hh" -#include "font-interface.hh" #include "international.hh" #include "line-interface.hh" -#include "lookup.hh" #include "output-def.hh" #include "paper-column.hh" #include "pointer-group-interface.hh" #include "spanner.hh" #include "staff-symbol-referencer.hh" #include "text-interface.hh" +#include "note-column.hh" #include "warn.hh" MAKE_SCHEME_CALLBACK (Hairpin, after_line_breaking, 1); @@ -167,7 +166,12 @@ Hairpin::print (SCM smob) } else { - x_points[d] = e[d]; + if (Note_column::has_interface (b) + && Note_column::has_rests (b)) + x_points[d] = e[-d]; + else + x_points[d] = e[d]; + Item *bound = me->get_bound (d); if (bound->is_non_musical (bound)) x_points[d] -= d * padding; @@ -242,7 +246,7 @@ Hairpin::print (SCM smob) don't add another circle the hairpin is broken */ if (!broken[tip_dir]) - mol.add_at_edge (X_AXIS, tip_dir, Stencil (circle), 0, 0); + mol.add_at_edge (X_AXIS, tip_dir, Stencil (circle), 0); } mol.translate_axis (x_points[LEFT] diff --git a/lily/hara-kiri-engraver.cc b/lily/hara-kiri-engraver.cc index e899fdb8fd..79fbd11f9d 100644 --- a/lily/hara-kiri-engraver.cc +++ b/lily/hara-kiri-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "axis-group-engraver.hh" diff --git a/lily/hara-kiri-group-spanner.cc b/lily/hara-kiri-group-spanner.cc index 90a06f145a..81e2c7d971 100644 --- a/lily/hara-kiri-group-spanner.cc +++ b/lily/hara-kiri-group-spanner.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ @@ -119,15 +119,6 @@ Hara_kiri_group_spanner::consider_suicide (Grob *me) We can't rely on offsets and dimensions of elements in a hara-kiri group. Use a callback to make sure that hara-kiri has been done before asking for offsets. */ -MAKE_SCHEME_CALLBACK (Hara_kiri_group_spanner, after_line_breaking, 1); -SCM -Hara_kiri_group_spanner::after_line_breaking (SCM smob) -{ - Grob *me = unsmob_grob (smob); - consider_suicide (me); - return SCM_UNSPECIFIED; -} - MAKE_SCHEME_CALLBACK (Hara_kiri_group_spanner, force_hara_kiri_callback, 1); SCM Hara_kiri_group_spanner::force_hara_kiri_callback (SCM smob) diff --git a/lily/horizontal-bracket-engraver.cc b/lily/horizontal-bracket-engraver.cc index d129350af5..d7e453da1f 100644 --- a/lily/horizontal-bracket-engraver.cc +++ b/lily/horizontal-bracket-engraver.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/horizontal-bracket.cc b/lily/horizontal-bracket.cc index d2b016b496..9d92028ac4 100644 --- a/lily/horizontal-bracket.cc +++ b/lily/horizontal-bracket.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "horizontal-bracket.hh" @@ -72,19 +72,25 @@ Horizontal_bracket::make_enclosing_bracket (Grob *me, Grob *refpoint, Grob *common = common_refpoint_of_array (grobs, refpoint, a); Interval ext = Axis_group_interface::relative_group_extent (grobs, common, a); - Stencil b = make_bracket (me, ext.length(), a, dir); - b.translate_axis (ext[LEFT] - refpoint->relative_coordinate (common, a), a); + if (ext.is_empty ()) + { + me->programming_error ("Can't enclose empty extents with bracket"); + return Stencil (); + } + else + { + Stencil b = make_bracket (me, ext.length(), a, dir); + b.translate_axis (ext[LEFT] - refpoint->relative_coordinate (common, a), a); - return b; + return b; + } } - /* TODO: Support texts on the brackets? */ - MAKE_SCHEME_CALLBACK (Horizontal_bracket, print, 1); SCM Horizontal_bracket::print (SCM smob) diff --git a/lily/hyphen-engraver.cc b/lily/hyphen-engraver.cc index 3a1a429102..3e03d9b8e0 100644 --- a/lily/hyphen-engraver.cc +++ b/lily/hyphen-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Glen Prideaux , + (c) 1999--2007 Glen Prideaux , Han-Wen Nienhuys , Jan Nieuwenhuizen */ diff --git a/lily/identifier-smob.cc b/lily/identifier-smob.cc index f1ea027c49..cdfadd3dfc 100644 --- a/lily/identifier-smob.cc +++ b/lily/identifier-smob.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "identifier-smob.hh" diff --git a/lily/includable-lexer.cc b/lily/includable-lexer.cc index 65bea4d00b..617b1ace32 100644 --- a/lily/includable-lexer.cc +++ b/lily/includable-lexer.cc @@ -3,7 +3,7 @@ source file of the LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "includable-lexer.hh" @@ -17,7 +17,7 @@ using namespace std; #include "international.hh" #include "main.hh" #include "source-file.hh" -#include "source.hh" +#include "sources.hh" #include "warn.hh" #ifndef YY_BUF_SIZE @@ -41,19 +41,12 @@ Includable_lexer::Includable_lexer () #if HAVE_FLEXLEXER_YY_CURRENT_BUFFER yy_current_buffer = 0; #endif - allow_includes_b_ = true; } /** Set the new input file to NAME, remember old file. */ void Includable_lexer::new_input (string name, Sources *sources) { - if (!allow_includes_b_) - { - LexerError (_ ("include files are not allowed in safe mode").c_str ()); - return; - } - Source_file *file = sources->get_file (&name); if (!file) { diff --git a/lily/include/accidental-interface.hh b/lily/include/accidental-interface.hh index 8fd57a5fd9..a90680537f 100644 --- a/lily/include/accidental-interface.hh +++ b/lily/include/accidental-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #ifndef ACCIDENTAL_INTERFACE_HH @@ -19,7 +19,9 @@ class Accidental_interface { public: DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM)); + DECLARE_SCHEME_CALLBACK (calc_stencils, (SCM)); + DECLARE_SCHEME_CALLBACK (height, (SCM)); + DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM)); DECLARE_GROB_INTERFACE(); static string get_fontcharname (string style, int alteration); diff --git a/lily/include/accidental-placement.hh b/lily/include/accidental-placement.hh index 5d09bdc2df..f6c17621ed 100644 --- a/lily/include/accidental-placement.hh +++ b/lily/include/accidental-placement.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #ifndef ACCIDENTAL_PLACEMENT_HH diff --git a/lily/include/align-interface.hh b/lily/include/align-interface.hh index 54005bd986..4f1d349141 100644 --- a/lily/include/align-interface.hh +++ b/lily/include/align-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef ALIGN_INTERFACE_HH diff --git a/lily/include/all-font-metrics.hh b/lily/include/all-font-metrics.hh index 34a05e701f..073b839d9a 100644 --- a/lily/include/all-font-metrics.hh +++ b/lily/include/all-font-metrics.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #ifndef ALL_FONTS_HH @@ -43,11 +43,8 @@ public: All_font_metrics (string search_path); ~All_font_metrics (); -#if HAVE_PANGO_FT2 - Pango_font *find_pango_font (PangoFontDescription *description, - Real magnification, + Pango_font *find_pango_font (PangoFontDescription const *description, Real scale); -#endif Font_metric *find_font (string name); Open_type_font *find_otf (string name); diff --git a/lily/include/ambitus.hh b/lily/include/ambitus.hh index d687e20be4..ba46111a60 100644 --- a/lily/include/ambitus.hh +++ b/lily/include/ambitus.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Juergen Reuter + (c) 2000--2007 Juergen Reuter */ #ifndef AMBITUS_HH diff --git a/lily/include/arpeggio.hh b/lily/include/arpeggio.hh index 4d740dbc15..b58fd9e299 100644 --- a/lily/include/arpeggio.hh +++ b/lily/include/arpeggio.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ #ifndef ARPEGGIO_HH diff --git a/lily/include/audio-column.hh b/lily/include/audio-column.hh index 1cc827a276..0b10c8bd4d 100644 --- a/lily/include/audio-column.hh +++ b/lily/include/audio-column.hh @@ -1,7 +1,7 @@ /* audio-column.hh -- declare Audio_column - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #ifndef AUDIO_COLUMN_HH @@ -19,21 +19,18 @@ class Audio_column : public Audio_element { public: - Audio_column (Moment at_mom); + Audio_column (Moment when); void add_audio_item (Audio_item *i); - Moment at_mom () const; + Moment when () const; vector audio_items_; - + Moment when_; + int ticks () const ; protected: - void offset_at_mom (Moment m); + void offset_when (Moment m); friend class Score_performer; -private: - Audio_column (Audio_column const &); - - Moment at_mom_; }; #endif // AUDIO_COLUMN_HH diff --git a/lily/include/audio-element-info.hh b/lily/include/audio-element-info.hh index fd529bfde2..8528670052 100644 --- a/lily/include/audio-element-info.hh +++ b/lily/include/audio-element-info.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef AUDIO_ITEM_INFO_HH diff --git a/lily/include/audio-element.hh b/lily/include/audio-element.hh index 2941c7d105..dac7bddd54 100644 --- a/lily/include/audio-element.hh +++ b/lily/include/audio-element.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef AUDIO_ELEMENT_HH @@ -17,9 +17,8 @@ public: Audio_element (); virtual ~Audio_element (); - VIRTUAL_COPY_CONSTRUCTOR(Audio_element, Audio_element); + DECLARE_CLASSNAME(Audio_element); virtual char const *name () const; -protected: }; #endif // AUDIO_ELEMENT_HH diff --git a/lily/include/audio-item.hh b/lily/include/audio-item.hh index e6f0c9ad91..c02eba58c1 100644 --- a/lily/include/audio-item.hh +++ b/lily/include/audio-item.hh @@ -1,7 +1,7 @@ /* audio-item.hh -- declare Audio_items - (c) 1996--2006 Jan Nieuwenhuizen + (c) 1996--2007 Jan Nieuwenhuizen */ #ifndef AUDIO_ITEM_HH @@ -21,7 +21,10 @@ class Audio_item : public Audio_element public: Audio_item (); Audio_column *audio_column_; + Audio_column *get_column () const; + virtual void render (); + private: Audio_item (Audio_item const &); Audio_item &operator = (Audio_item const &); @@ -30,11 +33,24 @@ private: class Audio_dynamic : public Audio_item { public: - Audio_dynamic (Real volume); + Audio_dynamic (); Real volume_; }; +class Audio_span_dynamic : public Audio_element +{ +public: + Direction grow_dir_; + vector dynamics_; + + + virtual void render (); + void add_absolute (Audio_dynamic*); + Audio_span_dynamic (); +}; + + class Audio_key : public Audio_item { public: @@ -106,5 +122,9 @@ public: int one_beat_; }; +int moment_to_ticks (Moment); +Real moment_to_real (Moment); +Moment remap_grace_duration (Moment); + #endif // AUDIO_ITEM_HH diff --git a/lily/include/audio-staff.hh b/lily/include/audio-staff.hh index fa6e1b9429..6c3da3b1b9 100644 --- a/lily/include/audio-staff.hh +++ b/lily/include/audio-staff.hh @@ -1,7 +1,7 @@ /* audio-staff.hh -- declare Audio_staff - (c) 1996--2006 Jan Nieuwenhuizen + (c) 1996--2007 Jan Nieuwenhuizen */ #ifndef AUDIO_STAFF_HH diff --git a/lily/include/axis-group-engraver.hh b/lily/include/axis-group-engraver.hh index 42b4b8c35f..73388b8d2d 100644 --- a/lily/include/axis-group-engraver.hh +++ b/lily/include/axis-group-engraver.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef AXIS_GROUP_ENGRAVER_HH diff --git a/lily/include/axis-group-interface.hh b/lily/include/axis-group-interface.hh index 4272b1a890..d752a05bb4 100644 --- a/lily/include/axis-group-interface.hh +++ b/lily/include/axis-group-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef AXIS_GROUP_INTERFACE_HH @@ -19,6 +19,8 @@ struct Axis_group_interface static SCM generic_group_extent (Grob *me, Axis a); static SCM pure_group_height (Grob *me, int start, int end); DECLARE_SCHEME_CALLBACK (width, (SCM smob)); + DECLARE_SCHEME_CALLBACK (calc_x_common, (SCM smob)); + DECLARE_SCHEME_CALLBACK (calc_y_common, (SCM smob)); DECLARE_SCHEME_CALLBACK (height, (SCM smob)); DECLARE_SCHEME_CALLBACK (pure_height, (SCM smob, SCM start, SCM end)); DECLARE_SCHEME_CALLBACK (calc_skylines, (SCM smob)); @@ -31,6 +33,7 @@ struct Axis_group_interface static Interval cached_pure_height (Grob *me, vector const &list, Grob *common, int, int); + static Grob *calc_pure_elts_and_common (Grob*); static Skyline_pair skyline_spacing (Grob *me, vector elements); static void add_element (Grob *me, Grob *); static void set_axes (Grob *, Axis, Axis); diff --git a/lily/include/bar-line.hh b/lily/include/bar-line.hh index d7b51cbad9..d1b2625ae6 100644 --- a/lily/include/bar-line.hh +++ b/lily/include/bar-line.hh @@ -1,7 +1,7 @@ /* bar.hh -- part of GNU LilyPond - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef BAR_HH diff --git a/lily/include/bar.hh b/lily/include/bar.hh index ee737a1beb..72b2f1957f 100644 --- a/lily/include/bar.hh +++ b/lily/include/bar.hh @@ -1,7 +1,7 @@ /* bar.hh -- part of GNU LilyPond - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef BAR_HH diff --git a/lily/include/beam.hh b/lily/include/beam.hh index 67daab8de8..412540b076 100644 --- a/lily/include/beam.hh +++ b/lily/include/beam.hh @@ -3,7 +3,7 @@ source file of the LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -34,6 +34,7 @@ struct Beam_quant_parameters Real STEM_LENGTH_LIMIT_PENALTY; Real DAMPING_DIRECTION_PENALTY; Real MUSICAL_DIRECTION_FACTOR; + Real HINT_DIRECTION_PENALTY; Real IDEAL_SLOPE_FACTOR; Real ROUND_TO_ZERO_SLOPE; @@ -68,9 +69,9 @@ bool operator <(Beam_stem_segment const &a, Beam_stem_segment const &b); class Beam { public: - static int visible_stem_count (Grob *); - static Grob *first_visible_stem (Grob *); - static Grob *last_visible_stem (Grob *); + static int normal_stem_count (Grob *); + static Grob *first_normal_stem (Grob *); + static Grob *last_normal_stem (Grob *); DECLARE_GROB_INTERFACE(); static void add_stem (Grob *, Grob *); static bool is_knee (Grob *); @@ -89,6 +90,7 @@ public: DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); DECLARE_SCHEME_CALLBACK (calc_positions, (SCM)); DECLARE_SCHEME_CALLBACK (calc_least_squares_positions, (SCM, SCM)); + DECLARE_SCHEME_CALLBACK (calc_normal_stems, (SCM)); DECLARE_SCHEME_CALLBACK (calc_concaveness, (SCM)); DECLARE_SCHEME_CALLBACK (set_stem_lengths, (SCM)); diff --git a/lily/include/beaming-pattern.hh b/lily/include/beaming-pattern.hh index 5e0c7c30ec..4a9eae6198 100644 --- a/lily/include/beaming-pattern.hh +++ b/lily/include/beaming-pattern.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef BEAMING_PATTERN_HH @@ -13,6 +13,17 @@ #include "moment.hh" #include "lily-proto.hh" +struct Beaming_options +{ + SCM grouping_; + bool subdivide_beams_; + Moment beat_length_; + Moment measure_length_; + + Beaming_options (); + void from_context (Context*); +}; + struct Beam_rhythmic_element { Moment start_moment_; @@ -38,7 +49,7 @@ class Beaming_pattern public: Beaming_pattern (); - void beamify (Context*); + void beamify (Beaming_options const&); void de_grace (); void add_stem (Moment d, int beams); int beamlet_count (int idx, Direction d) const; diff --git a/lily/include/bezier.hh b/lily/include/bezier.hh index 94f207a33b..98886105ee 100644 --- a/lily/include/bezier.hh +++ b/lily/include/bezier.hh @@ -1,7 +1,7 @@ /* bezier.hh -- declare Bezier and Bezier_bow - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #ifndef BEZIER_HH diff --git a/lily/include/book-paper-def.hh b/lily/include/book-paper-def.hh index ee0c4a15a3..919b0e8e42 100644 --- a/lily/include/book-paper-def.hh +++ b/lily/include/book-paper-def.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Jan Nieuwenhuizen + (c) 2004--2007 Jan Nieuwenhuizen */ #ifndef BOOK_PAPER_DEF_HH diff --git a/lily/include/book.hh b/lily/include/book.hh index 03553138d5..cf47843238 100644 --- a/lily/include/book.hh +++ b/lily/include/book.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef BOOK_HH @@ -11,9 +11,9 @@ #include "lily-proto.hh" #include "std-vector.hh" -#include "object-key.hh" #include "std-string.hh" #include "virtual-methods.hh" +#include "smobs.hh" class Book { diff --git a/lily/include/break-align-interface.hh b/lily/include/break-align-interface.hh index 421043b24c..ba68a874af 100644 --- a/lily/include/break-align-interface.hh +++ b/lily/include/break-align-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef BREAK_ALIGN_INTERFACE_HH diff --git a/lily/include/breathing-sign.hh b/lily/include/breathing-sign.hh index 69d46e67a2..449740d418 100644 --- a/lily/include/breathing-sign.hh +++ b/lily/include/breathing-sign.hh @@ -1,7 +1,7 @@ /* breathing-sign.hh - Copyright (c) 1999--2006 Michael Krause + Copyright (c) 1999--2007 Michael Krause written for the GNU LilyPond music typesetter */ diff --git a/lily/include/chord-name.hh b/lily/include/chord-name.hh index f5c805684f..2123ffa442 100644 --- a/lily/include/chord-name.hh +++ b/lily/include/chord-name.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Jan Nieuwenhuizen + (c) 1999--2007 Jan Nieuwenhuizen */ #ifndef CHORD_NAME_HH diff --git a/lily/include/chord-tremolo-iterator.hh b/lily/include/chord-tremolo-iterator.hh index d1d407dd1f..c6a40afc0e 100644 --- a/lily/include/chord-tremolo-iterator.hh +++ b/lily/include/chord-tremolo-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef CHORD_TREMOLO_ITERATOR_HH diff --git a/lily/include/clef.hh b/lily/include/clef.hh index 6595fc4687..bc6550fe4e 100644 --- a/lily/include/clef.hh +++ b/lily/include/clef.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef CLEF_HH diff --git a/lily/include/cluster.hh b/lily/include/cluster.hh index 75090102e6..3081b1b093 100644 --- a/lily/include/cluster.hh +++ b/lily/include/cluster.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Juergen Reuter + (c) 2002--2007 Juergen Reuter */ #ifndef CLUSTER_HH diff --git a/lily/include/coherent-ligature-engraver.hh b/lily/include/coherent-ligature-engraver.hh index 89eb6b9e32..4009f57041 100644 --- a/lily/include/coherent-ligature-engraver.hh +++ b/lily/include/coherent-ligature-engraver.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Juergen Reuter + (c) 2003--2007 Juergen Reuter */ #ifndef COHERENT_LIGATURE_ENGRAVER_HH #define COHERENT_LIGATURE_ENGRAVER_HH diff --git a/lily/include/column-x-positions.hh b/lily/include/column-x-positions.hh index aeb3060048..a562235f9e 100644 --- a/lily/include/column-x-positions.hh +++ b/lily/include/column-x-positions.hh @@ -1,7 +1,7 @@ /* column-x-positions.hh -- part of GNU LilyPond - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef COLUMN_X_POSITIONS_HH diff --git a/lily/include/constrained-breaking.hh b/lily/include/constrained-breaking.hh index e1401f1614..502e8c234a 100644 --- a/lily/include/constrained-breaking.hh +++ b/lily/include/constrained-breaking.hh @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #ifndef CONSTRAINED_BREAKING_HH diff --git a/lily/include/context-def.hh b/lily/include/context-def.hh index ac7b776208..dd4df4c802 100644 --- a/lily/include/context-def.hh +++ b/lily/include/context-def.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef CONTEXT_DEF_HH @@ -50,7 +50,7 @@ public: vector path_to_acceptable_context (SCM type_string, Output_def *) const; - Context *instantiate (SCM extra_ops, Object_key const *); + Context *instantiate (SCM extra_ops); SCM to_alist () const; static SCM make_scm (); diff --git a/lily/include/context-handle.hh b/lily/include/context-handle.hh index e32bc29cb7..98898ccb50 100644 --- a/lily/include/context-handle.hh +++ b/lily/include/context-handle.hh @@ -3,16 +3,14 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ -#ifndef INTERPRETATION_CONTEXT_HANDLE_HH -#define INTERPRETATION_CONTEXT_HANDLE_HH +#ifndef CONTEXT_HANDLE_HH +#define CONTEXT_HANDLE_HH + #include "lily-proto.hh" -/* - Rename me to Context_handle. -*/ class Context_handle { @@ -32,5 +30,5 @@ private: void up (Context *); }; -#endif /* INTERPRETATION_CONTEXT_HANDLE_HH */ +#endif /* CONTEXT_HANDLE_HH */ diff --git a/lily/include/context-key-manager.hh b/lily/include/context-key-manager.hh deleted file mode 100644 index db7078fd42..0000000000 --- a/lily/include/context-key-manager.hh +++ /dev/null @@ -1,43 +0,0 @@ -/* - context-key-manager.hh -- declare Context_key_manager - - source file of the GNU LilyPond music typesetter - - (c) 2006 Han-Wen Nienhuys - -*/ - -#ifndef CONTEXT_KEY_MANAGER_HH -#define CONTEXT_KEY_MANAGER_HH - -#include "lily-proto.hh" - -#include -using namespace std; - -class Context_key_manager -{ - Object_key const *key_; - map grob_counts_; - map context_counts_; - - -protected: - friend class Context; - - Context_key_manager (Object_key const *); - Context_key_manager (Context_key_manager const &src); - - - void unprotect () const; - void gc_mark () const; - void clear (); - Object_key const *key () const { return key_; } - Object_key const *create_grob_key (Moment, string); - Object_key const *get_grob_key (Moment, string); - Object_key const *get_context_key (Moment, string, string); -}; - -#endif /* CONTEXT_KEY_MANAGER_HH */ - - diff --git a/lily/include/context.hh b/lily/include/context.hh index 8eba283027..39babf7b66 100644 --- a/lily/include/context.hh +++ b/lily/include/context.hh @@ -3,17 +3,18 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef CONTEXT_HH #define CONTEXT_HH -#include "context-key-manager.hh" #include "listener.hh" #include "moment.hh" #include "std-vector.hh" #include "virtual-methods.hh" +#include "scm-hash.hh" +#include "lily-proto.hh" class Context { @@ -37,7 +38,6 @@ protected: SCM definition_; /* Additions to the Context_def, given by \with */ SCM definition_mods_; - Context_key_manager key_manager_; SCM properties_scm_; SCM context_list_; @@ -59,15 +59,11 @@ protected: friend class Context_def; // UGH! initialises implementation_ friend SCM ly_make_global_translator (SCM); - void clear_key_disambiguations (); DECLARE_LISTENER (set_property_from_event); DECLARE_LISTENER (unset_property_from_event); public: - Object_key const *get_grob_key (string name); - Object_key const *get_context_key (string name, string id); - string id_string () const { return id_string_; } SCM children_contexts () const { return context_list_; } SCM default_child_context_name () const; @@ -81,7 +77,7 @@ public: Translator_group *implementation () const { return implementation_; } Context *get_parent_context () const; - Context (Object_key const *); + Context (); /* properties: */ SCM internal_get_property (SCM name_sym) const; @@ -89,11 +85,7 @@ public: Context *where_defined (SCM name_sym, SCM *value) const; void unset_property (SCM var_sym); -#ifndef NDEBUG - void internal_set_property (SCM var_sym, SCM value, char const *file, int line, char const *fun); -#else void internal_set_property (SCM var_sym, SCM value); -#endif Context *create_context (Context_def *, string, SCM); DECLARE_LISTENER (create_context_from_event); diff --git a/lily/include/custos.hh b/lily/include/custos.hh index d1a26ab4a4..2bb73fbe67 100644 --- a/lily/include/custos.hh +++ b/lily/include/custos.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Juergen Reuter + (c) 2000--2007 Juergen Reuter */ #ifndef CUSTOS_HH diff --git a/lily/include/dimension-cache-callback.hh b/lily/include/dimension-cache-callback.hh index 37f860510f..719a9ea3de 100644 --- a/lily/include/dimension-cache-callback.hh +++ b/lily/include/dimension-cache-callback.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef DIMENSION_CACHE_CALLBACK_HH diff --git a/lily/include/dimension-cache.hh b/lily/include/dimension-cache.hh index fa9147838a..b1e9aba043 100644 --- a/lily/include/dimension-cache.hh +++ b/lily/include/dimension-cache.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #ifndef DIMENSION_CACHE_HH diff --git a/lily/include/directional-element-interface.hh b/lily/include/directional-element-interface.hh index 7da0eae623..7fd4169559 100644 --- a/lily/include/directional-element-interface.hh +++ b/lily/include/directional-element-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef DIRECTIONAL_ELEMENT_HH diff --git a/lily/include/dot-column.hh b/lily/include/dot-column.hh index 503b1425ae..8ef01bed2b 100644 --- a/lily/include/dot-column.hh +++ b/lily/include/dot-column.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef DOT_COLUMN_HH diff --git a/lily/include/dots.hh b/lily/include/dots.hh index df1d37289b..cac34cbaf3 100644 --- a/lily/include/dots.hh +++ b/lily/include/dots.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef DOTS_HH diff --git a/lily/include/duration.hh b/lily/include/duration.hh index b3e7841f08..e337ac58cb 100644 --- a/lily/include/duration.hh +++ b/lily/include/duration.hh @@ -3,7 +3,7 @@ source file of the LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #ifndef DURATION_HH diff --git a/lily/include/engraver-group.hh b/lily/include/engraver-group.hh index 3fa99e638e..8e67651af5 100644 --- a/lily/include/engraver-group.hh +++ b/lily/include/engraver-group.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef ENGRAVER_GROUP_HH diff --git a/lily/include/engraver.hh b/lily/include/engraver.hh index 493c9c98d8..5f74491e94 100644 --- a/lily/include/engraver.hh +++ b/lily/include/engraver.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef ENGRAVER_HH diff --git a/lily/include/event-chord-iterator.hh b/lily/include/event-chord-iterator.hh index a252e871fe..307f5ba0c6 100644 --- a/lily/include/event-chord-iterator.hh +++ b/lily/include/event-chord-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef EVENT_CHORD_ITERATOR_HH diff --git a/lily/include/event-iterator.hh b/lily/include/event-iterator.hh index ce2809c8ea..2b8368b984 100644 --- a/lily/include/event-iterator.hh +++ b/lily/include/event-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys Erik Sandberg */ diff --git a/lily/include/file-name-map.hh b/lily/include/file-name-map.hh index 35697d753d..74d96a28bf 100644 --- a/lily/include/file-name-map.hh +++ b/lily/include/file-name-map.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef FILE_NAME_MAP_HH diff --git a/lily/include/folded-repeat-iterator.hh b/lily/include/folded-repeat-iterator.hh index 239b7941f0..d32f77d57f 100644 --- a/lily/include/folded-repeat-iterator.hh +++ b/lily/include/folded-repeat-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef FOLDED_REPEAT_ITERATOR_HH diff --git a/lily/include/font-interface.hh b/lily/include/font-interface.hh index cc68af60d7..ec8f680f32 100644 --- a/lily/include/font-interface.hh +++ b/lily/include/font-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef FONT_INTERFACE_HH diff --git a/lily/include/font-metric.hh b/lily/include/font-metric.hh index 1107ba9af8..f77d394599 100644 --- a/lily/include/font-metric.hh +++ b/lily/include/font-metric.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef FONT_METRIC_HH diff --git a/lily/include/freetype.hh b/lily/include/freetype.hh index 416c85984c..1b6dad26e8 100644 --- a/lily/include/freetype.hh +++ b/lily/include/freetype.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef FREETYPE_HH @@ -19,5 +19,7 @@ extern FT_Library freetype2_library; FT_Face open_ft_face (string str); +string freetype_error_string (int code); + #endif /* FREETYPE_HH */ diff --git a/lily/include/global-context.hh b/lily/include/global-context.hh index 75172595cc..540d96654b 100644 --- a/lily/include/global-context.hh +++ b/lily/include/global-context.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef GLOBAL_CONTEXT_HH @@ -21,7 +21,7 @@ class Global_context : public virtual Context friend class Output_def; public: - Global_context (Output_def *, Object_key *key); + Global_context (Output_def *); int get_moments_left () const; Moment sneaky_insert_extra_moment (Moment); void add_moment_to_process (Moment); diff --git a/lily/include/global-ctor.hh b/lily/include/global-ctor.hh index 8a45bf582a..7b10975331 100644 --- a/lily/include/global-ctor.hh +++ b/lily/include/global-ctor.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef GLOBAL_CTOR_HH diff --git a/lily/include/grace-fixup.hh b/lily/include/grace-fixup.hh index c8d8f850b9..93491d163d 100644 --- a/lily/include/grace-fixup.hh +++ b/lily/include/grace-fixup.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef GRACE_FIXUP_HH diff --git a/lily/include/grace-iterator.hh b/lily/include/grace-iterator.hh index 87fd730c7e..f4e64de693 100644 --- a/lily/include/grace-iterator.hh +++ b/lily/include/grace-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef NEWGRACE_ITERATOR_HH diff --git a/lily/include/gregorian-ligature-engraver.hh b/lily/include/gregorian-ligature-engraver.hh index 1016993c4c..1a6ef77133 100644 --- a/lily/include/gregorian-ligature-engraver.hh +++ b/lily/include/gregorian-ligature-engraver.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Juergen Reuter + (c) 2003--2007 Juergen Reuter */ #ifndef GREGORIAN_LIGATURE_ENGRAVER_HH #define GREGORIAN_LIGATURE_ENGRAVER_HH diff --git a/lily/include/gregorian-ligature.hh b/lily/include/gregorian-ligature.hh index 07b0ba11ef..b874311c25 100644 --- a/lily/include/gregorian-ligature.hh +++ b/lily/include/gregorian-ligature.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Juergen Reuter + (c) 2003--2007 Juergen Reuter */ #ifndef GREGORIAN_LIGATURE_HH diff --git a/lily/include/grid-line-interface.hh b/lily/include/grid-line-interface.hh index abb02c9488..c0b8753379 100644 --- a/lily/include/grid-line-interface.hh +++ b/lily/include/grid-line-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef GRID_LINE_INTERFACE_HH diff --git a/lily/include/grob-array.hh b/lily/include/grob-array.hh index e5cee3d10d..f0eb32d01d 100644 --- a/lily/include/grob-array.hh +++ b/lily/include/grob-array.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef GROB_ARRAY_HH diff --git a/lily/include/grob-info.hh b/lily/include/grob-info.hh index b92f033718..01ae110b37 100644 --- a/lily/include/grob-info.hh +++ b/lily/include/grob-info.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef STAFFELEMINFO_HH diff --git a/lily/include/grob-interface.hh b/lily/include/grob-interface.hh index f6a92c0afe..fe1d5565d9 100644 --- a/lily/include/grob-interface.hh +++ b/lily/include/grob-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #ifndef INTERFACE_HH diff --git a/lily/include/grob-pitch-tuple.hh b/lily/include/grob-pitch-tuple.hh index 325e3fa0a4..e69de29bb2 100644 --- a/lily/include/grob-pitch-tuple.hh +++ b/lily/include/grob-pitch-tuple.hh @@ -1,30 +0,0 @@ -/* - grob-pitch-tuple.hh -- declare Grob_pitch_tuple - - source file of the GNU LilyPond music typesetter - - (c) 2001--2006 Han-Wen Nienhuys -*/ - -#ifndef GROB_PITCH_TUPLE_HH -#define GROB_PITCH_TUPLE_HH - -#include "pitch.hh" -#include "moment.hh" - -struct Grob_pitch_tuple -{ - Pitch pitch_; - Grob *head_; - Moment end_; - - Grob_pitch_tuple (); - Grob_pitch_tuple (Grob *, Music *, Moment); - static int pitch_compare (Grob_pitch_tuple const &, Grob_pitch_tuple const &); - static int time_compare (Grob_pitch_tuple const &, Grob_pitch_tuple const &); -}; - -int compare (Grob_pitch_tuple const &, Grob_pitch_tuple const &); - -#endif /* GROB_PITCH_TUPLE_HH */ - diff --git a/lily/include/grob.hh b/lily/include/grob.hh index 3a06afda20..bcd101b98e 100644 --- a/lily/include/grob.hh +++ b/lily/include/grob.hh @@ -3,7 +3,7 @@ source file of the LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef GROB_HH @@ -13,7 +13,6 @@ #include "virtual-methods.hh" #include "dimension-cache.hh" #include "grob-interface.hh" -#include "object-key.hh" class Grob { @@ -28,7 +27,6 @@ protected: Dimension_cache dim_cache_[NO_AXES]; Output_def *layout_; Grob *original_; - Object_key const *key_; /* SCM data */ SCM immutable_property_alist_; @@ -44,6 +42,9 @@ protected: void substitute_object_links (SCM, SCM); Real get_offset (Axis a) const; SCM try_callback (SCM, SCM); + SCM try_callback_on_alist (SCM *, SCM, SCM); + void internal_set_value_on_alist (SCM *alist, SCM sym, SCM val); + public: /* friends */ @@ -62,12 +63,11 @@ public: Output_def *layout () const { return layout_; } Grob *original () const { return original_; } SCM interfaces () const { return interfaces_; } - Object_key const *key () const { return key_; } /* life & death */ - Grob (SCM basic_props, Object_key const *); - Grob (Grob const &, int copy_count); - virtual Grob *clone (int count) const; + Grob (SCM basic_props); + Grob (Grob const &); + virtual Grob *clone () const; /* forced death */ void suicide (); @@ -83,12 +83,7 @@ public: SCM internal_get_object (SCM symbol) const; void internal_set_object (SCM sym, SCM val); void internal_del_property (SCM symbol); - -#ifndef NDEBUG - void internal_set_property (SCM sym, SCM val, char const *file, int line, char const *fun); -#else void internal_set_property (SCM sym, SCM val); -#endif /* messages */ void warning (string) const; diff --git a/lily/include/group-interface.hh b/lily/include/group-interface.hh index 67aa59a8b6..7a428ee150 100644 --- a/lily/include/group-interface.hh +++ b/lily/include/group-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef GROUP_INTERFACE_HH diff --git a/lily/include/hairpin.hh b/lily/include/hairpin.hh index 0d7c92ff23..b9c538074b 100644 --- a/lily/include/hairpin.hh +++ b/lily/include/hairpin.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef HAIRPIN_HH diff --git a/lily/include/hara-kiri-group-spanner.hh b/lily/include/hara-kiri-group-spanner.hh index 42692c7396..6505287a4d 100644 --- a/lily/include/hara-kiri-group-spanner.hh +++ b/lily/include/hara-kiri-group-spanner.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #ifndef HARA_KIRI_VERTICAL_GROUP_SPANNER_HH diff --git a/lily/include/horizontal-bracket.hh b/lily/include/horizontal-bracket.hh index d8cbef6c06..283ec637ea 100644 --- a/lily/include/horizontal-bracket.hh +++ b/lily/include/horizontal-bracket.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef HORIZONTAL_BRACKET_HH diff --git a/lily/include/identifier-smob.hh b/lily/include/identifier-smob.hh index 0f83f6d85e..43260be8f4 100644 --- a/lily/include/identifier-smob.hh +++ b/lily/include/identifier-smob.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #ifndef IDENTIFIER_SMOB_HH diff --git a/lily/include/includable-lexer.hh b/lily/include/includable-lexer.hh index 5f03e97854..768e759b54 100644 --- a/lily/include/includable-lexer.hh +++ b/lily/include/includable-lexer.hh @@ -3,7 +3,7 @@ source file of the LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef INCLUDABLE_LEXER_HH @@ -33,7 +33,6 @@ protected: vector char_count_stack_; public: - bool allow_includes_b_; Includable_lexer (); ~Includable_lexer (); @@ -42,9 +41,10 @@ public: vector file_name_strings_; Source_file *get_source_file () const; - void new_input (string s, Sources *); + virtual void new_input (string s, Sources *); + void new_input (string name, string data, Sources *); - + char const *here_str0 () const; }; diff --git a/lily/include/input.hh b/lily/include/input.hh index 15f54aef22..d3cad35778 100644 --- a/lily/include/input.hh +++ b/lily/include/input.hh @@ -3,7 +3,7 @@ source file of the LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef INPUT_HH diff --git a/lily/include/item.hh b/lily/include/item.hh index cb8c61523e..d00541a8bf 100644 --- a/lily/include/item.hh +++ b/lily/include/item.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef ITEM_HH #define ITEM_HH @@ -22,10 +22,10 @@ class Item : public Grob DECLARE_CLASSNAME(Item); public: - Item (SCM, Object_key const *); - Item (Item const &, int count); + Item (SCM); + Item (Item const &); - virtual Grob *clone (int count) const; + virtual Grob *clone () const; static bool is_non_musical (Grob *); bool is_broken () const; diff --git a/lily/include/keyword.hh b/lily/include/keyword.hh index ba4867204d..3a8a287f7c 100644 --- a/lily/include/keyword.hh +++ b/lily/include/keyword.hh @@ -1,7 +1,7 @@ /* keyword.hh -- part of GNU LilyPond - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef KEYWORD_HH diff --git a/lily/include/kpath.hh b/lily/include/kpath.hh index f71d891537..0e7c64d6cb 100644 --- a/lily/include/kpath.hh +++ b/lily/include/kpath.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef KPATH_HH diff --git a/lily/include/least-squares.hh b/lily/include/least-squares.hh index 49a5574f1f..9fcbee19fb 100644 --- a/lily/include/least-squares.hh +++ b/lily/include/least-squares.hh @@ -1,7 +1,7 @@ /* leastsquare.hh -- part of GNU LilyPond - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef LEASTSQUARE_HH diff --git a/lily/include/ligature-engraver.hh b/lily/include/ligature-engraver.hh index 2ae5cb4fe9..ccdcb45299 100644 --- a/lily/include/ligature-engraver.hh +++ b/lily/include/ligature-engraver.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Juergen Reuter + (c) 2002--2007 Juergen Reuter */ #ifndef LIGATURE_ENGRAVER_HH diff --git a/lily/include/lily-guile-macros.hh b/lily/include/lily-guile-macros.hh index d349cdb7c9..555d65bfd3 100644 --- a/lily/include/lily-guile-macros.hh +++ b/lily/include/lily-guile-macros.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef LILY_GUILE_MACROS_HH @@ -169,7 +169,11 @@ ly_add_function_documentation (SCM proc, char const *fname, #define del_property(x) internal_del_property (ly_symbol2scm (x)) #ifndef NDEBUG -#define set_property(x, y) internal_set_property (ly_symbol2scm (x), y, __FILE__, __LINE__, __FUNCTION__) +/* + TODO: include modification callback support here, perhaps + through intermediate Grob::instrumented_set_property( .. __LINE__ ). + */ +#define set_property(x, y) internal_set_property (ly_symbol2scm (x), y) #else #define set_property(x, y) internal_set_property (ly_symbol2scm (x), y) #endif diff --git a/lily/include/lily-guile.hh b/lily/include/lily-guile.hh index 6aa25f828a..6f21a29b03 100644 --- a/lily/include/lily-guile.hh +++ b/lily/include/lily-guile.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #ifndef LILY_GUILE_HH @@ -32,17 +32,15 @@ A ly_B2A (B b); */ SCM ly_last (SCM list); -SCM ly_write2scm (SCM s); +string ly_scm_write_string (SCM s); SCM ly_deep_copy (SCM); SCM ly_truncate_list (int k, SCM lst); -SCM ly_to_string (SCM scm); -SCM ly_to_symbol (SCM scm); - extern SCM global_lily_module; string gulp_file_to_string (string fn, bool must_exist, int size); +SCM ly_string2scm (string const &s); string ly_scm2string (SCM s); string ly_symbol2string (SCM); Rational ly_scm2rational (SCM); @@ -67,6 +65,7 @@ Drul_array robust_scm2booldrul (SCM, Drul_array); Interval robust_scm2interval (SCM, Drul_array); Offset robust_scm2offset (SCM, Offset); string robust_scm2string (SCM, string); +Rational robust_scm2rational (SCM, Rational); SCM ly_quote_scm (SCM s); @@ -81,13 +80,10 @@ SCM alist_to_hashq (SCM); SCM ly_alist_vals (SCM alist); SCM ly_hash2alist (SCM tab); SCM ly_hash_table_keys (SCM tab); -int procedure_arity (SCM); -/* inserts at front, removing dublicates */ -inline SCM ly_assoc_front_x (SCM alist, SCM key, SCM val) -{ - return scm_acons (key, val, scm_assoc_remove_x (alist, key)); -} +SCM ly_assoc_prepend_x (SCM alist, SCM key, SCM val); +inline bool ly_is_fraction (SCM x) { return SCM_FRACTIONP(x) || scm_is_integer (x); } + inline bool ly_is_list (SCM x) { return SCM_NFALSEP (scm_list_p (x)); } inline bool ly_is_procedure (SCM x) { return SCM_NFALSEP (scm_procedure_p (x)); } inline bool ly_is_port (SCM x) { return SCM_NFALSEP (scm_port_p (x)); } diff --git a/lily/include/lily-lexer.hh b/lily/include/lily-lexer.hh index 994d185f6f..bfa36a5a83 100644 --- a/lily/include/lily-lexer.hh +++ b/lily/include/lily-lexer.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef MY_LILY_LEXER_HH @@ -55,7 +55,7 @@ public: Lily_lexer (Sources *, Lily_parser *); Lily_lexer (Lily_lexer const &, Lily_parser *); int yylex (); - + void add_lexed_char (int); void prepare_for_next_token (); @@ -69,6 +69,9 @@ public: void start_main_input (); + virtual void new_input (string s, Sources *); + virtual void new_input (string s, string d, Sources *); + SCM keyword_list () const; SCM lookup_identifier (string s); SCM lookup_identifier_symbol (SCM s); diff --git a/lily/include/lily-parser.hh b/lily/include/lily-parser.hh index b07734769a..e9a42109e0 100644 --- a/lily/include/lily-parser.hh +++ b/lily/include/lily-parser.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef LILY_PARSER_HH @@ -57,6 +57,8 @@ public: void parser_error (string); void parser_error (Input const &, string); void set_yydebug (bool); + + SCM make_scope () const; }; DECLARE_UNSMOB (Lily_parser, lily_parser); diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh index d0b7c65b64..fca8aa372f 100644 --- a/lily/include/lily-proto.hh +++ b/lily/include/lily-proto.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef LILY_PROTO_HH @@ -90,6 +90,7 @@ class Mensural_ligature_engraver; class Midi_chunk; class Midi_duration; class Midi_dynamic; +class Midi_event; class Midi_header; class Midi_instrument; class Midi_item; diff --git a/lily/include/lily-version.hh b/lily/include/lily-version.hh index eab4462df2..7a97fbba59 100644 --- a/lily/include/lily-version.hh +++ b/lily/include/lily-version.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Jan Nieuwenhuizen + (c) 1999--2007 Jan Nieuwenhuizen */ #ifndef LILY_VERSION_HH diff --git a/lily/include/lilypond-key.hh b/lily/include/lilypond-key.hh deleted file mode 100644 index 4196ffd5f2..0000000000 --- a/lily/include/lilypond-key.hh +++ /dev/null @@ -1,77 +0,0 @@ -/* - lilypond-key.hh -- declare Lilypond_{grob, context}_key - - source file of the GNU LilyPond music typesetter - - (c) 2004--2006 Han-Wen Nienhuys -*/ - -#ifndef LILYPOND_KEY_HH -#define LILYPOND_KEY_HH - -#include "object-key.hh" -#include "lily-proto.hh" -#include "moment.hh" - -class Lilypond_grob_key : public Object_key -{ - Object_key const *context_; - Moment creation_moment_; - string grob_name_; - int disambiguation_count_; - -public: - Lilypond_grob_key (Object_key const *context, - Moment start, - string name, int); - - static Object_key *from_scheme (SCM); -protected: - virtual int get_type () const; - virtual void derived_mark () const; - virtual int do_compare (Object_key const *a) const; - virtual SCM as_scheme () const; -}; - -class Lilypond_context_key : public Object_key -{ - Object_key const *parent_context_; - Moment start_moment_; - string context_name_; - string id_; - int disambiguation_count_; - -public: - Lilypond_context_key (Object_key const *parent, - Moment start, - string type, - string id, - int count); - - static Object_key *from_scheme (SCM); -protected: - virtual int get_type () const; - virtual int do_compare (Object_key const *a) const; - virtual void derived_mark () const; - virtual SCM as_scheme () const; -}; - -class Lilypond_general_key : public Object_key -{ - Object_key const *parent_; - string name_; - int disambiguation_count_; -public: - Lilypond_general_key (Object_key const *parent, string name, - int count); - - static Object_key *from_scheme (SCM); -protected: - virtual int get_type () const; - virtual int do_compare (Object_key const *a) const; - virtual void derived_mark () const; - virtual SCM as_scheme () const; -}; - -#endif /* LILYPOND_KEY_HH */ - diff --git a/lily/include/lilypond-version.hh b/lily/include/lilypond-version.hh index 12c4782205..32ba91198d 100644 --- a/lily/include/lilypond-version.hh +++ b/lily/include/lilypond-version.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #ifndef LILYPOND_VERSION_HH diff --git a/lily/include/line-interface.hh b/lily/include/line-interface.hh index ec33ce93c6..7746a735e8 100644 --- a/lily/include/line-interface.hh +++ b/lily/include/line-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef LINE_INTERFACE_HH diff --git a/lily/include/line-spanner.hh b/lily/include/line-spanner.hh index de1170b6b0..ceff6f6a99 100644 --- a/lily/include/line-spanner.hh +++ b/lily/include/line-spanner.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ #ifndef LINE_SPANNER_HH diff --git a/lily/include/lookup.hh b/lily/include/lookup.hh index db5f2d9cc7..ec8aeede49 100644 --- a/lily/include/lookup.hh +++ b/lily/include/lookup.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -31,6 +31,7 @@ struct Lookup static Stencil repeat_slash (Real w, Real slope, Real th); static Stencil horizontal_line (Interval w, Real th); static Stencil triangle (Interval, Real, Real); + static Stencil points_to_line_stencil (Real thick, vector const &points); }; #endif // LOOKUP_HH diff --git a/lily/include/ly-module.hh b/lily/include/ly-module.hh index f4aaabbd80..17595408a7 100644 --- a/lily/include/ly-module.hh +++ b/lily/include/ly-module.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #ifndef LY_MODULE_HH #define LY_MODULE_HH diff --git a/lily/include/ly-smobs.icc b/lily/include/ly-smobs.icc index 99c09fc043..a77da17fc8 100644 --- a/lily/include/ly-smobs.icc +++ b/lily/include/ly-smobs.icc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef LY_SMOBS_ICC @@ -96,9 +96,10 @@ This is local. We don't assign to self_scm_ directly, to assure \ that S isn't GC-ed from under us. \ \ - We don't use smobbed_self () to ensure that mark_smob () doesn't have to \ - deal half-initialized objects: scm_done_malloc ( ) might trigger GC. \ - the warning in smobs.hh is just to be doubleplus goodly sure \ + We don't use smobbed_self () to ensure that mark_smob () doesn't \ + have to deal half-initialized objects: scm_done_malloc ( ) might \ + trigger GC.the warning in smobs.hh is just to be doubleplus \ + goodly sure \ */ \ SCM s; \ SCM_NEWSMOB (s, CL::smob_tag_, this); \ diff --git a/lily/include/lyric-extender.hh b/lily/include/lyric-extender.hh index 4d891f8c14..d95060be9a 100644 --- a/lily/include/lyric-extender.hh +++ b/lily/include/lyric-extender.hh @@ -2,7 +2,7 @@ /* extender-spanner.hh -- part of GNU LilyPond - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #ifndef EXTENDER_SPANNER_HH diff --git a/lily/include/lyric-hyphen.hh b/lily/include/lyric-hyphen.hh index b5377ae82a..b6ac1dce82 100644 --- a/lily/include/lyric-hyphen.hh +++ b/lily/include/lyric-hyphen.hh @@ -1,7 +1,7 @@ /* hyphen-spanner.hh -- part of GNU LilyPond - (c) 1999--2006 Glen Prideaux + (c) 1999--2007 Glen Prideaux */ #ifndef HYPHEN_SPANNER_HH diff --git a/lily/include/main.hh b/lily/include/main.hh index 5369507628..69aa8899c7 100644 --- a/lily/include/main.hh +++ b/lily/include/main.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef MAIN_HH #define MAIN_HH @@ -38,6 +38,9 @@ extern bool point_and_click_global; extern string prefix_directory; extern bool use_object_keys; extern bool strict_infinity_checking; +extern string init_scheme_code_global; +extern string init_scheme_variables_global; + /* todo: collect in Output_option struct? */ diff --git a/lily/include/measure-grouping-spanner.hh b/lily/include/measure-grouping-spanner.hh index ef481714ee..443c06b91c 100644 --- a/lily/include/measure-grouping-spanner.hh +++ b/lily/include/measure-grouping-spanner.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #ifndef MEASURE_GROUPING_SPANNER_HH diff --git a/lily/include/melody-spanner.hh b/lily/include/melody-spanner.hh index 0b67613cfa..7f20f8a343 100644 --- a/lily/include/melody-spanner.hh +++ b/lily/include/melody-spanner.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/include/mensural-ligature.hh b/lily/include/mensural-ligature.hh index afb04a2ef2..2ef7f511b9 100644 --- a/lily/include/mensural-ligature.hh +++ b/lily/include/mensural-ligature.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Juergen Reuter , + (c) 2002--2007 Juergen Reuter , Pal Benko */ diff --git a/lily/include/midi-chunk.hh b/lily/include/midi-chunk.hh new file mode 100644 index 0000000000..fc41a541f0 --- /dev/null +++ b/lily/include/midi-chunk.hh @@ -0,0 +1,75 @@ +/* + midi-chunk.hh -- declare Midi_chunk + + source file of the GNU LilyPond music typesetter + + (c) 2007 Han-Wen Nienhuys + +*/ + +#ifndef MIDI_CHUNK_HH +#define MIDI_CHUNK_HH + +#include "lily-proto.hh" +#include "virtual-methods.hh" +#include "std-vector.hh" + + +/** + timed MIDI event +*/ +class Midi_event +{ +public: + Midi_event (int delta, Midi_item *midi); + + int delta_ticks_; + Midi_item *midi_; + string to_string () const; +}; + + + + +/** + variable sized MIDI data +*/ +class Midi_chunk +{ +public: + void set (string header_string, string data_string, string footer_string); + virtual string to_string () const; + virtual string data_string () const; + DECLARE_CLASSNAME(Midi_chunk); + virtual ~Midi_chunk (); +private: + string data_string_; + string footer_string_; + string header_string_; +}; + +class Midi_header : public Midi_chunk +{ +public: + DECLARE_CLASSNAME(Midi_header); + + Midi_header (int format_i, int tracks_i, int clocks_per_4_i); +}; + +class Midi_track : public Midi_chunk +{ +public: + int number_; + DECLARE_CLASSNAME(Midi_track); + + vector events_; + + Midi_track (); + ~Midi_track (); + + void add (int, Midi_item *midi); + virtual string data_string () const; +}; + +#endif /* MIDI_CHUNK_HH */ + diff --git a/lily/include/midi-item.hh b/lily/include/midi-item.hh index a7e7ceb512..a3cea87e61 100644 --- a/lily/include/midi-item.hh +++ b/lily/include/midi-item.hh @@ -1,7 +1,7 @@ /* midi-item.hh -- declare Midi items - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #ifndef MIDI_ITEM_HH @@ -10,6 +10,8 @@ #include "audio-item.hh" #include "std-vector.hh" +string int2midi_varint_string (int i); + /** Any piece of midi information. @@ -23,10 +25,8 @@ public: virtual ~Midi_item (); virtual char const *name () const; - /// factory static Midi_item *get_midi (Audio_item *a); - static string i2varint_string (int i); virtual string to_string () const = 0; }; @@ -37,38 +37,6 @@ public: int channel_; DECLARE_CLASSNAME(Midi_channel_item); Midi_channel_item (); - virtual const char *name () const { return "Midi_channel_item"; } - virtual ~Midi_channel_item (); -}; - -/** - timed MIDI event -*/ -class Midi_event -{ -public: - Midi_event (Moment delta_mom, Midi_item *midi); - - Moment delta_mom_; - Midi_item *midi_; - string to_string () const; -}; - -/** - variable sized MIDI data -*/ -class Midi_chunk : public Midi_item -{ -public: - void set (string header_string, string data_string, string footer_string); - virtual string to_string () const; - virtual string data_string () const; - DECLARE_CLASSNAME(Midi_chunk); - -private: - string data_string_; - string footer_string_; - string header_string_; }; class Midi_duration : public Midi_item @@ -80,13 +48,6 @@ public: Real seconds_; }; -class Midi_header : public Midi_chunk -{ -public: - DECLARE_CLASSNAME(Midi_header); - - Midi_header (int format_i, int tracks_i, int clocks_per_4_i); -}; /** Change instrument event @@ -125,16 +86,12 @@ public: int clocks_per_1_; }; -/** - Turn a note on. -*/ class Midi_note : public Midi_channel_item { public: Midi_note (Audio_note *); DECLARE_CLASSNAME(Midi_note); - Moment get_length () const; int get_semitone_pitch () const; int get_fine_tuning () const; virtual string to_string () const; @@ -146,9 +103,6 @@ public: Byte dynamic_byte_; }; -/** - Turn a note off -*/ class Midi_note_off : public Midi_note { public: @@ -211,22 +165,6 @@ public: Audio_tempo *audio_; }; -class Midi_track : public Midi_chunk -{ -public: - int number_; - DECLARE_CLASSNAME(Midi_track); - /* - Compensate for starting grace notes. - */ - vector events_; - - Midi_track (); - ~Midi_track (); - - void add (Moment delta_time_mom, Midi_item *midi); - virtual string data_string () const; -}; #endif // MIDI_ITEM_HH diff --git a/lily/include/midi-stream.hh b/lily/include/midi-stream.hh index 4f02d6cbca..fe31d6590f 100644 --- a/lily/include/midi-stream.hh +++ b/lily/include/midi-stream.hh @@ -1,7 +1,7 @@ /* midi-stream.hh -- declare Midi_stream - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #ifndef MIDI_STREAM_HH @@ -11,19 +11,15 @@ using namespace std; #include "std-string.hh" +#include "lily-proto.hh" -class Midi_item; - -/// Midi outputfile struct Midi_stream { Midi_stream (string file_name_string); ~Midi_stream (); - Midi_stream &operator << (string str); - Midi_stream &operator << (Midi_item const &midi_c_r); - Midi_stream &operator << (int i); - + void write (string); + void write (Midi_chunk const &); void open (); FILE *out_file_; diff --git a/lily/include/midi-walker.hh b/lily/include/midi-walker.hh index 2d17efbc60..8ea8b27b64 100644 --- a/lily/include/midi-walker.hh +++ b/lily/include/midi-walker.hh @@ -1,7 +1,7 @@ /* midi-walker.hh -- declare Midi_walker - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -12,9 +12,9 @@ #include "lily-proto.hh" #include "moment.hh" -struct Midi_note_event : PQueue_ent +struct Midi_note_event : PQueue_ent { - bool ignore_b_; + bool ignore_; Midi_note_event (); }; @@ -33,19 +33,21 @@ public: void process (); void operator ++ (int); bool ok () const; - + void finalize (); private: void do_start_note (Midi_note *note); - void do_stop_notes (Moment now_mom); - void output_event (Moment now_mom, Midi_item *l); - + void do_stop_notes (int); + void output_event (int, Midi_item *l); + Midi_item *get_midi (Audio_item*); int channel_; Midi_track *track_; Audio_staff *staff_; vsize index_; - vector *items_; + vector items_; PQueue stop_note_queue; - Moment last_mom_; + int last_tick_; + + vector midi_events_; }; #endif // MIDI_WALKER_HH diff --git a/lily/include/mingw-compatibility.hh b/lily/include/mingw-compatibility.hh index efc6910492..e7643c03e6 100644 --- a/lily/include/mingw-compatibility.hh +++ b/lily/include/mingw-compatibility.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Jan Nieuwenhuizen + (c) 2005--2007 Jan Nieuwenhuizen */ #ifndef MINGW_COMPATIBILITY_HH diff --git a/lily/include/misc.hh b/lily/include/misc.hh index fa7555d086..fad61b1ad3 100644 --- a/lily/include/misc.hh +++ b/lily/include/misc.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef MISC_HH @@ -38,6 +38,7 @@ linear_interpolate (Real x, Real x1, Real x2, Real y1, Real y2) Real directed_round (Real f, Direction d); Real peak_around (Real epsilon, Real threshold, Real x); +Real convex_amplifier (Real standard_x, Real increase_factor, Real x); string camel_case_to_lisp_identifier (string in); #endif diff --git a/lily/include/modified-font-metric.hh b/lily/include/modified-font-metric.hh index 7d1487d933..16a8afdd42 100644 --- a/lily/include/modified-font-metric.hh +++ b/lily/include/modified-font-metric.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef MODIFIED_FONT_METRIC_HH diff --git a/lily/include/moment.hh b/lily/include/moment.hh index ec84bc7448..a3b7544762 100644 --- a/lily/include/moment.hh +++ b/lily/include/moment.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef MOMENT_HH diff --git a/lily/include/multi-measure-rest.hh b/lily/include/multi-measure-rest.hh index dd0d4054ae..554a328b6e 100644 --- a/lily/include/multi-measure-rest.hh +++ b/lily/include/multi-measure-rest.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #ifndef MULTI_MEASURE_REST_HH diff --git a/lily/include/music-function.hh b/lily/include/music-function.hh index 723472bd78..be3b98bcbe 100644 --- a/lily/include/music-function.hh +++ b/lily/include/music-function.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef MUSIC_FUNCTION_HH diff --git a/lily/include/music-iterator.hh b/lily/include/music-iterator.hh index 76ecbddce7..261ccf128d 100644 --- a/lily/include/music-iterator.hh +++ b/lily/include/music-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef MUSIC_ITERATOR_HH diff --git a/lily/include/music-output.hh b/lily/include/music-output.hh index 56178c80cb..c7c3b82bd5 100644 --- a/lily/include/music-output.hh +++ b/lily/include/music-output.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef MUSIC_OUTPUT_HH diff --git a/lily/include/music-sequence.hh b/lily/include/music-sequence.hh index dc1046aaa8..94784ca45a 100644 --- a/lily/include/music-sequence.hh +++ b/lily/include/music-sequence.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef MUSIC_SEQUENCE_HH diff --git a/lily/include/music-wrapper-iterator.hh b/lily/include/music-wrapper-iterator.hh index ca118be037..3abddfeccf 100644 --- a/lily/include/music-wrapper-iterator.hh +++ b/lily/include/music-wrapper-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #ifndef MUSIC_WRAPPER_ITERATOR_HH diff --git a/lily/include/music-wrapper.hh b/lily/include/music-wrapper.hh index cedbcf3017..18d885f423 100644 --- a/lily/include/music-wrapper.hh +++ b/lily/include/music-wrapper.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #ifndef MUSIC_WRAPPER_HH diff --git a/lily/include/music.hh b/lily/include/music.hh index f7e4407f3b..ec6f98766c 100644 --- a/lily/include/music.hh +++ b/lily/include/music.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef MUSIC_HH @@ -66,6 +66,6 @@ SCM ly_camel_case_to_lisp_identifier (SCM name_sym); extern SCM ly_music_p_proc; /* common transposition function for music and event */ -SCM transpose_mutable (SCM alist, Pitch delta); +void transpose_mutable (SCM alist, Pitch delta); #endif /* MUSIC_HH */ diff --git a/lily/include/note-collision.hh b/lily/include/note-collision.hh index 7500ea45e9..9390321e59 100644 --- a/lily/include/note-collision.hh +++ b/lily/include/note-collision.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef COLLISION_HH diff --git a/lily/include/note-column.hh b/lily/include/note-column.hh index 73030a46d9..60c2668890 100644 --- a/lily/include/note-column.hh +++ b/lily/include/note-column.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef NOTE_COLUMN_HH diff --git a/lily/include/note-head.hh b/lily/include/note-head.hh index ff4e9a848a..0891b7da2b 100644 --- a/lily/include/note-head.hh +++ b/lily/include/note-head.hh @@ -1,7 +1,7 @@ /* note-head.hh -- part of GNU LilyPond - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef NOTEHEAD_HH diff --git a/lily/include/note-spacing.hh b/lily/include/note-spacing.hh index dc8cbe4e02..af04260cea 100644 --- a/lily/include/note-spacing.hh +++ b/lily/include/note-spacing.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #ifndef NOTE_SPACING_HH diff --git a/lily/include/object-key-dumper.hh b/lily/include/object-key-dumper.hh deleted file mode 100644 index 582199ad5b..0000000000 --- a/lily/include/object-key-dumper.hh +++ /dev/null @@ -1,40 +0,0 @@ -/* - object-key-dumper.hh -- declare Object_key_dumper - - source file of the GNU LilyPond music typesetter - - (c) 2004--2006 Han-Wen Nienhuys -*/ - -#ifndef OBJECT_KEY_DUMPER_HH -#define OBJECT_KEY_DUMPER_HH - -#include -using namespace std; - -#include "object-key.hh" - -typedef map Key_to_key_map; -typedef map Pointer_to_int_map; -typedef map Int_to_key_map; - -class Object_key_dumper -{ - SCM file_contents_; - Key_to_key_map serialized_keys_; - Pointer_to_int_map key_serial_numbers_; - int next_available_; - - SCM key_serial (int); - SCM serialize_key (Object_key const *); - DECLARE_SMOBS (Object_key_dumper); -public: - Object_key_dumper (); - SCM get_file_contents () const; - SCM dump_key (Object_key const *); -}; - -DECLARE_UNSMOB (Object_key_dumper, key_dumper); - -#endif /* OBJECT_KEY_DUMPER_HH */ - diff --git a/lily/include/object-key-undumper.hh b/lily/include/object-key-undumper.hh deleted file mode 100644 index f42d777461..0000000000 --- a/lily/include/object-key-undumper.hh +++ /dev/null @@ -1,30 +0,0 @@ -/* - object-key-undumper.hh -- declare Object_key_undumper - - source file of the GNU LilyPond music typesetter - - (c) 2004--2006 Han-Wen Nienhuys -*/ - -#ifndef OBJECT_KEY_UNDUMPER_HH -#define OBJECT_KEY_UNDUMPER_HH - -#include -using namespace std; - -#include "object-key.hh" - -typedef map Int_to_key_map; - -struct Object_key_undumper -{ - DECLARE_SMOBS (Object_key_undumper); - Int_to_key_map keys_; -public: - void parse_contents (SCM); - Object_key_undumper (); - Object_key const *get_key (int k); -}; -DECLARE_UNSMOB (Object_key_undumper, key_undumper); - -#endif diff --git a/lily/include/object-key.hh b/lily/include/object-key.hh deleted file mode 100644 index c163d4c0e9..0000000000 --- a/lily/include/object-key.hh +++ /dev/null @@ -1,75 +0,0 @@ -/* - object-key.hh -- declare Object_key - - source file of the GNU LilyPond music typesetter - - (c) 2004--2006 Han-Wen Nienhuys -*/ - -#ifndef OBJECT_KEY_HH -#define OBJECT_KEY_HH - -#include "smobs.hh" - -/* - Object_keys are read-only values, suitable for storing references to - transient objects (such as grobs or contexts) on disk. - - In the future, they might also act as handles for external processes - requesting notation to be drawn. -*/ -class Object_key -{ - DECLARE_SMOBS (Object_key); - -protected: - Object_key (); - virtual void derived_mark () const; - virtual int get_type () const; - virtual int do_compare (Object_key const *other) const; -public: - virtual SCM as_scheme () const; - static Object_key *from_scheme (SCM); - static Object_key *undump (SCM); - int compare (Object_key const *other) const; - SCM dump () const; -}; - -enum Object_key_type - { - BASE_KEY, - COPIED_KEY, - GENERAL_KEY, - GROB_KEY, - CONTEXT_KEY, - KEY_COUNT, - }; - -class Copied_key : public Object_key -{ - -private: - Object_key const *original_; - int copy_count_; - -protected: - virtual void derived_mark () const; - virtual int get_type () const; - virtual int do_compare (Object_key const *other) const; - virtual SCM as_scheme () const; -public: - static Object_key *from_scheme (SCM); - Copied_key (Object_key const *, int); -}; - -DECLARE_UNSMOB (Object_key, key); - -struct Object_key_less -{ - bool operator () (Object_key const *const &t1, Object_key const *const &t2) const - { - return t1->compare (t2); - } -}; - -#endif /* OBJECT_KEY_HH */ diff --git a/lily/include/open-type-font.hh b/lily/include/open-type-font.hh index 9cd34497ab..1ca5500446 100644 --- a/lily/include/open-type-font.hh +++ b/lily/include/open-type-font.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef OPEN_TYPE_FONT_HH diff --git a/lily/include/optimal-page-breaking.hh b/lily/include/optimal-page-breaking.hh index 8737e7e5a8..79e160055c 100644 --- a/lily/include/optimal-page-breaking.hh +++ b/lily/include/optimal-page-breaking.hh @@ -5,7 +5,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #ifndef OPTIMAL_PAGE_BREAKING_HH diff --git a/lily/include/output-def.hh b/lily/include/output-def.hh index 6a6165037e..cb4400d8ce 100644 --- a/lily/include/output-def.hh +++ b/lily/include/output-def.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef MUSIC_OUTPUT_DEF_HH @@ -49,9 +49,6 @@ public: Input input_origin_; string user_key_; - Lily_parser *parser_; - Lily_parser *get_parser () const; - Output_def (Output_def const&); Output_def (); diff --git a/lily/include/page-breaking.hh b/lily/include/page-breaking.hh index 7c2a99e381..b5b3e24113 100644 --- a/lily/include/page-breaking.hh +++ b/lily/include/page-breaking.hh @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #ifndef PAGE_BREAKING_HH diff --git a/lily/include/page-spacing.hh b/lily/include/page-spacing.hh index f64df2c8a2..e1fa582d92 100644 --- a/lily/include/page-spacing.hh +++ b/lily/include/page-spacing.hh @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #ifndef PAGE_SPACING_HH diff --git a/lily/include/page-turn-page-breaking.hh b/lily/include/page-turn-page-breaking.hh index a109f1ff8f..74ed4e84ba 100644 --- a/lily/include/page-turn-page-breaking.hh +++ b/lily/include/page-turn-page-breaking.hh @@ -5,7 +5,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #ifndef PAGE_TURN_PAGE_BREAKING_HH diff --git a/lily/include/pango-font.hh b/lily/include/pango-font.hh index 76b4d6c8eb..c0d6ff3368 100644 --- a/lily/include/pango-font.hh +++ b/lily/include/pango-font.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef PANGO_FONT_HH @@ -31,7 +31,7 @@ class Pango_font : public Font_metric public: SCM physical_font_tab () const; Pango_font (PangoFT2FontMap *, - PangoFontDescription *, + PangoFontDescription const *, Real); ~Pango_font (); diff --git a/lily/include/paper-book.hh b/lily/include/paper-book.hh index 16b349e025..4ea1927946 100644 --- a/lily/include/paper-book.hh +++ b/lily/include/paper-book.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Jan Nieuwenhuizen + (c) 2004--2007 Jan Nieuwenhuizen */ #ifndef PAPER_BOOK_HH #define PAPER_BOOK_HH diff --git a/lily/include/paper-column-engraver.hh b/lily/include/paper-column-engraver.hh index 1dd227e209..793d085e0c 100644 --- a/lily/include/paper-column-engraver.hh +++ b/lily/include/paper-column-engraver.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef PAPER_COLUMN_ENGRAVER_HH diff --git a/lily/include/paper-column.hh b/lily/include/paper-column.hh index be6ab9378d..0157eb6bb9 100644 --- a/lily/include/paper-column.hh +++ b/lily/include/paper-column.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef PAPER_COLUMN_HH @@ -22,10 +22,10 @@ class Paper_column : public Item friend void set_loose_columns (System *which, Column_x_positions const *posns); friend class System; public: - Paper_column (SCM, Object_key const *); - Paper_column (Paper_column const &, int count); + Paper_column (SCM); + Paper_column (Paper_column const &); - virtual Grob *clone (int count) const; + virtual Grob *clone () const; virtual void do_break_processing (); virtual Paper_column *get_column () const; virtual System *get_system () const; diff --git a/lily/include/paper-outputter.hh b/lily/include/paper-outputter.hh index 42b628f453..44c8b1bf57 100644 --- a/lily/include/paper-outputter.hh +++ b/lily/include/paper-outputter.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef PAPER_OUTPUTTER_HH diff --git a/lily/include/paper-score.hh b/lily/include/paper-score.hh index 7f79aeb548..ac1b762089 100644 --- a/lily/include/paper-score.hh +++ b/lily/include/paper-score.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef PAPER_SCORE_HH diff --git a/lily/include/paper-system.hh b/lily/include/paper-system.hh index 8c709c3464..840c3caa75 100644 --- a/lily/include/paper-system.hh +++ b/lily/include/paper-system.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Jan Nieuwenhuizen + (c) 2004--2007 Jan Nieuwenhuizen */ #ifndef PAPER_SYSTEM_HH #define PAPER_SYSTEM_HH diff --git a/lily/include/parse-scm.hh b/lily/include/parse-scm.hh index 0f48de2c53..2939bc2f5c 100644 --- a/lily/include/parse-scm.hh +++ b/lily/include/parse-scm.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef PARSE_SCM_HH diff --git a/lily/include/percent-repeat-item.hh b/lily/include/percent-repeat-item.hh index 83662b5d3d..990a31873d 100644 --- a/lily/include/percent-repeat-item.hh +++ b/lily/include/percent-repeat-item.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #ifndef PERCENT_REPEAT_ITEM_HH diff --git a/lily/include/performance.hh b/lily/include/performance.hh index 90a825bb1d..7aa90ca511 100644 --- a/lily/include/performance.hh +++ b/lily/include/performance.hh @@ -1,7 +1,7 @@ /* performance.hh -- declare Performance - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #ifndef PERFORMANCE_HH @@ -19,12 +19,13 @@ public: DECLARE_CLASSNAME(Performance); void add_element (Audio_element *p); - - void output (Midi_stream &midi_stream_r); - void output_header_track (Midi_stream &midi_stream_r); + virtual void process (); + void remap_grace_durations (); + void output (Midi_stream &midi_stream) const; + void output_header_track (Midi_stream &midi_stream) const; void print () const; - void write_output (string filename); + void write_output (string filename) const; vector audio_staffs_; vector audio_elements_; diff --git a/lily/include/performer-group.hh b/lily/include/performer-group.hh index 94eceaecde..7eff9515e6 100644 --- a/lily/include/performer-group.hh +++ b/lily/include/performer-group.hh @@ -1,7 +1,7 @@ /* performer-group.hh -- declare Performer_group - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/lily/include/performer.hh b/lily/include/performer.hh index 4eab36a332..38b876ae64 100644 --- a/lily/include/performer.hh +++ b/lily/include/performer.hh @@ -1,7 +1,7 @@ /* performer.hh -- declare Performer - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/lily/include/pitch-interval.hh b/lily/include/pitch-interval.hh index defa7a9e92..ab8b51edde 100644 --- a/lily/include/pitch-interval.hh +++ b/lily/include/pitch-interval.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef PITCH_INTERVAL_HH diff --git a/lily/include/pitch.hh b/lily/include/pitch.hh index 65883d6345..e711fc0d57 100644 --- a/lily/include/pitch.hh +++ b/lily/include/pitch.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #ifndef MUSICAL_PITCH_HH diff --git a/lily/include/pointer-group-interface.hh b/lily/include/pointer-group-interface.hh index 4238871b8e..d1c7d0e7c4 100644 --- a/lily/include/pointer-group-interface.hh +++ b/lily/include/pointer-group-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef POINTER_GROUP_INTERFACE_HH diff --git a/lily/include/prob.hh b/lily/include/prob.hh index 6c6f59be7c..839edd4aba 100644 --- a/lily/include/prob.hh +++ b/lily/include/prob.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Jan Nieuwenhuizen + (c) 2004--2007 Jan Nieuwenhuizen */ #ifndef PROPERTY_OBJECT_HH @@ -42,12 +42,7 @@ public: SCM type () const { return type_; } SCM get_property_alist (bool mutble) const; SCM internal_get_property (SCM sym) const; - -#ifndef NDEBUG - void internal_set_property (SCM sym, SCM val, const char *file, int line, char const *fun); -#else void internal_set_property (SCM sym, SCM val); -#endif }; DECLARE_UNSMOB(Prob,prob); SCM ly_prob_set_property_x (SCM system, SCM sym, SCM value); diff --git a/lily/include/profile.hh b/lily/include/profile.hh index fff7fa225c..9a1961782b 100644 --- a/lily/include/profile.hh +++ b/lily/include/profile.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef PROFILE_HH @@ -14,5 +14,7 @@ void note_property_access (SCM *table, SCM sym); extern SCM context_property_lookup_table; extern SCM grob_property_lookup_table; +extern SCM prob_property_lookup_table; +extern bool profile_property_accesses; #endif /* PROFILE_HH */ diff --git a/lily/include/program-option.hh b/lily/include/program-option.hh index 55971a1fa1..66babd51a9 100644 --- a/lily/include/program-option.hh +++ b/lily/include/program-option.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Jan Nieuwenhuizen + (c) 2001--2007 Jan Nieuwenhuizen */ #ifndef SCM_OPTION_HH #define SCM_OPTION_HH @@ -15,7 +15,6 @@ extern bool do_midi_debugging_global; extern int testing_level_global; extern bool lily_1_8_relative; extern bool lily_1_8_compatibility_used; -extern bool profile_property_accesses; SCM ly_get_option (SCM); SCM ly_set_option (SCM, SCM); diff --git a/lily/include/property-iterator.hh b/lily/include/property-iterator.hh index f2bc6d7152..2f70d027e0 100644 --- a/lily/include/property-iterator.hh +++ b/lily/include/property-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef PROPERTY_ITERATOR_HH diff --git a/lily/include/protected-scm.hh b/lily/include/protected-scm.hh index e605a74e24..d29e98c973 100644 --- a/lily/include/protected-scm.hh +++ b/lily/include/protected-scm.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #ifndef PROTECTED_SCM_HH diff --git a/lily/include/relocate.hh b/lily/include/relocate.hh index e3af270a88..d50614d787 100644 --- a/lily/include/relocate.hh +++ b/lily/include/relocate.hh @@ -1,9 +1,9 @@ /* - relocate.hh -- declare + relocate.hh -- declare relocation functions source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/include/repeated-music.hh b/lily/include/repeated-music.hh index 787b76e109..92a278e90c 100644 --- a/lily/include/repeated-music.hh +++ b/lily/include/repeated-music.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef REPEATED_MUSIC_HH diff --git a/lily/include/rest-collision.hh b/lily/include/rest-collision.hh index 5f2e165765..07d80ab144 100644 --- a/lily/include/rest-collision.hh +++ b/lily/include/rest-collision.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef REST_COLLISION_HH diff --git a/lily/include/rest.hh b/lily/include/rest.hh index 20107120b7..ed67c63107 100644 --- a/lily/include/rest.hh +++ b/lily/include/rest.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef REST_HH @@ -25,5 +25,6 @@ public: DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (width, (SCM)); DECLARE_SCHEME_CALLBACK (height, (SCM)); + DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM)); }; #endif // REST_HH diff --git a/lily/include/rhythmic-head.hh b/lily/include/rhythmic-head.hh index 2fae285707..a1d722b6b9 100644 --- a/lily/include/rhythmic-head.hh +++ b/lily/include/rhythmic-head.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef RHYTHMIC_HEAD_HH diff --git a/lily/include/rod.hh b/lily/include/rod.hh index 7bf58538de..9ecf6e5fba 100644 --- a/lily/include/rod.hh +++ b/lily/include/rod.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #ifndef ROD_HH diff --git a/lily/include/scale.hh b/lily/include/scale.hh index 58bec89eb5..ff8e6b2b7f 100644 --- a/lily/include/scale.hh +++ b/lily/include/scale.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ diff --git a/lily/include/scheme-listener.hh b/lily/include/scheme-listener.hh index 1dc4c720e3..c95347202c 100644 --- a/lily/include/scheme-listener.hh +++ b/lily/include/scheme-listener.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Erik Sandberg + (c) 2006--2007 Erik Sandberg */ #ifndef SCHEME_LISTENER_HH diff --git a/lily/include/scm-hash.hh b/lily/include/scm-hash.hh index cbaef193be..6ced1f5e21 100644 --- a/lily/include/scm-hash.hh +++ b/lily/include/scm-hash.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef SCM_HASH_HH diff --git a/lily/include/score-engraver.hh b/lily/include/score-engraver.hh index d2de464f60..52b6522353 100644 --- a/lily/include/score-engraver.hh +++ b/lily/include/score-engraver.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef SCORE_ENGRAVER_HH diff --git a/lily/include/score-performer.hh b/lily/include/score-performer.hh index 929853bba0..826abeec95 100644 --- a/lily/include/score-performer.hh +++ b/lily/include/score-performer.hh @@ -1,7 +1,7 @@ /* score-performer.hh -- declare Score_performer - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/lily/include/score.hh b/lily/include/score.hh index bcd967cda1..d4f26da4d2 100644 --- a/lily/include/score.hh +++ b/lily/include/score.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef SCORE_HH @@ -38,12 +38,12 @@ public: SCM get_music () const; void add_output_def (Output_def *def); void set_music (SCM music); - SCM book_rendering (Output_def *, Output_def *, Object_key *); + SCM book_rendering (Output_def *, Output_def *); }; DECLARE_UNSMOB (Score, score); SCM ly_render_output (SCM, SCM); -SCM ly_run_translator (SCM, SCM, SCM); +SCM ly_run_translator (SCM, SCM); #endif /* SCORE_HH */ diff --git a/lily/include/script-column.hh b/lily/include/script-column.hh index e36eb952bf..150c690c17 100644 --- a/lily/include/script-column.hh +++ b/lily/include/script-column.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef Script_COLUMN_HH diff --git a/lily/include/script-interface.hh b/lily/include/script-interface.hh index 6acbadc35b..39e0388331 100644 --- a/lily/include/script-interface.hh +++ b/lily/include/script-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef SCRIPT_INTERFACE_HH diff --git a/lily/include/self-alignment-interface.hh b/lily/include/self-alignment-interface.hh index 4fe353fb97..5dc85360bb 100644 --- a/lily/include/self-alignment-interface.hh +++ b/lily/include/self-alignment-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef SELF_ALIGNMENT_INTERFACE_HH diff --git a/lily/include/semi-tie-column.hh b/lily/include/semi-tie-column.hh index 1671f7fc5f..fb8e75e8b2 100644 --- a/lily/include/semi-tie-column.hh +++ b/lily/include/semi-tie-column.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/include/semi-tie.hh b/lily/include/semi-tie.hh index 83688ab012..35524e7b23 100644 --- a/lily/include/semi-tie.hh +++ b/lily/include/semi-tie.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/include/separating-group-spanner.hh b/lily/include/separating-group-spanner.hh index 1419d53971..d48705c859 100644 --- a/lily/include/separating-group-spanner.hh +++ b/lily/include/separating-group-spanner.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #ifndef SEPARATING_GROUP_SPANNER_HH diff --git a/lily/include/separation-item.hh b/lily/include/separation-item.hh index 4fb59b5e62..5bcb4e6e3e 100644 --- a/lily/include/separation-item.hh +++ b/lily/include/separation-item.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef SINGLE_MALT_GROUPING_ITEM_HH diff --git a/lily/include/sequential-iterator.hh b/lily/include/sequential-iterator.hh index 124461d997..f749fd6933 100644 --- a/lily/include/sequential-iterator.hh +++ b/lily/include/sequential-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #ifndef SEQUENTIAL_ITERATOR_HH diff --git a/lily/include/simple-closure.hh b/lily/include/simple-closure.hh index e5a3aed78a..82457c70c7 100644 --- a/lily/include/simple-closure.hh +++ b/lily/include/simple-closure.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/include/simple-music-iterator.hh b/lily/include/simple-music-iterator.hh index b77ad6ed4f..10d8e46903 100644 --- a/lily/include/simple-music-iterator.hh +++ b/lily/include/simple-music-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef SIMPLE_MUSIC_ITERATOR_HH diff --git a/lily/include/simple-spacer.hh b/lily/include/simple-spacer.hh index c803348774..73790d5963 100644 --- a/lily/include/simple-spacer.hh +++ b/lily/include/simple-spacer.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef SIMPLE_SPACER_HH diff --git a/lily/include/simultaneous-music-iterator.hh b/lily/include/simultaneous-music-iterator.hh index ae318f478b..790e96806a 100644 --- a/lily/include/simultaneous-music-iterator.hh +++ b/lily/include/simultaneous-music-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef SIMULTANEOUS_MUSIC_ITERATOR_HH diff --git a/lily/include/skyline.hh b/lily/include/skyline.hh index 36fd9d23e4..a4ea033fdb 100644 --- a/lily/include/skyline.hh +++ b/lily/include/skyline.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #ifndef SKYLINE_HH @@ -32,12 +32,17 @@ struct Building void print () const; Real height (Real x) const; - Real intersection (Building const &other) const; + Real intersection_x (Building const &other) const; void leading_part (Real chop); bool conceals_beginning (Building const &other) const; bool conceals (Building const &other) const; bool sane () const; Building sloped_neighbour (Real horizon_padding, Direction d) const; + + bool operator< (Building const &other) + { + return iv_[LEFT] < other.iv_[LEFT]; + } }; class Skyline @@ -48,8 +53,7 @@ private: void internal_merge_skyline (list*, list*, list *const result); - void internal_build_skyline (list*, list *const result); - bool is_legal_skyline () const; + list internal_build_skyline (list*); DECLARE_SIMPLE_SMOBS(Skyline); public: diff --git a/lily/include/slur-configuration.hh b/lily/include/slur-configuration.hh index 1db127238a..35e1e4a414 100644 --- a/lily/include/slur-configuration.hh +++ b/lily/include/slur-configuration.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef SLUR_CONFIGURATION_HH diff --git a/lily/include/slur-score-parameters.hh b/lily/include/slur-score-parameters.hh index 936789b219..5c3a335068 100644 --- a/lily/include/slur-score-parameters.hh +++ b/lily/include/slur-score-parameters.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ diff --git a/lily/include/slur-scoring.hh b/lily/include/slur-scoring.hh index c02fac2005..db03c1e363 100644 --- a/lily/include/slur-scoring.hh +++ b/lily/include/slur-scoring.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef SLUR_SCORING_HH diff --git a/lily/include/slur.hh b/lily/include/slur.hh index 0ec721d4d2..20fb7030ce 100644 --- a/lily/include/slur.hh +++ b/lily/include/slur.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef SLUR_HH diff --git a/lily/include/smobs.hh b/lily/include/smobs.hh index da37b4f9e8..5bd403bce4 100644 --- a/lily/include/smobs.hh +++ b/lily/include/smobs.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef SMOBS_HH @@ -142,12 +142,16 @@ void unprotect_smob (SCM smob, SCM *prot_cons); extern bool parsed_objects_should_be_dead; +#ifndef NDEDUG #define ASSERT_LIVE_IS_ALLOWED() \ static bool passed_here_once;\ if (parsed_objects_should_be_dead && !passed_here_once) { \ - programming_error (string ("Parsed object should be dead: ") + __PRETTY_FUNCTION__ ); \ + ::programming_error (string ("Parsed object should be dead: ") + __PRETTY_FUNCTION__ ); \ passed_here_once = true;\ } +#else +#define ASSERT_LIVE_IS_ALLOWED() +#endif #endif /* SMOBS_HH */ diff --git a/lily/include/source-file.hh b/lily/include/source-file.hh index 71ae366a85..502783a6b4 100644 --- a/lily/include/source-file.hh +++ b/lily/include/source-file.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Jan Nieuwenhuizen + (c) 1999--2007 Jan Nieuwenhuizen */ #ifndef SOURCE_FILE_HH diff --git a/lily/include/source.hh b/lily/include/source.hh index b06266b4fc..09c7cfafd0 100644 --- a/lily/include/source.hh +++ b/lily/include/source.hh @@ -1,31 +1 @@ -/* - source.hh -- part of LilyPond - - (c) 1997--2006 Jan Nieuwenhuizen -*/ - -#ifndef SOURCE_HH -#define SOURCE_HH - -#include "flower-proto.hh" -#include "std-vector.hh" - -/* A set of sourcefiles. */ -class Sources -{ - Sources (Sources const &); - vector sourcefiles_; - -public: - Sources (); - ~Sources (); - - Source_file *get_file (string *file_name); - Source_file *get_sourcefile (char const *); - void add (Source_file *sourcefile); - void set_path (File_path *); - - const File_path *path_; -}; - -#endif /* SOURCE_HH */ +#error diff --git a/lily/include/sources.hh b/lily/include/sources.hh new file mode 100644 index 0000000000..13776f31be --- /dev/null +++ b/lily/include/sources.hh @@ -0,0 +1,30 @@ +/* + sources.hh -- part of LilyPond + + (c) 1997--2007 Jan Nieuwenhuizen +*/ + +#ifndef SOURCES_HH +#define SOURCES_HH + +#include "flower-proto.hh" +#include "std-vector.hh" + +class Sources +{ + Sources (Sources const &); + vector sourcefiles_; + +public: + Sources (); + ~Sources (); + + Source_file *get_file (string *file_name); + Source_file *get_sourcefile (char const *); + void add (Source_file *sourcefile); + void set_path (File_path *); + + const File_path *path_; +}; + +#endif /* SOURCE_HH */ diff --git a/lily/include/spaceable-grob.hh b/lily/include/spaceable-grob.hh index cb1217bf6f..5625bfd61e 100644 --- a/lily/include/spaceable-grob.hh +++ b/lily/include/spaceable-grob.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef SPACEABLE_GROB_HH @@ -20,7 +20,6 @@ struct Spaceable_grob static void get_spring (Grob *me, Grob *other, Real *dist, Real *inv_strength); DECLARE_GROB_INTERFACE(); - static void remove_interface (Grob *); static SCM get_minimum_distances (Grob *); static SCM get_ideal_distances (Grob *); }; diff --git a/lily/include/spacing-interface.hh b/lily/include/spacing-interface.hh index 1d7665bbb5..b558ede709 100644 --- a/lily/include/spacing-interface.hh +++ b/lily/include/spacing-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "grob-interface.hh" #include "lily-proto.hh" diff --git a/lily/include/spacing-options.hh b/lily/include/spacing-options.hh index faebb55489..0b2d30b664 100644 --- a/lily/include/spacing-options.hh +++ b/lily/include/spacing-options.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ @@ -12,6 +12,12 @@ #include "lily-proto.hh" #include "rational.hh" +#include "std-vector.hh" + +/* + Various options for spacing. Usually inited from SpacingSpanner, but sometimes + from GraceSpacing. + */ struct Spacing_options { @@ -22,7 +28,7 @@ struct Spacing_options Rational global_shortest_; Real increment_; Real shortest_duration_space_; - + Spacing_options(); void init_from_grob (Grob *me); Real get_duration_space (Rational d, bool *) const; diff --git a/lily/include/spacing-spanner.hh b/lily/include/spacing-spanner.hh index 7d46f78e1c..3018cadebc 100644 --- a/lily/include/spacing-spanner.hh +++ b/lily/include/spacing-spanner.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef SPACING_SPANNER_HH @@ -14,33 +14,31 @@ #include "std-vector.hh" #include "grob-interface.hh" -/* - TODO: prune to public interface. -*/ class Spacing_spanner - { -public: +private: static void set_distances_for_loose_col (Grob *me, Grob *c, Drul_array next_door, Spacing_options const *); static void generate_pair_spacing (Grob *me, Paper_column *l, Paper_column *r, Paper_column *nextr, Spacing_options const *options); - static void standard_breakable_column_spacing (Grob *me, Item *l, Item *r, - Real *fixed, Real *space, - Spacing_options const *); static Real default_bar_spacing (Grob *, Grob *, Grob *, Moment); - static Real note_spacing (Grob *, Grob *, Grob *, Spacing_options const *, bool *); static Real get_duration_space (Moment dur, Spacing_options const *, bool *); static Rational effective_shortest_duration (Grob *me, vector const &all); static void breakable_column_spacing (Grob *, Item *l, Item *r, Spacing_options const *); - static void prune_loose_columns (Grob *, vector *cols, Spacing_options const *); + static void prune_loose_columns (Grob *, vector *cols, Spacing_options *); static void set_explicit_neighbor_columns (vector const &cols); static void set_implicit_neighbor_columns (vector const &cols); static void generate_springs (Grob *me, vector const &cols, Spacing_options const *); static void musical_column_spacing (Grob *, Item *, Item *, Spacing_options const *); - static vector get_columns (Spanner *me); - + static bool fills_measure (Grob *, Item *, Item *); +public: + static vector get_columns (Grob *me); + static Real note_spacing (Grob *, Grob *, Grob *, Spacing_options const *, bool *); + static void standard_breakable_column_spacing (Grob *me, Item *l, Item *r, + Real *fixed, Real *space, + Spacing_options const *); + DECLARE_SCHEME_CALLBACK (set_springs, (SCM)); DECLARE_SCHEME_CALLBACK (calc_common_shortest_duration, (SCM)); DECLARE_GROB_INTERFACE(); diff --git a/lily/include/span-bar.hh b/lily/include/span-bar.hh index 449f8bca3d..4f2faf110e 100644 --- a/lily/include/span-bar.hh +++ b/lily/include/span-bar.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef SPAN_BAR_HH diff --git a/lily/include/spanner.hh b/lily/include/spanner.hh index bce4837e01..e4a09cc0cf 100644 --- a/lily/include/spanner.hh +++ b/lily/include/spanner.hh @@ -1,7 +1,7 @@ /* spanner.hh -- part of GNU LilyPond - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef SPANNER_HH @@ -51,8 +51,8 @@ public: void set_bound (Direction d, Grob *); Item *get_bound (Direction d) const; - Spanner (SCM, Object_key const *); - Spanner (Spanner const &, int copy_count); + Spanner (SCM); + Spanner (Spanner const &); bool is_broken () const; void do_break (); Real spanner_length () const; @@ -66,7 +66,7 @@ public: protected: void set_my_columns (); - virtual Grob *clone (int count) const; + virtual Grob *clone () const; virtual void do_break_processing (); }; diff --git a/lily/include/spring.hh b/lily/include/spring.hh index 8813caff92..11989b3ad0 100644 --- a/lily/include/spring.hh +++ b/lily/include/spring.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef SPRING_HH diff --git a/lily/include/staff-spacing.hh b/lily/include/staff-spacing.hh index af6d394ead..b4241f2800 100644 --- a/lily/include/staff-spacing.hh +++ b/lily/include/staff-spacing.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #ifndef STAFF_SPACING_HH @@ -15,8 +15,8 @@ class Staff_spacing { public: - static void next_notes_correction (Grob *, Grob *, Real *, Real *); - static void next_note_correction (Grob *, Grob *, Interval, Real*, Real *); + static void next_notes_correction (Grob *, Grob *, Real, Real, Real *, Real *); + static void next_note_correction (Grob *, Grob *, Interval, Real, Real, Real*, Real *, int *); DECLARE_GROB_INTERFACE(); static void get_spacing_params (Grob *, Real *, Real *); diff --git a/lily/include/staff-symbol-referencer.hh b/lily/include/staff-symbol-referencer.hh index e6d4ceeec5..4a43a94e03 100644 --- a/lily/include/staff-symbol-referencer.hh +++ b/lily/include/staff-symbol-referencer.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #ifndef STAFF_SYMBOL_REFERENCER_HH @@ -39,6 +39,7 @@ public: static Real get_position (Grob *); static Real staff_radius (Grob *); static int get_rounded_position (Grob *); + static Interval extent_in_staff (Grob *); }; int compare_position (Grob *const &, Grob *const &);\ diff --git a/lily/include/staff-symbol.hh b/lily/include/staff-symbol.hh index af532014d9..4dacde8b53 100644 --- a/lily/include/staff-symbol.hh +++ b/lily/include/staff-symbol.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef STAFF_SYMBOL_HH diff --git a/lily/include/stem-info.hh b/lily/include/stem-info.hh index 2551c1b094..59f80ace9f 100644 --- a/lily/include/stem-info.hh +++ b/lily/include/stem-info.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #ifndef STEM_INFO_HH diff --git a/lily/include/stem-tremolo.hh b/lily/include/stem-tremolo.hh index 75946a34ee..36cb146efe 100644 --- a/lily/include/stem-tremolo.hh +++ b/lily/include/stem-tremolo.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef ABBREV_HH @@ -24,7 +24,9 @@ public: DECLARE_SCHEME_CALLBACK (calc_style, (SCM)); static Stencil raw_stencil (Grob *, Real slope, Direction stemdir); static Stencil translated_stencil (Grob*, Real slope); + static Stencil untranslated_stencil (Grob*, Real slope); static Real get_beam_translation (Grob *me); + static Real vertical_length (Grob *me); }; #endif /* ABBREV_HH */ diff --git a/lily/include/stem.hh b/lily/include/stem.hh index 8808d16665..d022175a7c 100644 --- a/lily/include/stem.hh +++ b/lily/include/stem.hh @@ -1,7 +1,7 @@ /* stem.hh -- declare Stem - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef STEM_HH @@ -33,6 +33,7 @@ public: static Real thickness (Grob *); static int head_count (Grob *); static bool is_invisible (Grob *); + static bool is_normal_stem (Grob *); static Interval head_positions (Grob *); static Real stem_end_position (Grob *); static Stencil flag (Grob *); diff --git a/lily/include/stencil.hh b/lily/include/stencil.hh index b80bcc1c3d..445e461380 100644 --- a/lily/include/stencil.hh +++ b/lily/include/stencil.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef STENCIL_HH #define STENCIL_HH @@ -46,12 +46,6 @@ using namespace std; */ class Stencil { - /* - This provides the reference point of the symbol, for example with - characters, it is on the base line of the character. Usually, - ORIGIN is inside DIM_ - */ - Offset origin_; Box dim_; SCM expr_; @@ -60,19 +54,15 @@ public: Stencil (Box, SCM s); Stencil (); - Offset origin () const; SCM expr () const; /** Set dimensions to empty, or to (Interval (0, 0), Interval (0, 0) */ void set_empty (bool); - Stencil moved_to_edge (Axis a, Direction d, const Stencil &m, Real padding, - Real minimum) const; - - void add_at_edge (Axis a, Direction d, const Stencil &m, Real padding, - Real minimum); + void add_at_edge (Axis a, Direction d, const Stencil &m, Real padding); void add_stencil (Stencil const &m); void translate (Offset); + Stencil translated (Offset) const; void rotate (Real, Offset); void align_to (Axis a, Real x); void translate_axis (Real, Axis); @@ -95,6 +85,5 @@ void register_stencil_head (SCM symbol); bool is_stencil_head (SCM symbol); SCM all_stencil_heads (); -Stencil points_to_line_stencil (vector points); #endif /* STENCIL_HH */ diff --git a/lily/include/stream.hh b/lily/include/stream.hh index 4c938da685..0d981a97c4 100644 --- a/lily/include/stream.hh +++ b/lily/include/stream.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #ifndef STREAM_HH diff --git a/lily/include/swallow-perf.hh b/lily/include/swallow-perf.hh index 672caf863b..8016529e4d 100644 --- a/lily/include/swallow-perf.hh +++ b/lily/include/swallow-perf.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef SWALLOW_PERF_HH diff --git a/lily/include/system-start-delimiter.hh b/lily/include/system-start-delimiter.hh index f04cde76f6..d66bb24d9c 100644 --- a/lily/include/system-start-delimiter.hh +++ b/lily/include/system-start-delimiter.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef SYSTEM_START_DELIMITER_HH diff --git a/lily/include/system.hh b/lily/include/system.hh index e1a91bf4fa..48e6875dfb 100644 --- a/lily/include/system.hh +++ b/lily/include/system.hh @@ -1,8 +1,7 @@ - /* - line-of-score.hh -- part of GNU LilyPond + system.hh -- part of GNU LilyPond - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef SYSTEM_HH @@ -34,8 +33,8 @@ public: SCM get_paper_system (); SCM get_paper_systems (); - System (SCM, Object_key const *); - System (System const &, int); + System (SCM); + System (System const &); int element_count () const; int spanner_count () const; @@ -44,7 +43,8 @@ public: DECLARE_GROB_INTERFACE(); vector broken_col_range (Item const *, Item const *) const; - vector columns () const; + vector used_columns () const; + Paper_column *column (vsize i) const; void add_column (Paper_column *); void typeset_grob (Grob *); @@ -52,7 +52,7 @@ public: protected: virtual void derived_mark () const; - virtual Grob *clone (int count) const; + virtual Grob *clone () const; }; void set_loose_columns (System *which, Column_x_positions const *posns); diff --git a/lily/include/text-interface.hh b/lily/include/text-interface.hh index 187e73715e..3f8685b15e 100644 --- a/lily/include/text-interface.hh +++ b/lily/include/text-interface.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/lily/include/text-metrics.hh b/lily/include/text-metrics.hh index 030a9ad344..fa4dac1513 100644 --- a/lily/include/text-metrics.hh +++ b/lily/include/text-metrics.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #ifndef TEXT_METRICS_HH diff --git a/lily/include/text-spanner.hh b/lily/include/text-spanner.hh index 06034b1870..3af69d6344 100644 --- a/lily/include/text-spanner.hh +++ b/lily/include/text-spanner.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ #ifndef TEXT_SPANNER_HH diff --git a/lily/include/tie-column-format.hh b/lily/include/tie-column-format.hh index 3206e3203f..37e0900282 100644 --- a/lily/include/tie-column-format.hh +++ b/lily/include/tie-column-format.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/include/tie-column.hh b/lily/include/tie-column.hh index 77d6d68a78..07f166f17b 100644 --- a/lily/include/tie-column.hh +++ b/lily/include/tie-column.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #ifndef TIE_COLUMN_HH diff --git a/lily/include/tie-configuration.hh b/lily/include/tie-configuration.hh index 95fd15b01c..d65604c1dc 100644 --- a/lily/include/tie-configuration.hh +++ b/lily/include/tie-configuration.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -68,6 +68,8 @@ public: void reset_score (); string card () const; string tie_card (int i) const { return tie_score_cards_[i]; } + string complete_tie_card (vsize i) const; + string complete_score_card () const; }; #endif /* TIE_CONFIGURATION_HH */ diff --git a/lily/include/tie-details.hh b/lily/include/tie-details.hh index 0e74d3497a..18b9127d1e 100644 --- a/lily/include/tie-details.hh +++ b/lily/include/tie-details.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ @@ -21,8 +21,10 @@ struct Tie_details Real stem_gap_; Real between_length_limit_; Real wrong_direction_offset_penalty_; + Real same_dir_as_stem_penalty_; Real min_length_penalty_factor_; Real min_length_; + Real skyline_padding_; Real tip_staff_line_clearance_; Real center_staff_line_clearance_; Real staff_line_collision_penalty_; diff --git a/lily/include/tie-formatting-problem.hh b/lily/include/tie-formatting-problem.hh index 2b1e2b6230..50f1746b86 100644 --- a/lily/include/tie-formatting-problem.hh +++ b/lily/include/tie-formatting-problem.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -14,30 +14,13 @@ #include "skyline.hh" #include "tie-configuration.hh" #include "tie-details.hh" +#include "tie-specification.hh" #include "tuple.hh" #include #include typedef map< Tuple, Tie_configuration *> Tie_configuration_map; - -struct Tie_specification -{ - int position_; - Drul_array note_head_drul_; - Drul_array column_ranks_; - - bool has_manual_position_; - bool has_manual_dir_; - - Real manual_position_; - Direction manual_dir_; - - Tie_specification (); - int column_span () const; - void get_tie_manual_settings (Grob *); -}; - struct Tie_configuration_variation { int index_; @@ -47,11 +30,14 @@ struct Tie_configuration_variation typedef map < Tuple, Skyline> Chord_outline_map; typedef map < Tuple, Box> Column_extent_map; +typedef map Position_extent_map; + class Tie_formatting_problem { Chord_outline_map chord_outlines_; Column_extent_map stem_extents_; Column_extent_map head_extents_; + Position_extent_map head_positions_; set dot_positions_; Interval dot_x_; @@ -62,11 +48,13 @@ class Tie_formatting_problem Grob *x_refpoint_; - Tie_configuration *get_configuration (int position, Direction dir, Drul_array cols) const; - Tie_configuration *generate_configuration (int position, Direction dir, Drul_array cols) const; + Tie_configuration *get_configuration (int position, Direction dir, Drul_array cols, bool tune_y) const; + Tie_configuration *generate_configuration (int position, Direction dir, Drul_array cols, bool tune_y) const; + vector generate_collision_variations (Ties_configuration const &ties) const; vector generate_extremal_tie_variations (Ties_configuration const &ties) const; - + vector generate_single_tie_variations (Ties_configuration const &ties) const; + void score_configuration (Tie_configuration *) const; Real score_aptitude (Tie_configuration *, Tie_specification const &, Ties_configuration *, int) const; @@ -75,9 +63,10 @@ class Tie_formatting_problem void set_ties_config_standard_directions (Ties_configuration *tie_configs_ptr); void score_ties (Ties_configuration *) const; + Slice head_positions_slice (int) const; Ties_configuration generate_base_chord_configuration (); Ties_configuration find_best_variation (Ties_configuration const &base, - vector vars); + vector const &vars); public: Tie_details details_; @@ -91,9 +80,8 @@ public: ~Tie_formatting_problem (); Tie_specification get_tie_specification (int) const; - Ties_configuration generate_optimal_chord_configuration (); + Ties_configuration generate_optimal_configuration (); Ties_configuration generate_ties_configuration (Ties_configuration const &); - Tie_configuration find_optimal_tie_configuration (Tie_specification const &) const; void from_ties (vector const &ties); void from_tie (Grob *tie); @@ -103,6 +91,7 @@ public: void set_manual_tie_configuration (SCM); Interval get_attachment (Real, Drul_array) const; Grob *common_x_refpoint () const; + void set_debug_scoring (Ties_configuration const &); }; #endif /* TIE_FORMATTING_PROBLEM_HH */ diff --git a/lily/include/tie-specification.hh b/lily/include/tie-specification.hh new file mode 100644 index 0000000000..0a437d312b --- /dev/null +++ b/lily/include/tie-specification.hh @@ -0,0 +1,37 @@ +/* + tie-specification.hh -- declare Tie_specification + + source file of the GNU LilyPond music typesetter + + (c) 2007 Han-Wen Nienhuys + +*/ + +#ifndef TIE_SPECIFICATION_HH +#define TIE_SPECIFICATION_HH + +#include "lily-proto.hh" +#include "drul-array.hh" + +struct Tie_specification +{ + int position_; + Drul_array note_head_drul_; + Drul_array column_ranks_; + Grob *tie_grob_; + + bool has_manual_position_; + bool has_manual_dir_; + bool has_manual_delta_y_; + bool has_accidental_; + + Real manual_position_; + Direction manual_dir_; + + Tie_specification (); + int column_span () const; + void from_grob (Grob *); +}; + +#endif /* TIE_SPECIFICATION_HH */ + diff --git a/lily/include/tie.hh b/lily/include/tie.hh index 35d3d9596c..c47a93306c 100644 --- a/lily/include/tie.hh +++ b/lily/include/tie.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef TIE_HH @@ -25,10 +25,10 @@ public: static int get_column_rank (Grob *, Direction); static int get_position (Grob *); static Direction get_default_dir (Grob *); - static void set_control_points (Grob *, Grob *, - Tie_configuration const&, - Tie_details const&); - static void set_default_control_points (Grob *); + static SCM get_control_points (Grob *, Grob *, + Tie_configuration const&, + Tie_details const&); + static SCM get_default_control_points (Grob *); DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM)); DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); diff --git a/lily/include/time-scaled-music-iterator.hh b/lily/include/time-scaled-music-iterator.hh index f2b3d0bd18..bf48452130 100644 --- a/lily/include/time-scaled-music-iterator.hh +++ b/lily/include/time-scaled-music-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys , + (c) 1998--2007 Han-Wen Nienhuys , Erik Sandberg */ diff --git a/lily/include/time-signature.hh b/lily/include/time-signature.hh index d25843252e..5c77a2cff9 100644 --- a/lily/include/time-signature.hh +++ b/lily/include/time-signature.hh @@ -1,7 +1,7 @@ /* time_signature.hh -- declare Time_signature - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #ifndef METER_HH diff --git a/lily/include/timing-translator.hh b/lily/include/timing-translator.hh index 3ed20422b7..7963440ca8 100644 --- a/lily/include/timing-translator.hh +++ b/lily/include/timing-translator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef TIMING_TRANSLATOR_HH diff --git a/lily/include/translator-dispatch-list.hh b/lily/include/translator-dispatch-list.hh index 3a54305235..687431cb8f 100644 --- a/lily/include/translator-dispatch-list.hh +++ b/lily/include/translator-dispatch-list.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef TRANSLATOR_DISPATCH_LIST_HH diff --git a/lily/include/translator-group.hh b/lily/include/translator-group.hh index 72481b5da3..a777ba2630 100644 --- a/lily/include/translator-group.hh +++ b/lily/include/translator-group.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef TRANSLATOR_GROUP_HH @@ -57,7 +57,6 @@ public: public: virtual void connect_to_context (Context *c); virtual void disconnect_from_context (); - virtual Translator_group *get_daddy_translator ()const; virtual SCM get_simple_trans_list (); virtual void initialize (); virtual void finalize (); diff --git a/lily/include/translator.hh b/lily/include/translator.hh index eee42e5b7d..6145cae052 100644 --- a/lily/include/translator.hh +++ b/lily/include/translator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #ifndef TRANSLATOR_HH diff --git a/lily/include/translator.icc b/lily/include/translator.icc index 708089b30a..2a7eeccc23 100644 --- a/lily/include/translator.icc +++ b/lily/include/translator.icc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #ifndef TRANSLATOR_ICC diff --git a/lily/include/tuplet-bracket.hh b/lily/include/tuplet-bracket.hh index b60c417c19..2097e98d58 100644 --- a/lily/include/tuplet-bracket.hh +++ b/lily/include/tuplet-bracket.hh @@ -1,7 +1,7 @@ /* tuplet-bracket.hh -- part of GNU LilyPond - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #ifndef Tuplet_bracket_HH diff --git a/lily/include/tweak-registration.hh b/lily/include/tweak-registration.hh deleted file mode 100644 index a7c1ad8070..0000000000 --- a/lily/include/tweak-registration.hh +++ /dev/null @@ -1,43 +0,0 @@ -/* - tweak-registration.hh -- declare - - source file of the GNU LilyPond music typesetter - - (c) 2004--2006 Han-Wen Nienhuys -*/ - -#ifndef TWEAK_REGISTRATION_HH -#define TWEAK_REGISTRATION_HH - -#include -using namespace std; - -#include "lily-proto.hh" -#include "object-key.hh" - -typedef map Tweak_map; - -class Tweak_registry -{ - Tweak_map tweaks_; - Object_key_undumper *undumper_; - - DECLARE_SMOBS (Tweak_registry); - -public: - Tweak_registry (); - - Object_key_undumper *undumper () const; - void clear (); - void insert_grob_tweak (Grob *, SCM); - void replace_grob_tweak (Grob *, SCM); - SCM get_tweaks (Grob *); - SCM list_tweaks (); - void insert_tweak_from_file (SCM); -}; - -extern Tweak_registry *global_registry_; - -DECLARE_UNSMOB (Tweak_registry, tweak_registry); - -#endif /* TWEAK_REGISTRATION_HH */ diff --git a/lily/include/type-swallow-translator.hh b/lily/include/type-swallow-translator.hh index 637c68878b..fd631e91d6 100644 --- a/lily/include/type-swallow-translator.hh +++ b/lily/include/type-swallow-translator.hh @@ -1,13 +1,13 @@ /* - type-swallow-engraver.hh -- declare Type_swallow_translator + type-swallow-translator.hh -- declare Type_swallow_translator source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ -#ifndef TYPESWALLOW_GRAV_HH -#define TYPESWALLOW_GRAV_HH +#ifndef TYPESWALLOW_TRANSLATOR_HH +#define TYPESWALLOW_TRANSLATOR_HH #include "translator.hh" @@ -40,5 +40,5 @@ public: "", \ ""); -#endif // TYPESWALLOW_GRAV_HH +#endif // TYPESWALLOW_TRANSLATOR_HH diff --git a/lily/include/vaticana-ligature.hh b/lily/include/vaticana-ligature.hh index f20fccf28f..13cdf6d657 100644 --- a/lily/include/vaticana-ligature.hh +++ b/lily/include/vaticana-ligature.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Juergen Reuter + (c) 2003--2007 Juergen Reuter */ #ifndef VATICANA_LIGATURE_HH diff --git a/lily/include/volta-bracket.hh b/lily/include/volta-bracket.hh index 687439cc7f..4cc75a6ba5 100644 --- a/lily/include/volta-bracket.hh +++ b/lily/include/volta-bracket.hh @@ -1,7 +1,7 @@ /* volta-spanner.hh -- part of GNU LilyPond - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #ifndef VOLTA_SPANNER_HH diff --git a/lily/input-scheme.cc b/lily/input-scheme.cc index c24d2ed1b0..2ff7bf5007 100644 --- a/lily/input-scheme.cc +++ b/lily/input-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "std-string.hh" @@ -47,7 +47,7 @@ LY_DEFINE (ly_input_file_line_column, int ch = 0; int col = 0; ip->get_counts (&l, &ch, &col); - return scm_list_4 (scm_makfrom0str (ip->file_string ().c_str ()), + return scm_list_4 (ly_string2scm (ip->file_string ()), scm_from_int (l), scm_from_int (ch), scm_from_int (col)); @@ -61,7 +61,7 @@ LY_DEFINE (ly_input_both_locations, { Input *ip = unsmob_input (sip); SCM_ASSERT_TYPE (ip, sip, SCM_ARG1, __FUNCTION__, "input location"); - return scm_list_5 (scm_makfrom0str (ip->file_string ().c_str ()), + return scm_list_5 (ly_string2scm (ip->file_string ()), scm_from_int (ip->line_number ()), scm_from_int (ip->column_number ()), scm_from_int (ip->end_line_number ()), diff --git a/lily/input-smob.cc b/lily/input-smob.cc index 1b66e9935f..0f928a67b7 100644 --- a/lily/input-smob.cc +++ b/lily/input-smob.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "input.hh" diff --git a/lily/input.cc b/lily/input.cc index 14b281fbb8..09028d0858 100644 --- a/lily/input.cc +++ b/lily/input.cc @@ -3,7 +3,7 @@ source file of the LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "input.hh" @@ -13,7 +13,7 @@ using namespace std; #include "international.hh" #include "source-file.hh" -#include "source.hh" +#include "sources.hh" #include "warn.hh" Input::Input (Input const &i) diff --git a/lily/instrument-name-engraver.cc b/lily/instrument-name-engraver.cc index a900154032..d280913e53 100644 --- a/lily/instrument-name-engraver.cc +++ b/lily/instrument-name-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/instrument-switch-engraver.cc b/lily/instrument-switch-engraver.cc index fe30a0423c..a3694f0755 100644 --- a/lily/instrument-switch-engraver.cc +++ b/lily/instrument-switch-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ @@ -31,6 +31,9 @@ Instrument_switch_engraver::Instrument_switch_engraver () text_ = 0; } +/* + TODO: should use an event. + */ void Instrument_switch_engraver::process_music () { diff --git a/lily/item-scheme.cc b/lily/item-scheme.cc index 6baf4af6af..0ebbc2832d 100644 --- a/lily/item-scheme.cc +++ b/lily/item-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/item.cc b/lily/item.cc index 5cf717a300..c6ca1b2c69 100644 --- a/lily/item.cc +++ b/lily/item.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "item.hh" @@ -17,13 +17,13 @@ #include "pointer-group-interface.hh" Grob * -Item::clone (int count) const +Item::clone () const { - return new Item (*this, count); + return new Item (*this); } -Item::Item (SCM s, Object_key const *key) - : Grob (s, key) +Item::Item (SCM s) + : Grob (s) { broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0; } @@ -31,8 +31,8 @@ Item::Item (SCM s, Object_key const *key) /** Item copy ctor. Copy nothing: everything should be a elt property or a special purpose pointer (such as broken_to_drul_[]) */ -Item::Item (Item const &s, int copy_count) - : Grob (s, copy_count) +Item::Item (Item const &s) + : Grob (s) { broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0; } @@ -66,10 +66,9 @@ Item::copy_breakable_items () { Drul_array new_copies; Direction i = LEFT; - int count = 0; do { - Grob *dolly = clone (count++); + Grob *dolly = clone (); Item *item = dynamic_cast (dolly); get_root_system (this)->typeset_grob (item); new_copies[i] = item; diff --git a/lily/key-engraver.cc b/lily/key-engraver.cc index 8bd0d1305f..36199d7041 100644 --- a/lily/key-engraver.cc +++ b/lily/key-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "bar-line.hh" @@ -53,23 +53,6 @@ Key_engraver::Key_engraver () } -SCM -make_qt_key (SCM rat_key) -{ - SCM qt_key = SCM_EOL; - SCM *tail = &qt_key; - - for (SCM s = rat_key; scm_is_pair (s); s = scm_cdr (s)) - { - *tail = scm_cons (scm_cons (scm_caar (s), - scm_from_int (Rational (4)* ly_scm2rational (scm_cdar (s)))), - SCM_EOL); - tail = SCM_CDRLOC (*tail); - } - - return qt_key; -} - void Key_engraver::create_key (bool is_default) { @@ -94,7 +77,7 @@ Key_engraver::create_key (bool is_default) for (SCM s = last; scm_is_pair (s); s = scm_cdr (s)) { SCM new_alter_pair = scm_assoc (scm_caar (s), key); - Rational old_alter = ly_scm2rational (scm_cdar (s)); + Rational old_alter = robust_scm2rational (scm_cdar (s), 0); if (new_alter_pair == SCM_BOOL_F || extranatural && (ly_scm2rational (scm_cdr (new_alter_pair)) - old_alter)*old_alter < Rational (0)) @@ -110,22 +93,19 @@ Key_engraver::create_key (bool is_default) key_event_ ? key_event_->self_scm () : SCM_EOL); - cancellation_->set_property ("alteration-alist", make_qt_key (restore)); + cancellation_->set_property ("alteration-alist", restore); cancellation_->set_property ("c0-position", get_property ("middleCPosition")); } } - - item_->set_property ("alteration-alist", make_qt_key (key)); + item_->set_property ("alteration-alist", key); } if (!is_default) { SCM visibility = get_property ("explicitKeySignatureVisibility"); item_->set_property ("break-visibility", visibility); - if (cancellation_) - cancellation_->set_property ("break-visibility", visibility); } } @@ -237,7 +217,6 @@ ADD_TRANSLATOR (Key_engraver, "extraNatural " "keyAlterationOrder " "keySignature " - "keySignature " "lastKeySignature " "printKeyCancellation " , diff --git a/lily/key-performer.cc b/lily/key-performer.cc index 762e8c4808..32f94a632e 100644 --- a/lily/key-performer.cc +++ b/lily/key-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "audio-item.hh" diff --git a/lily/key-signature-interface.cc b/lily/key-signature-interface.cc index d6513efd84..7c88268b62 100644 --- a/lily/key-signature-interface.cc +++ b/lily/key-signature-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys keyplacement by Mats Bengtsson */ @@ -15,72 +15,14 @@ #include "lookup.hh" #include "output-def.hh" #include "staff-symbol-referencer.hh" +#include "rational.hh" struct Key_signature_interface { DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE(); }; -/* - FIXME: too much hardcoding here. -*/ -const int FLAT_TOP_PITCH = 2; /* fes, ges, as and bes typeset in lower octave */ -const int SHARP_TOP_PITCH = 4; /* ais and bis typeset in lower octave */ - -/* - TODO: look this up. I'm not sure where the naturals ought to go. - - COMMENT: Current implementation does not use the NATURAL_TOP_PITCH for anything, - always typesets naturals in the same place as the thing they cancel. -rz -*/ -const int NATURAL_TOP_PITCH = 4; - -/* - FIXME: key-item should just get a list of (position, acc), and leave - the thinking to other parties. - - - TODO: put this in Scheme - - TODO: can we do without c0pos? it's partly musical. -*/ -int -alteration_pos (SCM what, int alter, int c0p) -{ - if (scm_is_pair (what)) - return scm_to_int (scm_car (what)) * 7 + scm_to_int (scm_cdr (what)) + c0p; - - int p = scm_to_int (what); - - // Find the c in the range -4 through 2 - int from_bottom_pos = c0p + 4; - from_bottom_pos = from_bottom_pos % 7; - from_bottom_pos = (from_bottom_pos + 7) % 7; // Precaution to get positive. - int c0 = from_bottom_pos - 4; - - if ((alter < 0 && ((p > FLAT_TOP_PITCH) || (p + c0 > 4)) && (p + c0 > 1)) - || (alter > 0 && ((p > SHARP_TOP_PITCH) || (p + c0 > 5)) && (p + c0 > 2)) - || (alter == 0 && ((p > NATURAL_TOP_PITCH) || (p + c0 > 5)) && (p + c0 > 2))) - { - p -= 7; /* Typeset below c_position */ - } - - /* Provide for the four cases in which there's a glitch - it's a hack, but probably not worth - the effort of finding a nicer solution. - --dl. */ - if (c0 == 2 && alter > 0 && p == 3) - p -= 7; - if (c0==-3 && alter > 0 && p ==-1) - p += 7; - if (c0==-4 && alter < 0 && p ==-1) - p += 7; - if (c0==-2 && alter < 0 && p ==-3) - p += 7; - - return p + c0; -} /* TODO @@ -101,13 +43,9 @@ Key_signature_interface::print (SCM smob) else style = ""; - SCM newas = me->get_property ("alteration-alist"); Stencil mol; SCM c0s = me->get_property ("c0-position"); - int c0p = 0; - if (scm_is_number (c0s)) - c0p = scm_to_int (c0s); bool is_cancellation = me->internal_has_interface (ly_symbol2scm ("key-cancellation-interface")); @@ -119,22 +57,33 @@ Key_signature_interface::print (SCM smob) int last_pos = -1000; Font_metric *fm = Font_interface::get_default_font (me); - for (SCM s = newas; scm_is_pair (s); s = scm_cdr (s)) + SCM alist = me->get_property ("glyph-name-alist"); + + for (SCM s = me->get_property ("alteration-alist"); scm_is_pair (s); s = scm_cdr (s)) { - int alteration = scm_to_int (scm_cdar (s)); - string font_char - = Accidental_interface::get_fontcharname (style, - is_cancellation - ? 0 - : alteration); - Stencil acc (fm->find_by_name ("accidentals." + font_char)); + SCM alt = is_cancellation + ? scm_from_int (0) + : scm_cdar (s); + + SCM glyph_name = ly_assoc_get (alt, alist, SCM_BOOL_F); + if (!scm_is_string (glyph_name)) + { + me->warning (_f ("No glyph found for alteration: %s", + ly_scm2rational (alt).to_string ().c_str ())); + continue; + } + + Stencil acc (fm->find_by_name (ly_scm2string (glyph_name))); if (acc.is_empty ()) - me->warning (_f ("accidental `%s' not found", font_char)); + me->warning (_ ("alteration not found")); else { SCM what = scm_caar (s); - int pos = alteration_pos (what, alteration, c0p); + + SCM proc = ly_lily_module_constant ("key-signature-interface::alteration-position"); + + int pos = scm_to_int (scm_call_3 (proc, what, scm_cdar (s), c0s)); acc.translate_axis (pos * inter, Y_AXIS); /* @@ -148,7 +97,7 @@ Key_signature_interface::print (SCM smob) && last_pos > pos - 6) padding = 0.3; - mol.add_at_edge (X_AXIS, LEFT, acc, padding, 0); + mol.add_at_edge (X_AXIS, LEFT, acc, padding); last_pos = pos; } } @@ -161,7 +110,8 @@ Key_signature_interface::print (SCM smob) ADD_INTERFACE (Key_signature_interface, "A group of accidentals, to be printed as signature sign.", + "alteration-alist " "c0-position " + "glyph-name-alist " "style " - "alteration-alist " ); diff --git a/lily/laissez-vibrer-engraver.cc b/lily/laissez-vibrer-engraver.cc index 96dd9bbdd0..a6a4bd0e2b 100644 --- a/lily/laissez-vibrer-engraver.cc +++ b/lily/laissez-vibrer-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -60,12 +60,20 @@ Laissez_vibrer_engraver::acknowledge_note_head (Grob_info inf) { lv_column_ = make_item ("LaissezVibrerTieColumn", event_->self_scm ()); } - - Grob *lv_tie = make_item ("LaissezVibrerTie", event_->self_scm ()); + + SCM cause = event_->self_scm (); + Grob *lv_tie = make_item ("LaissezVibrerTie", cause); lv_tie->set_object ("note-head", inf.grob ()->self_scm ()); Pointer_group_interface::add_grob (lv_column_, ly_symbol2scm ("ties"), lv_tie); + + if (is_direction (unsmob_stream_event (cause)->get_property ("direction"))) + { + Direction d = to_dir (unsmob_stream_event (cause)->get_property ("direction")); + lv_tie->set_property ("direction", scm_from_int (d)); + } + lv_tie->set_parent (lv_column_, Y_AXIS); lv_ties_.push_back (lv_tie); @@ -77,6 +85,6 @@ ADD_TRANSLATOR (Laissez_vibrer_engraver, /* create */ "LaissezVibrerTie " - "LaissezVibrerTieColumn", + "LaissezVibrerTieColumn ", /* read */ "", /* write */ ""); diff --git a/lily/least-squares.cc b/lily/least-squares.cc index 2e0bcab3c6..d95279a54e 100644 --- a/lily/least-squares.cc +++ b/lily/least-squares.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #include "least-squares.hh" diff --git a/lily/ledger-line-engraver.cc b/lily/ledger-line-engraver.cc index e5bd582a07..ecff48a7b8 100644 --- a/lily/ledger-line-engraver.cc +++ b/lily/ledger-line-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "pointer-group-interface.hh" diff --git a/lily/ledger-line-spanner.cc b/lily/ledger-line-spanner.cc index ea0fa43d4e..62d52b64c1 100644 --- a/lily/ledger-line-spanner.cc +++ b/lily/ledger-line-spanner.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include diff --git a/lily/lexer.ll b/lily/lexer.ll index 9cb2cac0c6..66457f4b9e 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -4,7 +4,7 @@ source file of the LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -236,7 +236,7 @@ BOM_UTF8 \357\273\277 progress_indication ("\n"); scm_module_define (scm_car (scopes_), ly_symbol2scm ("input-file-name"), - scm_makfrom0str (s.c_str ())); + ly_string2scm (s)); } @@ -271,7 +271,7 @@ BOM_UTF8 \357\273\277 } <> { LexerError (_ ("EOF found inside a comment").c_str ()); - is_main_input_ = false; + is_main_input_ = false; // should be safe , can't have \include in --safe. if (! close_input ()) yyterminate (); // can't move this, since it actually rets a YY_NULL } @@ -323,7 +323,7 @@ BOM_UTF8 \357\273\277 } {RESTNAME} { char const *s = YYText (); - yylval.scm = scm_makfrom0str (s); + yylval.scm = scm_from_locale_string (s); return RESTNAME; } R { @@ -427,7 +427,7 @@ BOM_UTF8 \357\273\277 /* yylval is union. Must remember STRING before setting SCM*/ string *sp = yylval.string; - yylval.scm = scm_makfrom0str (sp->c_str ()); + yylval.scm = ly_string2scm (*sp); delete sp; return is_lyric_state () ? LYRICS_STRING : STRING; } @@ -464,7 +464,7 @@ BOM_UTF8 \357\273\277 if (c == '{' || c == '}') // brace open is for not confusing dumb tools. here_input ().warning ( _ ("Brace found at end of lyric. Did you forget a space?")); - yylval.scm = scm_makfrom0str (s.c_str ()); + yylval.scm = ly_string2scm (s); return LYRICS_STRING; @@ -557,7 +557,7 @@ BOM_UTF8 \357\273\277 if (c == '{' || c == '}') here_input ().warning ( _ ("Brace found at end of markup. Did you forget a space?")); - yylval.scm = scm_makfrom0str (s.c_str ()); + yylval.scm = ly_string2scm (s); return STRING; @@ -570,7 +570,11 @@ BOM_UTF8 \357\273\277 <*><> { if (is_main_input_) { - is_main_input_ = false; + /* 2 = init.ly + current file. + > because we're before closing, but is_main_input_ should + reflect after. + */ + is_main_input_ = include_stack_.size () > 2; if (!close_input ()) /* Returns YY_NULL */ yyterminate (); @@ -774,7 +778,7 @@ Lily_lexer::scan_escaped_word (string str) string msg (_f ("unknown escaped string: `\\%s'", str)); LexerError (msg.c_str ()); - yylval.scm = scm_makfrom0str (str.c_str ()); + yylval.scm = ly_string2scm (str); return STRING; } @@ -802,7 +806,7 @@ Lily_lexer::scan_bare_word (string str) } } - yylval.scm = scm_makfrom0str (str.c_str ()); + yylval.scm = ly_string2scm (str); return STRING; } @@ -937,7 +941,7 @@ SCM lookup_markup_command (string s) { SCM proc = ly_lily_module_constant ("lookup-markup-command"); - return scm_call_1 (proc, scm_makfrom0str (s.c_str ())); + return scm_call_1 (proc, ly_string2scm (s)); } /* Shut up lexer warnings. */ diff --git a/lily/ligature-bracket-engraver.cc b/lily/ligature-bracket-engraver.cc index 6e8dd9a22a..85cd473ecd 100644 --- a/lily/ligature-bracket-engraver.cc +++ b/lily/ligature-bracket-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Juergen Reuter + (c) 2002--2007 Juergen Reuter */ #include "ligature-engraver.hh" @@ -81,6 +81,7 @@ Ligature_bracket_engraver::acknowledge_rest (Grob_info info) ADD_ACKNOWLEDGER (Ligature_bracket_engraver, rest); ADD_ACKNOWLEDGER (Ligature_bracket_engraver, note_column); + ADD_TRANSLATOR (Ligature_bracket_engraver, /* doc */ "Handles Ligature_events by engraving Ligature brackets.", /* create */ "TupletBracket", diff --git a/lily/ligature-engraver.cc b/lily/ligature-engraver.cc index c4565f8e53..e73098abe4 100644 --- a/lily/ligature-engraver.cc +++ b/lily/ligature-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Juergen Reuter + (c) 2002--2007 Juergen Reuter */ #include "ligature-engraver.hh" diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index dd5080b367..976b19e47c 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ @@ -34,22 +34,8 @@ using namespace std; /* symbols/strings. */ -SCM -ly_to_symbol (SCM scm) -{ - return scm_string_to_symbol (ly_to_string (scm)); -} - -SCM -ly_to_string (SCM scm) -{ - return scm_call_3 (ly_lily_module_constant ("format"), SCM_BOOL_F, - - scm_makfrom0str ("~S"), scm); -} - -SCM -ly_write2scm (SCM s) +string +ly_scm_write_string (SCM s) { SCM port = scm_mkstrport (SCM_INUM0, scm_make_string (SCM_INUM0, SCM_UNDEFINED), @@ -60,7 +46,7 @@ ly_write2scm (SCM s) // scm_apply (write, port, SCM_EOL); scm_call_2 (write, s, port); - return scm_strport_to_string (port); + return ly_scm2string (scm_strport_to_string (port)); } SCM @@ -129,6 +115,14 @@ ly_scm2string (SCM str) (int) scm_i_string_length (str)); } +SCM +ly_string2scm (string const &str) +{ + return scm_from_locale_stringn (str.c_str(), + str.length ()); +} + + char * ly_scm2newstr (SCM str, size_t *lenp) { @@ -335,37 +329,6 @@ ly_scm2offsets (SCM s) ALIST */ -/* looks the key up in the cdrs of the alist-keys - - ignoring the car and ignoring non-pair keys. - Returns first match found, i.e. - - alist = ((1 . 10) - ((1 . 2) . 11) - ((2 . 1) . 12) - ((3 . 0) . 13) - ((4 . 1) . 14) ) - - I would like (ly_assoc_cdr 1) to return 12 - because it's the first - element with the cdr of the key = 1. In other words (alloc_cdr key) - corresponds to call - - (alloc (anything . key)) -*/ -SCM -ly_assoc_cdr (SCM key, SCM alist) -{ - if (scm_is_pair (alist)) - { - SCM trykey = scm_caar (alist); - if (scm_is_pair (trykey) - && to_boolean (scm_equal_p (key, scm_cdr (trykey)))) - return scm_car (alist); - return ly_assoc_cdr (key, scm_cdr (alist)); - } - return SCM_BOOL_F; -} - - bool alist_equal_p (SCM a, SCM b) { @@ -428,33 +391,10 @@ ly_deep_copy (SCM src) return src; } - -SCM -ly_truncate_list (int k, SCM lst) -{ - if (k == 0) - lst = SCM_EOL; - else - { - SCM s = lst; - k--; - for (; scm_is_pair (s) && k--; s = scm_cdr (s)) - ; - - if (scm_is_pair (s)) - scm_set_cdr_x (s, SCM_EOL); - } - return lst; -} - - - - - string print_scm_val (SCM val) { - string realval = ly_scm2string (ly_write2scm (val)); + string realval = ly_scm_write_string (val); if (realval.length () > 200) realval = realval.substr (0, 100) + "\n :\n :\n" @@ -502,7 +442,8 @@ type_check_assignment (SCM sym, SCM val, SCM type_symbol) /* Be strict when being anal :) */ if (do_internal_type_checking_global) - abort (); + scm_throw (ly_symbol2scm ("ly-file-failed"), scm_list_3 (ly_symbol2scm ("typecheck"), + sym, val)); warning (_ ("doing assignment anyway")); } @@ -641,6 +582,14 @@ ly_scm2rational (SCM r) scm_to_int (scm_denominator (r))); } +Rational +robust_scm2rational (SCM n, Rational rat) +{ + if (ly_is_fraction (n)) + return ly_scm2rational (n); + else + return rat; +} SCM alist_to_hashq (SCM alist) @@ -665,16 +614,6 @@ ly_hash2alist (SCM tab) return scm_call_1 (func, tab); } -int -procedure_arity (SCM proc) -{ - assert (ly_is_procedure (proc)); - SCM arity = scm_procedure_property (proc, - ly_symbol2scm ("arity")); - - SCM fixed = scm_car (arity); - return scm_to_int (fixed); -} /* C++ interfacing. @@ -722,13 +661,7 @@ parse_symbol_list (char const *symbols) return ly_string_array_to_scm (string_split (s, ' ')); } - -bool -ly_is_fraction (SCM x) -{ - return SCM_FRACTIONP(x); -} - +/* GDB debugging. */ struct ly_t_double_cell { SCM a; @@ -736,3 +669,10 @@ struct ly_t_double_cell SCM c; SCM d; }; + +/* inserts at front, removing duplicates */ +SCM ly_assoc_prepend_x (SCM alist, SCM key, SCM val) +{ + return scm_acons (key, val, scm_assoc_remove_x (alist, key)); +} + diff --git a/lily/lily-lexer-scheme.cc b/lily/lily-lexer-scheme.cc index 66e47d3d6b..4bf001ea0a 100644 --- a/lily/lily-lexer-scheme.cc +++ b/lily/lily-lexer-scheme.cc @@ -3,18 +3,17 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ #include "lily-lexer.hh" LY_DEFINE(ly_lexer_keywords, "ly:lexer-keywords", - 1,0,0, (SCM lexer), + 1, 0, 0, (SCM lexer), "Return a list of (KEY . CODE) pairs, signifying the lilypond reserved words list.") { Lily_lexer * lex = Lily_lexer::unsmob (lexer); SCM_ASSERT_TYPE(lex, lexer, SCM_ARG1, __FUNCTION__, "lily lexer"); return lex->keyword_list (); } - diff --git a/lily/lily-lexer.cc b/lily/lily-lexer.cc index 8d70783cb5..4a877f2d2e 100644 --- a/lily/lily-lexer.cc +++ b/lily/lily-lexer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "lily-lexer.hh" @@ -193,7 +193,7 @@ Lily_lexer::keyword_list () const SCM *tail = &l; for (vsize i = 0; i < keytable_->table_.size (); i++) { - *tail = scm_acons (scm_makfrom0str (keytable_->table_[i].name_), + *tail = scm_acons (scm_from_locale_string (keytable_->table_[i].name_), scm_from_int (keytable_->table_[i].tokcode_), SCM_EOL); @@ -231,12 +231,27 @@ Lily_lexer::start_main_input () new_input (main_input_name_, sources_); - /* Do not allow \include in --safe-mode */ - allow_includes_b_ = allow_includes_b_ && !be_safe_global; - scm_module_define (scm_car (scopes_), ly_symbol2scm ("input-file-name"), - scm_makfrom0str (main_input_name_.c_str ())); + ly_string2scm (main_input_name_)); +} + +void +Lily_lexer::new_input (string str, string d, Sources *ss) +{ + Includable_lexer::new_input (str, d, ss); +} + +void +Lily_lexer::new_input (string str, Sources *ss) +{ + if (is_main_input_ && be_safe_global) + { + LexerError (_ ("include files are not allowed in safe mode").c_str ()); + return; + } + + Includable_lexer::new_input (str, ss); } void diff --git a/lily/lily-parser-scheme.cc b/lily/lily-parser-scheme.cc index 37dbc7a896..ca1d224bd6 100644 --- a/lily/lily-parser-scheme.cc +++ b/lily/lily-parser-scheme.cc @@ -3,21 +3,22 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include +#include "lily-parser.hh" + #include "file-name-map.hh" #include "file-name.hh" #include "file-path.hh" #include "international.hh" #include "lily-lexer.hh" -#include "lily-parser.hh" #include "ly-module.hh" #include "main.hh" #include "program-option.hh" -#include "source.hh" +#include "sources.hh" #include "warn.hh" /* Do not append `!' suffix, since 1st argument is not modified. */ @@ -141,31 +142,15 @@ LY_DEFINE (ly_parse_file, "ly:parse-file", if (error) /* TODO: pass renamed input file too. */ scm_throw (ly_symbol2scm ("ly-file-failed"), - scm_list_1 (scm_makfrom0str (file_name.c_str ()))); + scm_list_1 (ly_string2scm (file_name))); return SCM_UNSPECIFIED; } -LY_DEFINE (ly_parse_string, "ly:parse-string", - 1, 0, 0, (SCM ly_code), - "Parse the string LY_CODE. " - "Upon failure, throw @code{ly-file-failed} key.") -{ - SCM_ASSERT_TYPE (scm_is_string (ly_code), ly_code, SCM_ARG1, __FUNCTION__, "string"); - - Sources sources; - sources.set_path (&global_path); - Lily_parser *parser = new Lily_parser (&sources); - parser->parse_string (ly_scm2string (ly_code)); - parser->unprotect (); - parser = 0; - - return SCM_UNSPECIFIED; -} LY_DEFINE (ly_parser_lexer, "ly:parser-lexer", 1, 0, 0, (SCM parser_smob), - "Return the lexer for PARSER_SMOB.") + "Return the lexer for @var{parser-smob}.") { Lily_parser *parser = unsmob_lily_parser (parser_smob); return parser->lexer_->self_scm (); @@ -173,7 +158,7 @@ LY_DEFINE (ly_parser_lexer, "ly:parser-lexer", LY_DEFINE (ly_parser_clone, "ly:parser-clone", 1, 0, 0, (SCM parser_smob), - "Return a clone of PARSER_SMOB.") + "Return a clone of @var{parser-smob}.") { Lily_parser *parser = unsmob_lily_parser (parser_smob); Lily_parser *clone = new Lily_parser (*parser); @@ -183,7 +168,7 @@ LY_DEFINE (ly_parser_clone, "ly:parser-clone", LY_DEFINE (ly_parser_define, "ly:parser-define!", 3, 0, 0, (SCM parser_smob, SCM symbol, SCM val), - "Bind SYMBOL to VAL in PARSER_SMOB's module.") + "Bind @var{symbol} to @var{val} in @var{parser-smob}'s module.") { Lily_parser *parser = unsmob_lily_parser (parser_smob); SCM_ASSERT_TYPE (scm_is_symbol (symbol), symbol, SCM_ARG2, __FUNCTION__, "symbol"); @@ -195,7 +180,7 @@ LY_DEFINE (ly_parser_define, "ly:parser-define!", LY_DEFINE (ly_parser_lookup, "ly:parser-lookup", 2, 0, 0, (SCM parser_smob, SCM symbol), - "Lookup @var{symbol} in @var{parser_smob}'s module. " + "Lookup @var{symbol} in @var{parser-smob}'s module. " "Undefined is '().") { Lily_parser *parser = unsmob_lily_parser (parser_smob); @@ -212,7 +197,7 @@ LY_DEFINE (ly_parser_lookup, "ly:parser-lookup", LY_DEFINE (ly_parser_parse_string, "ly:parser-parse-string", 2, 0, 0, (SCM parser_smob, SCM ly_code), - "Parse the string LY_CODE with PARSER_SMOB." + "Parse the string @code{ly-code} with @code{parser-smob}." "Upon failure, throw @code{ly-file-failed} key.") { Lily_parser *parser = unsmob_lily_parser (parser_smob); @@ -250,7 +235,7 @@ LY_DEFINE (ly_parser_output_name, "ly:parser-output-name", Lily_parser *p = unsmob_lily_parser (parser); SCM_ASSERT_TYPE (p, parser, SCM_ARG1, __FUNCTION__, "Lilypond parser"); - return scm_makfrom0str (p->output_basename_.c_str ()); + return ly_string2scm (p->output_basename_); } LY_DEFINE (ly_parser_error, "ly:parser-error", @@ -270,3 +255,26 @@ LY_DEFINE (ly_parser_error, "ly:parser-error", return parser; } + +LY_DEFINE (ly_parser_clear_error, "ly:parser-clear-error", + 1, 0, 0, (SCM parser), + "Clear the error flag for the parser.") +{ + Lily_parser *p = unsmob_lily_parser (parser); + SCM_ASSERT_TYPE (p, parser, SCM_ARG1, __FUNCTION__, "Lilypond parser"); + + p->error_level_ = 0; + p->lexer_->error_level_ = 0; + + return SCM_UNSPECIFIED; +} + +LY_DEFINE (ly_parser_has_error_p, "ly:parser-has-error?", + 1, 0, 0, (SCM parser), + "Does @var{parser} have an error flag?") +{ + Lily_parser *p = unsmob_lily_parser (parser); + SCM_ASSERT_TYPE (p, parser, SCM_ARG1, __FUNCTION__, "Lilypond parser"); + + return scm_from_bool (p->error_level_ || p->lexer_->error_level_); +} diff --git a/lily/lily-parser.cc b/lily/lily-parser.cc index ae3943dbdb..456acd1a9e 100644 --- a/lily/lily-parser.cc +++ b/lily/lily-parser.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -15,13 +15,12 @@ #include "international.hh" #include "lily-lexer.hh" #include "lily-version.hh" -#include "lilypond-key.hh" #include "main.hh" #include "output-def.hh" #include "paper-book.hh" #include "parser.hh" #include "score.hh" -#include "source.hh" +#include "sources.hh" #include "text-metrics.hh" #include "warn.hh" @@ -105,7 +104,7 @@ Lily_parser::parse_file (string init, string name, string out_name) File_name f (name); string s = global_path.find (f.base_ + ".twy"); s = gulp_file_to_string (s, false, -1); - scm_eval_string (scm_makfrom0str (s.c_str ())); + scm_eval_string (ly_string2scm (s)); /* Read .ly IN_FILE, lex, parse, write \score blocks from IN_FILE to OUT_FILE (unless IN_FILE redefines output file name). */ @@ -140,8 +139,7 @@ Lily_parser::parse_string (string ly_code) self_scm ()); lexer_->main_input_name_ = ""; - lexer_->is_main_input_ = true; - + lexer_->is_main_input_ = true; lexer_->new_input (lexer_->main_input_name_, ly_code, sources_); SCM mod = lexer_->set_current_scope (); @@ -208,7 +206,6 @@ get_layout (Lily_parser *parser) Output_def *layout = unsmob_output_def (id); layout = layout ? layout->clone () : new Output_def; layout->set_variable (ly_symbol2scm ("is-layout"), SCM_BOOL_T); - layout->parser_ = parser; return layout; } @@ -220,7 +217,6 @@ get_midi (Lily_parser *parser) Output_def *layout = unsmob_output_def (id); layout = layout ? layout->clone () : new Output_def; layout->set_variable (ly_symbol2scm ("is-midi"), SCM_BOOL_T); - layout->parser_ = parser; return layout; } @@ -232,7 +228,6 @@ get_paper (Lily_parser *parser) layout = layout ? dynamic_cast (layout->clone ()) : new Output_def; layout->set_variable (ly_symbol2scm ("is-paper"), SCM_BOOL_T); - layout->parser_ = parser; return layout; } @@ -241,13 +236,19 @@ get_header (Lily_parser *parser) { SCM id = parser->lexer_->lookup_identifier ("$defaultheader"); if (!ly_is_module (id)) - id = ly_make_anonymous_module (be_safe_global); + id = parser->make_scope (); else { - SCM nid = ly_make_anonymous_module (false); - ly_module_copy(nid,id); + SCM nid = parser->make_scope (); + ly_module_copy (nid, id); id = nid; } return id; } + +SCM +Lily_parser::make_scope () const +{ + return ly_make_anonymous_module (be_safe_global); +} diff --git a/lily/lily-version.cc b/lily/lily-version.cc index c15c76e628..1df780b8e1 100644 --- a/lily/lily-version.cc +++ b/lily/lily-version.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Jan Nieuwenhuizen + (c) 1999--2007 Jan Nieuwenhuizen */ #include "lily-version.hh" diff --git a/lily/lilypond-key.cc b/lily/lilypond-key.cc index 99b190bcc4..e69de29bb2 100644 --- a/lily/lilypond-key.cc +++ b/lily/lilypond-key.cc @@ -1,226 +0,0 @@ -/* - lilypond-key.cc -- implement Lilypond_{grob, context}_key - - source file of the GNU LilyPond music typesetter - - (c) 2004--2006 Han-Wen Nienhuys -*/ - -#include "lilypond-key.hh" - -Lilypond_grob_key::Lilypond_grob_key (Object_key const *context, - Moment start, - string name, - int disambiguation_count) -{ - context_ = context; - creation_moment_ = start; - grob_name_ = name; - disambiguation_count_ = disambiguation_count; -} - -void -Lilypond_grob_key::derived_mark () const -{ - if (context_) - scm_gc_mark (context_->self_scm ()); -} - -// todo: reverse order of comparison for efficiency reasons. -int -Lilypond_grob_key::do_compare (Object_key const *key) const -{ - Lilypond_grob_key const *other = dynamic_cast (key); - int c; - - c = context_->compare (other->context_); - if (c) - return c; - - c = Moment::compare (creation_moment_, other->creation_moment_); - if (c) - return c; - - c = grob_name_.compare (other->grob_name_); - if (c) - return c; - - c = sign (disambiguation_count_ - other->disambiguation_count_); - if (c) - return c; - - return 0; -} - -int -Lilypond_grob_key::get_type () const -{ - return GROB_KEY; -} - -SCM -Lilypond_grob_key::as_scheme () const -{ - return scm_list_4 (context_ ? context_->self_scm () : SCM_BOOL_F, - creation_moment_.smobbed_copy (), - scm_makfrom0str (grob_name_.c_str ()), - scm_from_int (disambiguation_count_)); -} - -Object_key * -Lilypond_grob_key::from_scheme (SCM a) -{ - return new Lilypond_grob_key (unsmob_key (scm_car (a)), - *unsmob_moment (scm_cadr (a)), - ly_scm2string (scm_caddr (a)), - scm_to_int (scm_list_ref (a, scm_from_int (3)))); -} - -/****************************************************************/ - -void -Lilypond_context_key::derived_mark () const -{ - if (parent_context_) - scm_gc_mark (parent_context_->self_scm ()); -} - -Lilypond_context_key::Lilypond_context_key (Object_key const *parent, - Moment start, - string type, - string id, - int count) -{ - disambiguation_count_ = count; - parent_context_ = parent; - start_moment_ = start; - context_name_ = type; - id_ = id; -} - -int -Lilypond_context_key::do_compare (Object_key const *key) const -{ - Lilypond_context_key const *other - = dynamic_cast (key); - - int c; - if (parent_context_ && other->parent_context_) - { - c = parent_context_->compare (other->parent_context_); - if (c) - return c; - } - else if (parent_context_) - return -1; - else if (other->parent_context_) - return 1; - - c = Moment::compare (start_moment_, other->start_moment_); - if (c) - return c; - - c = context_name_.compare (other->context_name_); - if (c) - return c; - - c = id_.compare (other->id_); - if (c) - return c; - - c = sign (disambiguation_count_ - other->disambiguation_count_); - if (c) - return c; - - return 0; -} - -int -Lilypond_context_key::get_type () const -{ - return CONTEXT_KEY; -} - -SCM -Lilypond_context_key::as_scheme () const -{ - return scm_list_5 (parent_context_ ? parent_context_->self_scm () : SCM_BOOL_F, - start_moment_.smobbed_copy (), - scm_makfrom0str (context_name_.c_str ()), - scm_makfrom0str (id_.c_str ()), - scm_from_int (disambiguation_count_)); -} - -Object_key * -Lilypond_context_key::from_scheme (SCM a) -{ - return new Lilypond_context_key (unsmob_key (scm_car (a)), - *unsmob_moment (scm_cadr (a)), - ly_scm2string (scm_list_ref (a, scm_from_int (2))), - ly_scm2string (scm_list_ref (a, scm_from_int (3))), - scm_to_int (scm_list_ref (a, scm_from_int (4)))); -} - -/****************************************************************/ - -int -Lilypond_general_key::get_type () const -{ - return GENERAL_KEY; -} - -void -Lilypond_general_key::derived_mark () const -{ - if (parent_) - scm_gc_mark (parent_->self_scm ()); -} - -Lilypond_general_key::Lilypond_general_key (Object_key const *parent, - string name, - int count) -{ - parent_ = parent; - name_ = name; - disambiguation_count_ = count; -} - -int -Lilypond_general_key::do_compare (Object_key const *key)const -{ - Lilypond_general_key const *other - = dynamic_cast (key); - - if (parent_ && other->parent_) - parent_->compare (other->parent_); - else if (parent_) - return -1; - else if (other->parent_) - return 1; - - int c = name_.compare (other->name_); - if (c) - return c; - - c = sign (disambiguation_count_ - other->disambiguation_count_); - if (c) - return c; - - return 0; -} - -SCM -Lilypond_general_key::as_scheme () const -{ - return scm_list_3 (parent_ ? parent_->self_scm () : SCM_BOOL_F, - scm_makfrom0str (name_.c_str ()), - scm_from_int (disambiguation_count_)); -} - -Object_key * -Lilypond_general_key::from_scheme (SCM a) -{ - return new Lilypond_general_key (unsmob_key (scm_car (a)), - ly_scm2string (scm_list_ref (a, scm_from_int (1))), - scm_to_int (scm_list_ref (a, scm_from_int (2)))); -} diff --git a/lily/lilypond-version.cc b/lily/lilypond-version.cc index 21ca2e5212..9c0e938547 100644 --- a/lily/lilypond-version.cc +++ b/lily/lilypond-version.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #include diff --git a/lily/line-interface.cc b/lily/line-interface.cc index f65dc946f2..894d1089cf 100644 --- a/lily/line-interface.cc +++ b/lily/line-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "line-interface.hh" @@ -154,23 +154,5 @@ ADD_INTERFACE (Line_interface, "thickness " "style " "arrow-length " - "arrow-width") + "arrow-width ") - - -/* todo: move this somewhere else? */ -Stencil -points_to_line_stencil (vector points) -{ - Stencil ret; - for (vsize i = 1; i < points.size (); i++) - { - if (points[i-1].is_sane () && points[i].is_sane ()) - { - Stencil line - = Line_interface::make_line (0.1, points[i-1], points[i]); - ret.add_stencil (line); - } - } - return ret; -} diff --git a/lily/line-spanner.cc b/lily/line-spanner.cc index 2f99a0dce2..f6809cda26 100644 --- a/lily/line-spanner.cc +++ b/lily/line-spanner.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ #include "line-spanner.hh" @@ -136,7 +136,7 @@ Line_spanner::line_stencil (Grob *me, Stencil mol; do - mol.add_at_edge (X_AXIS, RIGHT, m, 0, 0); + mol.add_at_edge (X_AXIS, RIGHT, m, 0); while (m.extent (X_AXIS).length () && mol.extent (X_AXIS).length () + m.extent (X_AXIS).length () < dz[X_AXIS]) diff --git a/lily/lookup.cc b/lily/lookup.cc index d8c20c044f..c92ca3bd21 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -147,7 +147,7 @@ Lookup::horizontal_line (Interval w, Real th) Stencil Lookup::blank (Box b) { - return Stencil (b, scm_makfrom0str ("")); + return Stencil (b, scm_from_locale_string ("")); } Stencil @@ -714,17 +714,29 @@ Lookup::triangle (Interval iv, Real thick, Real protude) b[X_AXIS] = Interval (0, iv.length ()); b[Y_AXIS] = Interval (min (0., protude), max (0.0, protude)); - Offset z1 (iv[LEFT], 0); - Offset z2 (iv[RIGHT], 0); - Offset z3 ((z1 + z2)[X_AXIS] / 2, protude); + vector points; + points.push_back (Offset (iv[LEFT], 0)); + points.push_back (Offset (iv[RIGHT], 0)); + points.push_back (Offset (iv.center (), protude)); - /* - TODO: move Triangle to Line_interface ? - */ - Stencil tri = Line_interface::make_line (thick, z1, z2); - tri.add_stencil (Line_interface::make_line (thick, z2, z3)); - tri.add_stencil (Line_interface::make_line (thick, z3, z1)); + return points_to_line_stencil (thick, points); - return tri; } + + +Stencil +Lookup::points_to_line_stencil (Real thick, vector const &points) +{ + Stencil ret; + for (vsize i = 1; i < points.size (); i++) + { + if (points[i-1].is_sane () && points[i].is_sane ()) + { + Stencil line + = Line_interface::make_line (thick, points[i-1], points[i]); + ret.add_stencil (line); + } + } + return ret; +} diff --git a/lily/ly-module.cc b/lily/ly-module.cc index 740f9e4e52..c2e96a4a1c 100644 --- a/lily/ly-module.cc +++ b/lily/ly-module.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "lily-guile.hh" diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc index 85e72d3197..e6fcf4ea0a 100644 --- a/lily/lyric-combine-music-iterator.cc +++ b/lily/lyric-combine-music-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "dispatcher.hh" @@ -15,6 +15,20 @@ #include "music-iterator.hh" #include "music.hh" +/* + This iterator is hairy. It tracks both lyric and melody contexts, + and has a complicated communication route, reading/writing + properties in both. + + In the future, this should rather be done with + + \interpretAsMelodyFor { MUSIC } { LYRICS LYRICS LYRICS } + + This can run an interpret step on MUSIC, generating a stream. Then + the stream can be perused at leisure to apply durations to all of + the LYRICS. +*/ + class Lyric_combine_music_iterator : public Music_iterator { public: @@ -32,7 +46,7 @@ protected: virtual void derived_substitute (Context *, Context *); void set_music_context (Context *to); private: - bool start_new_syllable (); + bool start_new_syllable () const; Context *find_voice (); DECLARE_LISTENER (set_busy); DECLARE_LISTENER (check_new_context); @@ -43,7 +57,8 @@ private: Context *music_context_; SCM lyricsto_voice_name_; - bool busy_; + Moment busy_moment_; + Music_iterator *lyric_iter_; }; @@ -54,17 +69,26 @@ Lyric_combine_music_iterator::Lyric_combine_music_iterator () lyric_iter_ = 0; music_context_ = 0; lyrics_context_ = 0; - busy_ = false; + busy_moment_.set_infinite (-1); } + +/* + It's dubious whether we can ever make this fully work. Due to + associatedVoice switching, this routine may be triggered for + the wrong music_context_ + */ IMPLEMENT_LISTENER (Lyric_combine_music_iterator, set_busy) void Lyric_combine_music_iterator::set_busy (SCM se) { Stream_event *e = unsmob_stream_event (se); - if (e->in_event_class ("note-event") || e->in_event_class ("cluster-note-event")) - busy_ = true; + if ((e->in_event_class ("note-event") || e->in_event_class ("cluster-note-event")) + && music_context_) + busy_moment_ = max (music_context_->now_mom (), + busy_moment_); + } void @@ -73,25 +97,21 @@ Lyric_combine_music_iterator::set_music_context (Context *to) if (music_context_) { music_context_->event_source()->remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event")); - lyrics_context_->unset_property (ly_symbol2scm ("associatedVoiceContext")); } + music_context_ = to; if (to) { to->event_source()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event")); - if (lyrics_context_) - lyrics_context_->set_property ("associatedVoiceContext", to->self_scm ()); } } bool -Lyric_combine_music_iterator::start_new_syllable () +Lyric_combine_music_iterator::start_new_syllable () const { - if (!busy_) + if (busy_moment_ < music_context_->now_mom ()) return false; - busy_ = false; - if (!lyrics_context_) return false; @@ -169,15 +189,13 @@ Lyric_combine_music_iterator::construct_children () Context *voice = find_voice (); if (voice) set_music_context (voice); - else - { - /* - Wait for a Create_context event. If this isn't done, lyrics can be - delayed when voices are created implicitly. - */ - Global_context *g = get_outlet ()->get_global_context (); - g->events_below ()->add_listener (GET_LISTENER (check_new_context), ly_symbol2scm ("CreateContext")); - } + + /* + Wait for a Create_context event. If this isn't done, lyrics can be + delayed when voices are created implicitly. + */ + Global_context *g = get_outlet ()->get_global_context (); + g->events_below ()->add_listener (GET_LISTENER (check_new_context), ly_symbol2scm ("CreateContext")); /* We do not create a Lyrics context, because the user might @@ -191,15 +209,15 @@ void Lyric_combine_music_iterator::check_new_context (SCM sev) { // TODO: Check first if type=Voice and if id matches - (void)sev; - + Stream_event * ev = unsmob_stream_event (sev); + if (ev->get_property ("type") != ly_symbol2scm ("Voice")) + return ; + Context *voice = find_voice (); + if (voice) { set_music_context (voice); - - Global_context *g = voice->get_global_context (); - g->events_below ()->remove_listener (GET_LISTENER (check_new_context), ly_symbol2scm ("CreateContext")); } } @@ -258,6 +276,7 @@ Lyric_combine_music_iterator::process (Moment) set_music_context (0); } + if (music_context_ && (start_new_syllable () || pending_grace_lyric_) && lyric_iter_->ok ()) @@ -271,10 +290,16 @@ Lyric_combine_music_iterator::process (Moment) pending_grace_lyric_ = false; Moment m = lyric_iter_->pending_moment (); + lyrics_context_->set_property (ly_symbol2scm ("associatedVoiceContext"), + music_context_->self_scm ()); lyric_iter_->process (m); music_found_ = true; } + + new_voice = find_voice (); + if (new_voice) + set_music_context (new_voice); } void diff --git a/lily/lyric-combine-music.cc b/lily/lyric-combine-music.cc index d3f2eafe85..7895e154a7 100644 --- a/lily/lyric-combine-music.cc +++ b/lily/lyric-combine-music.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "music.hh" diff --git a/lily/lyric-engraver.cc b/lily/lyric-engraver.cc index 75556716ec..ae0464f97d 100644 --- a/lily/lyric-engraver.cc +++ b/lily/lyric-engraver.cc @@ -3,18 +3,16 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ #include "context.hh" #include "engraver.hh" -#include "font-metric.hh" #include "item.hh" -#include "multi-measure-rest.hh" #include "note-head.hh" -#include "rest.hh" #include "stream-event.hh" +#include "international.hh" #include "translator.icc" @@ -61,7 +59,7 @@ Lyric_engraver::process_music () { SCM text = event_->get_property ("text"); - if (ly_is_equal (text, scm_makfrom0str (" "))) + if (ly_is_equal (text, scm_from_locale_string (" "))) { if (last_text_) last_text_->set_property ("self-alignment-X", scm_from_int (LEFT)); @@ -117,12 +115,20 @@ get_voice_to_lyrics (Context *lyrics) Grob * get_current_note_head (Context *voice) { + Moment now = voice->now_mom (); for (SCM s = voice->get_property ("busyGrobs"); scm_is_pair (s); s = scm_cdr (s)) { - Item *g = dynamic_cast (unsmob_grob (scm_cdar (s))); - - if (g && !g->get_column () + Grob *g = unsmob_grob (scm_cdar (s));; + Moment *end_mom = unsmob_moment (scm_caar (s)); + if (!end_mom || !g) + { + programming_error ("busyGrobs invalid"); + continue; + } + + if (end_mom->main_part_ > now.main_part_ + && dynamic_cast (g) && Note_head::has_interface (g)) return g; } @@ -147,6 +153,11 @@ Lyric_engraver::stop_translation_timestep () if (melisma_busy (voice)) text_->set_property ("self-alignment-X", scm_from_int (LEFT)); } + else + { + text_->warning (_ ("Lyric syllable does not have note. Use \\lyricsto or associatedVoice.")); + text_->set_property ("X-offset", scm_from_int (0)); + } } last_text_ = text_; diff --git a/lily/lyric-extender.cc b/lily/lyric-extender.cc index d30a53d668..ce9e0fbc2e 100644 --- a/lily/lyric-extender.cc +++ b/lily/lyric-extender.cc @@ -2,7 +2,7 @@ lyric-extender.cc -- implement Lyric_extender source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ diff --git a/lily/lyric-hyphen.cc b/lily/lyric-hyphen.cc index d38460be74..d50a997276 100644 --- a/lily/lyric-hyphen.cc +++ b/lily/lyric-hyphen.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Han-Wen Nienhuys + (c) 2003--2007 Han-Wen Nienhuys */ #include "lyric-hyphen.hh" diff --git a/lily/lyric-performer.cc b/lily/lyric-performer.cc index e21b7fab35..0d14a737d2 100644 --- a/lily/lyric-performer.cc +++ b/lily/lyric-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "audio-item.hh" diff --git a/lily/main.cc b/lily/main.cc index 5aba63d78d..508b4b8f5b 100644 --- a/lily/main.cc +++ b/lily/main.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "main.hh" @@ -77,8 +77,8 @@ bool be_verbose_global = false; /* Scheme code to execute before parsing, after .scm init. This is where -e arguments are appended to. */ -string init_scheme_code_string; -string init_scheme_variables; +string init_scheme_code_global; +string init_scheme_variables_global; /* Generate preview of first system. */ bool make_preview = false; @@ -153,7 +153,7 @@ static Long_option_init options_static[] {_i ("BACK"), "backend", 'b', _i ("use backend BACK (eps, gnome, ps [default],\nscm, svg, tex, texstr)")}, {_i ("SYM[=VAL]"), "define-default", 'd', - _i ("set Scheme option SYM to VAL (default: #t)\n" + _i ("set Scheme option SYM to VAL (default: #t).\n" "Use -dhelp for help.")}, {_i ("EXPR"), "evaluate", 'e', _i ("evaluate scheme code")}, @@ -178,8 +178,6 @@ static Long_option_init options_static[] {_i ("FILE"), "output", 'o', _i ("write output to FILE (suffix will be added)")}, {0, "preview", 'p', _i ("generate a preview of the first system")}, {0, "relocate", 0, _i ("relocate using directory of lilypond program")}, - {0, "safe-mode", 's', _i ("disallow unsafe Scheme and PostScript\n" - "operations")}, {0, "version", 'v', _i ("show version number and exit")}, {0, "verbose", 'V', _i ("be verbose")}, {0, "warranty", 'w', _i ("show warranty and copyright")}, @@ -222,7 +220,7 @@ static void copyright () { printf (_f ("Copyright (c) %s by\n%s and others.", - "1996--2006", + "1996--2007", AUTHORS).c_str ()); printf ("\n"); } @@ -388,33 +386,16 @@ main_with_guile (void *, int, char **) || output_backend_global == "texstr"); is_pango_format_global = !is_TeX_format_global; + init_scheme_variables_global = "(list " + init_scheme_variables_global + ")"; + init_scheme_code_global = "(begin " + init_scheme_code_global + ")"; ly_c_init_guile (); call_constructors (); - init_global_tweak_registry (); init_fontconfig (); init_freetype (); ly_reset_all_fonts (); - if (!init_scheme_variables.empty () - || !init_scheme_code_string.empty ()) - { - init_scheme_variables = "(map (lambda (x) (ly:set-option (car x) (cdr x))) (list " - + init_scheme_variables + "))"; - - init_scheme_code_string - = "(begin #t " - + init_scheme_variables - + init_scheme_code_string - + ")"; - - char const *str0 = init_scheme_code_string.c_str (); - - if (be_verbose_global) - progress_indication (_f ("Evaluating %s", str0)); - scm_c_eval_string ((char *) str0); - } /* We accept multiple independent music files on the command line to reduce compile time when processing lots of small files. @@ -424,7 +405,7 @@ main_with_guile (void *, int, char **) SCM *tail = &files; while (char const *arg = option_parser->get_next_arg ()) { - *tail = scm_cons (scm_makfrom0str (arg), SCM_EOL); + *tail = scm_cons (scm_from_locale_string (arg), SCM_EOL); tail = SCM_CDRLOC (*tail); } @@ -506,10 +487,10 @@ parse_argv (int argc, char **argv) if (eq != NPOS) { key = arg.substr (0, eq); - val = arg.substr (eq + 1, key.length () - 1); + val = arg.substr (eq + 1, arg.length () - 1); } - init_scheme_variables + init_scheme_variables_global += "(cons \'" + key + " " + val + ")\n"; } break; @@ -528,8 +509,9 @@ parse_argv (int argc, char **argv) case 'j': jail_spec = option_parser->optional_argument_str0_; break; + case 'e': - init_scheme_code_string += option_parser->optional_argument_str0_; + init_scheme_code_global += option_parser->optional_argument_str0_ + string (" "); break; case 'w': warranty (); @@ -564,12 +546,6 @@ parse_argv (int argc, char **argv) break; case 'V': be_verbose_global = true; - break; - case 's': - be_safe_global = true; - init_scheme_variables - += "(cons \'safe #t)\n"; - break; case 'p': make_preview = true; diff --git a/lily/mark-engraver.cc b/lily/mark-engraver.cc index 3682618ec9..984eb687a0 100644 --- a/lily/mark-engraver.cc +++ b/lily/mark-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #include diff --git a/lily/measure-grouping-engraver.cc b/lily/measure-grouping-engraver.cc index fe7abf1ea4..311448302c 100644 --- a/lily/measure-grouping-engraver.cc +++ b/lily/measure-grouping-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "warn.hh" diff --git a/lily/measure-grouping-spanner.cc b/lily/measure-grouping-spanner.cc index a256d0468d..f2cd989474 100644 --- a/lily/measure-grouping-spanner.cc +++ b/lily/measure-grouping-spanner.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "measure-grouping-spanner.hh" diff --git a/lily/melisma-translator.cc b/lily/melisma-translator.cc deleted file mode 100644 index eda732be5b..0000000000 --- a/lily/melisma-translator.cc +++ /dev/null @@ -1,81 +0,0 @@ -/* - melisma-engraver.cc -- implement Melisma_engraver - - source file of the GNU LilyPond music typesetter - - (c) 1999--2006 Han-Wen Nienhuys -*/ - -#include "engraver.hh" -#include "grob.hh" -#include "context.hh" -#include "music.hh" -#include "translator.icc" - -/* Remove this translator. */ - -/** - Signal existence of melismas. -*/ -class Melisma_translator : public Translator -{ -public: - TRANSLATOR_DECLARATIONS (Melisma_translator); -protected: - virtual bool try_music (Music *); - void process_music (); - void start_translation_timestep (); - Music *event_; -}; - -bool -Melisma_translator::try_music (Music *m) -{ - if (m->is_mus_type ("melisma-playing-event")) - return melisma_busy (context ()); - else if (m->is_mus_type ("melisma-span-event")) - { - event_ = m; - return true; - } - - return false; -} - -void -Melisma_translator::process_music () -{ - if (event_) - { - SCM sd = event_->get_property ("span-direction"); - Direction d = to_dir (sd); - if (d == START) - context ()->set_property ("melismaBusy", SCM_BOOL_T); - else - context ()->unset_property (ly_symbol2scm ("melismaBusy")); - } -} - -void -Melisma_translator::start_translation_timestep () -{ - event_ = 0; -} - -Melisma_translator::Melisma_translator () -{ - event_ = 0; -} - -ADD_TRANSLATOR (Melisma_translator, - /* doc */ "This translator collects melisma information about ties, beams, and user settings (@code{melismaBusy}, and signals it to the @code{\addlyrics} code. ", - /* create */ "", - /* read */ - "beamMelismaBusy " - "melismaBusy " - "melismaBusyProperties " - "slurMelismaBusy " - "tieMelismaBusy " - , - - /* write */ ""); diff --git a/lily/melody-engraver.cc b/lily/melody-engraver.cc index f968eae321..9c0cb1d5fa 100644 --- a/lily/melody-engraver.cc +++ b/lily/melody-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ diff --git a/lily/melody-spanner.cc b/lily/melody-spanner.cc index d4901f2c9b..e11163bf4d 100644 --- a/lily/melody-spanner.cc +++ b/lily/melody-spanner.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -27,7 +27,7 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) Grob *stem = unsmob_grob (smob); Grob *me = unsmob_grob (stem->get_object ("melody-spanner")); if (!me || !me->is_live ()) - return SCM_UNSPECIFIED; + return scm_from_int (DOWN); extract_grob_set (me, "stems", stems); @@ -41,7 +41,8 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) && !dirs[next_nonneutral]) next_nonneutral++; - while (last_nonneutral == VPOS || last_nonneutral < dirs.size () - 1) + SCM retval = SCM_EOL; + while (last_nonneutral == VPOS || last_nonneutral + 1 < dirs.size ()) { Direction d1 = CENTER; Direction d2 = CENTER; @@ -61,8 +62,12 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) total = to_dir (me->get_property ("neutral-direction")); for (vsize i = last_nonneutral + 1; i < next_nonneutral; i++) - stems[i]->set_property ("neutral-direction", scm_from_int (total)); - + { + if (stems[i] == stem) + retval = scm_from_int (total); + else + stems[i]->set_property ("neutral-direction", scm_from_int (total)); + } last_nonneutral = next_nonneutral; while (last_nonneutral < dirs.size () @@ -76,8 +81,7 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) next_nonneutral++; } - me->suicide (); - return SCM_UNSPECIFIED; + return retval; } void diff --git a/lily/mensural-ligature-engraver.cc b/lily/mensural-ligature-engraver.cc index a6a48a8f18..11d32cd824 100644 --- a/lily/mensural-ligature-engraver.cc +++ b/lily/mensural-ligature-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Juergen Reuter , + (c) 2002--2007 Juergen Reuter , Pal Benko */ @@ -384,7 +384,7 @@ Mensural_ligature_engraver::fold_up_primitives (vector primitives) if (Rhythmic_head::dot_count (current) > 0) // Move dots above/behind the ligature. { - if (i < primitives.size () - 1) + if (i + 1 < primitives.size ()) // dot in the midst => move above head { // FIXME: Amount of vertical dot-shift should depend on @@ -416,6 +416,7 @@ Mensural_ligature_engraver::build_ligature (Spanner *ligature, ADD_ACKNOWLEDGER (Mensural_ligature_engraver, rest); ADD_ACKNOWLEDGER (Mensural_ligature_engraver, note_head); + ADD_TRANSLATOR (Mensural_ligature_engraver, /* doc */ "Handles Mensural_ligature_events by glueing special ligature heads together.", /* create */ "MensuralLigature", diff --git a/lily/mensural-ligature.cc b/lily/mensural-ligature.cc index 88a1181058..12b5218429 100644 --- a/lily/mensural-ligature.cc +++ b/lily/mensural-ligature.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Juergen Reuter , + (c) 2002--2007 Juergen Reuter , Pal Benko */ diff --git a/lily/metronome-engraver.cc b/lily/metronome-engraver.cc index 9caa9cebef..a663e57351 100644 --- a/lily/metronome-engraver.cc +++ b/lily/metronome-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #include diff --git a/lily/midi-chunk.cc b/lily/midi-chunk.cc new file mode 100644 index 0000000000..5aaf5bd2e6 --- /dev/null +++ b/lily/midi-chunk.cc @@ -0,0 +1,157 @@ +/* + midi-chunk.cc -- implement Midi_chunk + + source file of the GNU LilyPond music typesetter + + (c) 2007 Han-Wen Nienhuys + +*/ + +#include "midi-chunk.hh" + +#include "midi-item.hh" +#include "std-string.hh" +#include "string-convert.hh" + +Midi_track::Midi_track () +{ + // 4D 54 72 6B MTrk + // 00 00 00 3B chunk length (59) + // 00 FF 58 04 04 02 18 08 time signature + // 00 FF 51 03 07 A1 20 tempo + + // FF 59 02 sf mi Key Signature + // sf = -7: 7 flats + // sf = -1: 1 flat + // sf = 0: key of C + // sf = 1: 1 sharp + // sf = 7: 7 sharps + // mi = 0: major key + // mi = 1: minor key + + number_ = 0; + + char const *data_str0 = "" + // "00" "ff58" "0404" "0218" "08" + // "00" "ff51" "0307" "a120" + // why a key at all, in midi? + // key: C + // "00" "ff59" "02" "00" "00" + // key: F (scsii-menuetto) + // "00" "ff59" "02" "ff" "00" + ; + + string data_string; + // only for format 0 (currently using format 1)? + data_string += String_convert::hex2bin (data_str0); + + char const *footer_str0 = "00" "ff2f" "00"; + string footer_string = String_convert::hex2bin (footer_str0); + + set ("MTrk", data_string, footer_string); +} + +void +Midi_track::add (int delta_ticks, Midi_item *midi) +{ + assert (delta_ticks >= 0); + + Midi_event *e = new Midi_event (delta_ticks, midi); + events_.push_back (e); +} + +string +Midi_track::data_string () const +{ + string str = Midi_chunk::data_string (); + + for (vector::const_iterator i (events_.begin()); + i != events_.end(); i ++) + { + str += (*i)->to_string (); + } + return str; +} + + +Midi_track::~Midi_track () +{ + junk_pointers (events_); +} + +/**************************************************************** + event +*/ +Midi_event::Midi_event (int delta_ticks, Midi_item *midi) +{ + delta_ticks_ = delta_ticks; + midi_ = midi; +} + +string +Midi_event::to_string () const +{ + string delta_string = int2midi_varint_string (delta_ticks_); + string midi_string = midi_->to_string (); + assert (midi_string.length ()); + return delta_string + midi_string; +} +/**************************************************************** + header +*/ + +Midi_header::Midi_header (int format, int tracks, int clocks_per_4) +{ + string str; + + string format_string = String_convert::int2hex (format, 4, '0'); + str += String_convert::hex2bin (format_string); + + string tracks_string = String_convert::int2hex (tracks, 4, '0'); + str += String_convert::hex2bin (tracks_string); + + string tempo_string = String_convert::int2hex (clocks_per_4, 4, '0'); + str += String_convert::hex2bin (tempo_string); + + set ("MThd", str, ""); +} + + +/**************************************************************** + chunk + */ +Midi_chunk::~Midi_chunk () +{ + +} + +void +Midi_chunk::set (string header_string, string data_string, string footer_string) +{ + data_string_ = data_string; + footer_string_ = footer_string; + header_string_ = header_string; +} + +string +Midi_chunk::data_string () const +{ + return data_string_; +} + +string +Midi_chunk::to_string () const +{ + string str = header_string_; + string dat = data_string (); + string length_string = String_convert::int2hex (dat.length () + + footer_string_.length (), 8, '0'); + length_string = String_convert::hex2bin (length_string); + + str += length_string; + str += dat; + str += footer_string_; + + return str; +} + diff --git a/lily/midi-item.cc b/lily/midi-item.cc index 3fcdb4ca22..3d2d67a38e 100644 --- a/lily/midi-item.cc +++ b/lily/midi-item.cc @@ -1,9 +1,9 @@ /* - midi-item.cc -- implement Midi items. + midi-item.cc -- implement MIDI items. source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "midi-item.hh" @@ -40,44 +40,14 @@ Midi_item::get_midi (Audio_item *a) else if (Audio_time_signature *i = dynamic_cast (a)) return new Midi_time_signature (i); else if (Audio_text *i = dynamic_cast (a)) - //return i->text_string_.length () ? new Midi_text (i) : 0; return new Midi_text (i); else assert (0); - // isn't C++ grand? return 0; } -void -Midi_chunk::set (string header_string, string data_string, string footer_string) -{ - data_string_ = data_string; - footer_string_ = footer_string; - header_string_ = header_string; -} - -string -Midi_chunk::data_string () const -{ - return data_string_; -} - -string -Midi_chunk::to_string () const -{ - string str = header_string_; - string dat = data_string (); - string length_string = String_convert::int2hex (dat.length () - + footer_string_.length (), 8, '0'); - length_string = String_convert::hex2bin (length_string); - str += length_string; - str += dat; - str += footer_string_; - - return str; -} Midi_duration::Midi_duration (Real seconds_f) { @@ -90,44 +60,6 @@ Midi_duration::to_string () const return string (""; } -Midi_event::Midi_event (Moment delta_mom, Midi_item *midi) -{ - delta_mom_ = delta_mom; - midi_ = midi; -} - -/* - ugh. midi output badly broken since grace note hackage. -*/ -string -Midi_event::to_string () const -{ - Rational rat_dt = (delta_mom_.main_part_ * Rational (384) - + delta_mom_.grace_part_ * Rational (100)) * Rational (4); - int delta = rat_dt.to_int (); - - string delta_string = Midi_item::i2varint_string (delta); - string midi_string = midi_->to_string (); - assert (midi_string.length ()); - return delta_string + midi_string; -} - -Midi_header::Midi_header (int format, int tracks, int clocks_per_4) -{ - string str; - - string format_string = String_convert::int2hex (format, 4, '0'); - str += String_convert::hex2bin (format_string); - - string tracks_string = String_convert::int2hex (tracks, 4, '0'); - str += String_convert::hex2bin (tracks_string); - - string tempo_string = String_convert::int2hex (clocks_per_4, 4, '0'); - str += String_convert::hex2bin (tempo_string); - - set ("MThd", str, ""); -} - Midi_instrument::Midi_instrument (Audio_instrument *a) { audio_ = a; @@ -140,9 +72,6 @@ Midi_instrument::to_string () const Byte program_byte = 0; bool found = false; - /* - UGH. don't use eval. - */ SCM proc = ly_lily_module_constant ("midi-program"); SCM program = scm_call_1 (proc, ly_symbol2scm (audio_->str_.c_str ())); found = (program != SCM_BOOL_F); @@ -160,11 +89,6 @@ Midi_item::Midi_item () { } -Midi_channel_item::~Midi_channel_item () -{ - channel_ = 0; -} - Midi_channel_item::Midi_channel_item () { channel_ = 0; @@ -175,7 +99,7 @@ Midi_item::~Midi_item () } string -Midi_item::i2varint_string (int i) +int2midi_varint_string (int i) { int buffer = i & 0x7f; while ((i >>= 7) > 0) @@ -248,12 +172,6 @@ Midi_note::Midi_note (Audio_note *a) dynamic_byte_ = 0x7f; } -Moment -Midi_note::get_length () const -{ - Moment m = audio_->length_mom_; - return m; -} int Midi_note::get_fine_tuning () const @@ -297,7 +215,7 @@ Midi_note::to_string () const str += ::to_string ((char) (0x00)); } - str += ::to_string ((char)status_byte); + str += ::to_string ((char) status_byte); str += ::to_string ((char) (get_semitone_pitch () + c0_pitch_)); str += ::to_string ((char)dynamic_byte_); @@ -414,84 +332,13 @@ Midi_text::to_string () const { string str = "ff" + String_convert::int2hex (audio_->type_, 2, '0'); str = String_convert::hex2bin (str); - str += i2varint_string (audio_->text_string_.length ()); + str += int2midi_varint_string (audio_->text_string_.length ()); str += audio_->text_string_; return str; } -Midi_track::Midi_track () - : Midi_chunk () -{ - // 4D 54 72 6B MTrk - // 00 00 00 3B chunk length (59) - // 00 FF 58 04 04 02 18 08 time signature - // 00 FF 51 03 07 A1 20 tempo - - // FF 59 02 sf mi Key Signature - // sf = -7: 7 flats - // sf = -1: 1 flat - // sf = 0: key of C - // sf = 1: 1 sharp - // sf = 7: 7 sharps - // mi = 0: major key - // mi = 1: minor key - - number_ = 0; - - char const *data_str0 = "" - // "00" "ff58" "0404" "0218" "08" - // "00" "ff51" "0307" "a120" - // why a key at all, in midi? - // key: C - // "00" "ff59" "02" "00" "00" - // key: F (scsii-menuetto) - // "00" "ff59" "02" "ff" "00" - ; - - string data_string; - // only for format 0 (currently using format 1)? - data_string += String_convert::hex2bin (data_str0); - - char const *footer_str0 = "00" "ff2f" "00"; - string footer_string = String_convert::hex2bin (footer_str0); - - set ("MTrk", data_string, footer_string); -} - -void -Midi_track::add (Moment delta_time_mom, Midi_item *midi) -{ - assert (delta_time_mom >= Moment (0)); - - Midi_event *e = new Midi_event (delta_time_mom, midi); - events_.push_back (e); -} - -string -Midi_track::data_string () const -{ - string str = Midi_chunk::data_string (); - if (do_midi_debugging_global) - str += "\n"; - - for (vector::const_iterator i (events_.begin()); - i != events_.end(); i ++) - { - str += (*i)->to_string (); - if (do_midi_debugging_global) - str += "\n"; - } - return str; -} - - char const * Midi_item::name () const { return this->class_name (); } - -Midi_track::~Midi_track () -{ - junk_pointers (events_); -} diff --git a/lily/midi-stream.cc b/lily/midi-stream.cc index b5d02f8400..bcaefe7c18 100644 --- a/lily/midi-stream.cc +++ b/lily/midi-stream.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "midi-stream.hh" @@ -13,7 +13,7 @@ using namespace std; #include "international.hh" #include "main.hh" -#include "midi-item.hh" +#include "midi-chunk.hh" #include "misc.hh" #include "program-option.hh" #include "stream.hh" @@ -33,8 +33,8 @@ Midi_stream::~Midi_stream () fclose (out_file_); } -Midi_stream & -Midi_stream::operator << (string str) +void +Midi_stream::write (string str) { size_t sz = sizeof (Byte); size_t n = str.length (); @@ -42,34 +42,13 @@ Midi_stream::operator << (string str) if (written != sz * n) warning (_ ("cannot write to file: `%s'")); - - return *this; } -Midi_stream & -Midi_stream::operator << (Midi_item const &midi_c_r) +void +Midi_stream::write (Midi_chunk const &midi) { - string str = midi_c_r.to_string (); - - // ugh, should have separate debugging output with Midi*::print routines - if (do_midi_debugging_global) - { - str = String_convert::bin2hex (str) + "\n"; - for (ssize i = str.find ("0a"); i != NPOS; i = str.find ("0a")) - { - str[i] = '\n'; - str[i + 1] = '\t'; - } - } + string str = midi.to_string (); - return operator << (str); -} - -Midi_stream & -Midi_stream::operator << (int i) -{ - // output binary string ourselves - *this << Midi_item::i2varint_string (i); - return *this; + return write (str); } diff --git a/lily/midi-walker.cc b/lily/midi-walker.cc index c2aaa085b1..cef858c927 100644 --- a/lily/midi-walker.cc +++ b/lily/midi-walker.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -12,12 +12,13 @@ #include "audio-column.hh" #include "audio-staff.hh" #include "midi-item.hh" +#include "midi-chunk.hh" #include "midi-stream.hh" #include "warn.hh" Midi_note_event::Midi_note_event () { - ignore_b_ = false; + ignore_ = false; } int @@ -33,21 +34,33 @@ compare (Midi_note_event const &left, Midi_note_event const &right) return 0; } +bool +audio_item_less (Audio_item * const a, + Audio_item * const b) +{ + return a->get_column ()->when_ < b->get_column ()->when_; +} + Midi_walker::Midi_walker (Audio_staff *audio_staff, Midi_track *track, int channel) { channel_ = channel; track_ = track; index_ = 0; - items_ = &audio_staff->audio_items_; - - last_mom_ = 0; + items_ = audio_staff->audio_items_; + vector_sort (items_, audio_item_less); + last_tick_ = 0; } Midi_walker::~Midi_walker () { - // ugh - do_stop_notes (last_mom_ + Moment (Rational (10, 1))); + junk_pointers (midi_events_); +} + +void +Midi_walker::finalize () +{ + do_stop_notes (INT_MAX); } /** @@ -56,20 +69,23 @@ Midi_walker::~Midi_walker () void Midi_walker::do_start_note (Midi_note *note) { - Audio_item *ptr = (*items_)[index_]; - Moment stop_mom = note->get_length () + ptr->audio_column_->at_mom (); + Audio_item *ptr = items_[index_]; + int stop_ticks = int (moment_to_real (note->audio_->length_mom_) * Real (384 * 4)) + + ptr->audio_column_->ticks (); bool play_start = true; for (vsize i = 0; i < stop_note_queue.size (); i++) { /* if this pith already in queue */ - if (stop_note_queue[i].val->get_semitone_pitch () == note->get_semitone_pitch ()) + if (stop_note_queue[i].val->get_semitone_pitch () + == note->get_semitone_pitch ()) { - if (stop_note_queue[i].key < stop_mom) + if (stop_note_queue[i].key < stop_ticks) { /* let stopnote in queue be ignored, new stop note wins */ - stop_note_queue[i].ignore_b_ = true; + stop_note_queue[i].ignore_ = true; + /* don't replay start note, */ play_start = false; break; @@ -78,7 +94,6 @@ Midi_walker::do_start_note (Midi_note *note) { /* skip this stopnote, don't play the start note */ - delete note; note = 0; break; } @@ -89,11 +104,13 @@ Midi_walker::do_start_note (Midi_note *note) { Midi_note_event e; e.val = new Midi_note_off (note); - e.key = stop_mom; + + midi_events_.push_back (e.val); + e.key = int (stop_ticks); stop_note_queue.insert (e); if (play_start) - output_event (ptr->audio_column_->at_mom (), note); + output_event (ptr->audio_column_->ticks (), note); } } @@ -101,69 +118,75 @@ Midi_walker::do_start_note (Midi_note *note) Output note events for all notes which end before #max_mom# */ void -Midi_walker::do_stop_notes (Moment max_mom) +Midi_walker::do_stop_notes (int max_ticks) { - while (stop_note_queue.size () && stop_note_queue.front ().key <= max_mom) + while (stop_note_queue.size () && stop_note_queue.front ().key <= max_ticks) { Midi_note_event e = stop_note_queue.get (); - if (e.ignore_b_) + if (e.ignore_) { - delete e.val; continue; } - Moment stop_mom = e.key; + int stop_ticks = e.key; Midi_note *note = e.val; - output_event (stop_mom, note); + output_event (stop_ticks, note); } } -/** - Advance the track to #now#, output the item, and adjust current "moment". -*/ void -Midi_walker::output_event (Moment now_mom, Midi_item *l) +Midi_walker::output_event (int now_ticks, Midi_item *l) { - Moment delta_t = now_mom - last_mom_; - last_mom_ = now_mom; + int delta_ticks = now_ticks - last_tick_; + last_tick_ = now_ticks; /* this is not correct, but at least it doesn't crash when you start with graces */ - if (delta_t < Moment (0)) - delta_t = Moment (0); + if (delta_ticks < 0) + { + programming_error ("Going back in MIDI time."); + delta_ticks = 0; + } - track_->add (delta_t, l); + track_->add (delta_ticks, l); } void Midi_walker::process () { - Audio_item *audio = (*items_)[index_]; - do_stop_notes (audio->audio_column_->at_mom ()); + Audio_item *audio = items_[index_]; + do_stop_notes (audio->audio_column_->ticks ()); - if (Midi_item *midi = Midi_item::get_midi (audio)) + if (Midi_item *midi = get_midi (audio)) { if (Midi_channel_item *mci = dynamic_cast (midi)) mci->channel_ = channel_; - //midi->channel_ = track_->number_; if (Midi_note *note = dynamic_cast (midi)) { - if (note->get_length ().to_bool ()) + if (note->audio_->length_mom_.to_bool ()) do_start_note (note); } else - output_event (audio->audio_column_->at_mom (), midi); + output_event (audio->audio_column_->ticks (), midi); } } +Midi_item* +Midi_walker::get_midi (Audio_item *i) +{ + Midi_item *mi = Midi_item::get_midi (i); + midi_events_.push_back (mi); + return mi; +} + bool Midi_walker::ok () const { - return index_ < items_->size (); + return index_ < items_.size (); } void diff --git a/lily/misc.cc b/lily/misc.cc index aa49a697a6..6837df0d74 100644 --- a/lily/misc.cc +++ b/lily/misc.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -56,6 +56,14 @@ peak_around (Real epsilon, Real threshold, Real x) return max (- epsilon * (x - threshold) / ((x + epsilon) * threshold), 0.0); } +/* + 0 at 0, 1 at standard_x, and increasing thereafter. + */ +Real +convex_amplifier (Real standard_x, Real increase_factor, Real x) +{ + return (exp (increase_factor * x / standard_x) - 1.0) / (exp (increase_factor) - 1.0); +} string camel_case_to_lisp_identifier (string in) diff --git a/lily/modified-font-metric.cc b/lily/modified-font-metric.cc index e0fb13044d..9a5488f1cc 100644 --- a/lily/modified-font-metric.cc +++ b/lily/modified-font-metric.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include using namespace std; @@ -178,7 +178,7 @@ Modified_font_metric::text_stencil (string text) const Box Modified_font_metric::text_dimension (string text) const { - SCM stext = scm_makfrom0str (text.c_str ()); + SCM stext = ly_string2scm (text); Box b; if (output_backend_global == "tex") diff --git a/lily/module-scheme.cc b/lily/module-scheme.cc index f930a2856e..ce08c42456 100644 --- a/lily/module-scheme.cc +++ b/lily/module-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "ly-module.hh" diff --git a/lily/moment-scheme.cc b/lily/moment-scheme.cc index bc8dfae78b..b19259e6b2 100644 --- a/lily/moment-scheme.cc +++ b/lily/moment-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "moment.hh" diff --git a/lily/moment.cc b/lily/moment.cc index 1f32fb80eb..7516bf20e1 100644 --- a/lily/moment.cc +++ b/lily/moment.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "moment.hh" diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index 5d0d7d9713..ecb0d97a62 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -1,7 +1,7 @@ /* multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index 44d699b7ce..1b66670a7c 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Jan Nieuwenhuizen + (c) 1998--2007 Jan Nieuwenhuizen */ #include "multi-measure-rest.hh" @@ -183,8 +183,8 @@ Multi_measure_rest::big_rest (Grob *me, Real width) Stencil m = Lookup::round_filled_box (b, blot); Stencil yb = Lookup::round_filled_box (Box (Interval (-0.5, 0.5) * ythick, Interval (-ss, ss)), blot); - m.add_at_edge (X_AXIS, RIGHT, yb, 0, 0); - m.add_at_edge (X_AXIS, LEFT, yb, 0, 0); + m.add_at_edge (X_AXIS, RIGHT, yb, 0); + m.add_at_edge (X_AXIS, LEFT, yb, 0); m.align_to (X_AXIS, LEFT); @@ -205,11 +205,11 @@ Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measures, int count = 0; Real symbols_width = 0.0; - SCM sml = me->get_property ("use-breve-rest"); + bool use_breve = to_boolean (me->get_property ("use-breve-rest")); while (l) { - if (sml == SCM_BOOL_T) + if (use_breve) { int k; if (l >= 2) @@ -268,7 +268,7 @@ Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measures, Stencil mol; for (SCM s = mols; scm_is_pair (s); s = scm_cdr (s)) mol.add_at_edge (X_AXIS, LEFT, *unsmob_stencil (scm_car (s)), - inner_padding, 0); + inner_padding); mol.align_to (X_AXIS, LEFT); mol.translate_axis (outer_padding_factor * inner_padding, X_AXIS); diff --git a/lily/music-function.cc b/lily/music-function.cc index 6a97db4a55..7815ee1092 100644 --- a/lily/music-function.cc +++ b/lily/music-function.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "music-function.hh" diff --git a/lily/music-iterator.cc b/lily/music-iterator.cc index 3a97459f89..789b2b243c 100644 --- a/lily/music-iterator.cc +++ b/lily/music-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ diff --git a/lily/music-output.cc b/lily/music-output.cc index 096dd33007..ee8cbc1522 100644 --- a/lily/music-output.cc +++ b/lily/music-output.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "music-output.hh" diff --git a/lily/music-scheme.cc b/lily/music-scheme.cc index 82f52a5c00..711df4d1a1 100644 --- a/lily/music-scheme.cc +++ b/lily/music-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "music.hh" diff --git a/lily/music-sequence.cc b/lily/music-sequence.cc index 30ca686e79..7a0d5863a0 100644 --- a/lily/music-sequence.cc +++ b/lily/music-sequence.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "music-sequence.hh" diff --git a/lily/music-wrapper-iterator.cc b/lily/music-wrapper-iterator.cc index bc59a303a6..b6d0d61656 100644 --- a/lily/music-wrapper-iterator.cc +++ b/lily/music-wrapper-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "music-wrapper-iterator.hh" diff --git a/lily/music-wrapper.cc b/lily/music-wrapper.cc index 5f141c0c91..968c4447a7 100644 --- a/lily/music-wrapper.cc +++ b/lily/music-wrapper.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "music-wrapper.hh" diff --git a/lily/music.cc b/lily/music.cc index 83f88fbcd9..b22e243139 100644 --- a/lily/music.cc +++ b/lily/music.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "music.hh" @@ -63,8 +63,7 @@ Music::copy_mutable_properties () const void Music::type_check_assignment (SCM s, SCM v) const { - if (!::type_check_assignment (s, v, ly_symbol2scm ("music-type?"))) - abort (); + ::type_check_assignment (s, v, ly_symbol2scm ("music-type?")); } Music::Music (Music const &m) @@ -184,29 +183,28 @@ Music::compress (Moment factor) } /* - This mutates alist. Hence, make sure that it is not changed + This mutates alist. Hence, make sure that it is not shared */ -SCM +void transpose_mutable (SCM alist, Pitch delta) { - SCM retval = SCM_EOL; - for (SCM s = alist; scm_is_pair (s); s = scm_cdr (s)) { SCM entry = scm_car (s); SCM prop = scm_car (entry); SCM val = scm_cdr (entry); - + SCM new_val = val; + if (Pitch *p = unsmob_pitch (val)) { Pitch transposed = p->transposed (delta); - scm_set_cdr_x (entry, transposed.smobbed_copy ()); - if (transposed.get_alteration ().abs () > Rational (1,1)) { warning (_f ("transposition by %s makes alteration larger than double", delta.to_string ())); } + + new_val = transposed.smobbed_copy (); } else if (prop == ly_symbol2scm ("element")) { @@ -217,12 +215,11 @@ transpose_mutable (SCM alist, Pitch delta) transpose_music_list (val, delta); else if (prop == ly_symbol2scm ("pitch-alist") && scm_is_pair (val)) - entry = scm_cons (prop, - ly_transpose_key_alist (val, delta.smobbed_copy ())); - retval = scm_cons (entry, retval); - } + new_val = ly_transpose_key_alist (val, delta.smobbed_copy ()); - return scm_reverse_x (retval, SCM_EOL); + if (val != new_val) + scm_set_cdr_x (entry , new_val); + } } void @@ -231,7 +228,7 @@ Music::transpose (Pitch delta) if (to_boolean (get_property ("untransposable"))) return; - mutable_property_alist_ = transpose_mutable (mutable_property_alist_, delta); + transpose_mutable (mutable_property_alist_, delta); } void diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc index 1ae7794393..7cb38bd956 100644 --- a/lily/new-fingering-engraver.cc +++ b/lily/new-fingering-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "engraver.hh" @@ -250,6 +250,11 @@ New_fingering_engraver::position_scripts (SCM orientations, f->set_parent (ft.head_, X_AXIS); f->set_parent (ft.head_, Y_AXIS); + if (hordir == LEFT + && unsmob_grob (ft.head_->get_object ("accidental-grob"))) + Side_position_interface::add_support (f, + unsmob_grob (ft.head_->get_object ("accidental-grob"))); + Self_alignment_interface::set_align_self (f, Y_AXIS); Self_alignment_interface::set_center_parent (f, Y_AXIS); Side_position_interface::set_axis (f, X_AXIS); diff --git a/lily/note-collision.cc b/lily/note-collision.cc index f5c4483bbd..7d92a76ec0 100644 --- a/lily/note-collision.cc +++ b/lily/note-collision.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "note-collision.hh" diff --git a/lily/note-column.cc b/lily/note-column.cc index ca85f08e12..380182f856 100644 --- a/lily/note-column.cc +++ b/lily/note-column.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "note-column.hh" @@ -191,7 +191,6 @@ ADD_INTERFACE (Note_column, "Stem and noteheads combined", /* properties */ - "accidentals " "arpeggio " "force-hshift " "horizontal-shift " diff --git a/lily/note-head-line-engraver.cc b/lily/note-head-line-engraver.cc index 2d48f05c70..aaf1304d29 100644 --- a/lily/note-head-line-engraver.cc +++ b/lily/note-head-line-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ #include "engraver.hh" diff --git a/lily/note-head-scheme.cc b/lily/note-head-scheme.cc index 4b4c3e00a8..621e5311b9 100644 --- a/lily/note-head-scheme.cc +++ b/lily/note-head-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ diff --git a/lily/note-head.cc b/lily/note-head.cc index 12064f705b..bd00033bc7 100644 --- a/lily/note-head.cc +++ b/lily/note-head.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "note-head.hh" diff --git a/lily/note-heads-engraver.cc b/lily/note-heads-engraver.cc index 7d976761dd..a49bbbe81f 100644 --- a/lily/note-heads-engraver.cc +++ b/lily/note-heads-engraver.cc @@ -1,7 +1,7 @@ /* note-heads-engraver.cc -- part of GNU LilyPond - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" @@ -104,5 +104,7 @@ ADD_TRANSLATOR (Note_heads_engraver, /* doc */ "Generate noteheads.", /* create */ "NoteHead ", - /* read */ "middleCPosition", - /* write */ ""); + /* read */ + "middleCPosition", + /* write */ + ""); diff --git a/lily/note-name-engraver.cc b/lily/note-name-engraver.cc index f3c081f039..1aebfd3d84 100644 --- a/lily/note-name-engraver.cc +++ b/lily/note-name-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "engraver.hh" @@ -50,7 +50,7 @@ Note_name_engraver::process_music () if (s.length ()) { Item *t = make_item ("NoteName", events_[0]->self_scm ()); - t->set_property ("text", scm_makfrom0str (s.c_str ())); + t->set_property ("text", ly_string2scm (s)); texts_.push_back (t); } } diff --git a/lily/note-performer.cc b/lily/note-performer.cc index 6bfc82211b..ff296311ff 100644 --- a/lily/note-performer.cc +++ b/lily/note-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Jan Nieuwenhuizen + (c) 1996--2007 Jan Nieuwenhuizen */ #include "performer.hh" @@ -65,7 +65,14 @@ Note_performer::process_music () tie_event = ev; } - Audio_note *p = new Audio_note (*pitp, get_event_length (n), + Moment len = get_event_length (n); + if (now_mom().grace_part_) + { + len.grace_part_ = len.main_part_; + len.main_part_ = Rational (0); + } + + Audio_note *p = new Audio_note (*pitp, len, tie_event, transposing.negated ()); Audio_element_info info (p, n); announce_element (info); diff --git a/lily/note-spacing-engraver.cc b/lily/note-spacing-engraver.cc index 33c459cb13..569735f859 100644 --- a/lily/note-spacing-engraver.cc +++ b/lily/note-spacing-engraver.cc @@ -3,12 +3,14 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ #include "engraver.hh" +#include "grob-array.hh" +#include "context.hh" #include "item.hh" #include "pointer-group-interface.hh" @@ -17,20 +19,31 @@ class Note_spacing_engraver : public Engraver { Grob *last_spacing_; + Context *last_spacing_parent_context_; + Grob *spacing_; void add_spacing_item (Grob *); - TRANSLATOR_DECLARATIONS (Note_spacing_engraver); protected: DECLARE_ACKNOWLEDGER (rhythmic_grob); DECLARE_ACKNOWLEDGER (note_column); void stop_translation_timestep (); + virtual void finalize (); + virtual void derived_mark () const; }; +void +Note_spacing_engraver::derived_mark () const +{ + if (last_spacing_parent_context_) + scm_gc_mark (last_spacing_parent_context_->self_scm ()); +} + Note_spacing_engraver::Note_spacing_engraver () { + last_spacing_parent_context_ = 0; last_spacing_ = 0; spacing_ = 0; } @@ -43,7 +56,6 @@ Note_spacing_engraver::add_spacing_item (Grob *g) spacing_ = make_item ("NoteSpacing", g->self_scm ()); } - if (spacing_) { Pointer_group_interface::add_grob (spacing_, @@ -51,11 +63,9 @@ Note_spacing_engraver::add_spacing_item (Grob *g) g); if (last_spacing_) - { - Pointer_group_interface::add_grob (last_spacing_, - ly_symbol2scm ("right-items"), - g); - } + Pointer_group_interface::add_grob (last_spacing_, + ly_symbol2scm ("right-items"), + g); } } @@ -72,14 +82,44 @@ Note_spacing_engraver::acknowledge_rhythmic_grob (Grob_info gi) add_spacing_item (gi.grob ()); } +void +Note_spacing_engraver::finalize () +{ + if (last_spacing_ + && last_spacing_parent_context_ + && last_spacing_parent_context_ == context ()->get_parent_context () + && !unsmob_grob_array (last_spacing_->get_object ("right-items"))) + { + SCM ccol = get_property ("currentCommandColumn"); + Grob *column = unsmob_grob (ccol); + + Pointer_group_interface::add_grob (last_spacing_, + ly_symbol2scm ("right-items"), + column); + } +} + void Note_spacing_engraver::stop_translation_timestep () { + if (last_spacing_ + && last_spacing_parent_context_ + && last_spacing_parent_context_ == context ()->get_parent_context ()) + { + Grob *sep = unsmob_grob (get_property ("breakableSeparationItem")); + if (sep) + Pointer_group_interface::add_grob (last_spacing_, + ly_symbol2scm ("right-items"), + sep); + } + if (spacing_) { last_spacing_ = spacing_; + last_spacing_parent_context_ = context ()->get_parent_context (); spacing_ = 0; } + } ADD_ACKNOWLEDGER (Note_spacing_engraver, note_column); diff --git a/lily/note-spacing.cc b/lily/note-spacing.cc index f601a1054b..c4a79e403f 100644 --- a/lily/note-spacing.cc +++ b/lily/note-spacing.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #include "note-spacing.hh" @@ -64,7 +64,8 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, continue; } - if (d == LEFT) + if (d == LEFT + && Note_column::has_interface (it)) { SCM r = it->get_object ("rest"); Grob *g = unsmob_grob (r); @@ -355,6 +356,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, { stem_dirs[RIGHT] = -stem_dirs[LEFT]; stem_posns[RIGHT] = bar_yextent; + stem_posns[RIGHT] *= 2; } if (correct_stem_dirs && stem_dirs[LEFT] * stem_dirs[RIGHT] == -1) diff --git a/lily/object-key-dumper-scheme.cc b/lily/object-key-dumper-scheme.cc deleted file mode 100644 index bdcfff4d33..0000000000 --- a/lily/object-key-dumper-scheme.cc +++ /dev/null @@ -1,42 +0,0 @@ -/* - object-key-dumper-scheme.cc -- implement Object_key_dumper bindings - - source file of the GNU LilyPond music typesetter - - (c) 2005--2006 Han-Wen Nienhuys -*/ - -#include "object-key-dumper.hh" - -#include "moment.hh" - -LY_DEFINE (ly_make_dumper, "ly:make-dumper", - 0, 0, 0, - (), - "Create a key dumper. ") -{ - Object_key_dumper *u = new Object_key_dumper (); - return u->unprotect (); -} - -LY_DEFINE (ly_dumper_definitions, "ly:dumper-definitions", - 1, 0, 0, - (SCM dumper), - "Return list of key definitions. ") -{ - Object_key_dumper *u = unsmob_key_dumper (dumper); - SCM_ASSERT_TYPE (u, dumper, SCM_ARG1, __FUNCTION__, "dumper"); - return u->get_file_contents (); -} - -LY_DEFINE (ly_dumper_key_serial, "ly:dumper-key-serial", - 2, 0, 0, - (SCM dumper, SCM key), - "Return the key serial number @var{key}. ") -{ - Object_key_dumper *u = unsmob_key_dumper (dumper); - Object_key *k = unsmob_key (key); - SCM_ASSERT_TYPE (u, dumper, SCM_ARG1, __FUNCTION__, "dumper"); - SCM_ASSERT_TYPE (k, key, SCM_ARG2, __FUNCTION__, "key"); - return u->dump_key (k); -} diff --git a/lily/object-key-dumper.cc b/lily/object-key-dumper.cc deleted file mode 100644 index 204097f4b4..0000000000 --- a/lily/object-key-dumper.cc +++ /dev/null @@ -1,97 +0,0 @@ -/* - object-key-dumper.cc -- implement Object_key_dumper - - source file of the GNU LilyPond music typesetter - - (c) 2004--2006 Han-Wen Nienhuys -*/ - -#include "object-key-dumper.hh" - -#include "moment.hh" - -#include "ly-smobs.icc" - -SCM -Object_key_dumper::mark_smob (SCM smob) -{ - Object_key_dumper *dumper = (Object_key_dumper *) SCM_CELL_WORD_1 (smob); - - for (Key_to_key_map::const_iterator i (dumper->serialized_keys_.begin ()); - i != dumper->serialized_keys_.end (); - i++) - scm_gc_mark ((*i).first->self_scm ()); - return SCM_EOL; -} - -int -Object_key_dumper::print_smob (SCM, SCM port, scm_print_state*) -{ - scm_puts ("#", port); - return 1; -} - -IMPLEMENT_DEFAULT_EQUAL_P (Object_key_dumper); -IMPLEMENT_SMOBS (Object_key_dumper); - -Object_key_dumper::Object_key_dumper () -{ - file_contents_ = SCM_EOL; - next_available_ = 0; - smobify_self (); -} - -SCM -Object_key_dumper::key_serial (int k) -{ - return scm_list_2 (ly_symbol2scm ("key"), - scm_from_int (k)); -} - -SCM -Object_key_dumper::serialize_key (Object_key const *key) -{ - SCM skey = key->dump (); - for (SCM s = skey; scm_is_pair (s); s = scm_cdr (s)) - { - if (Object_key const *sub_key = unsmob_key (scm_car (s))) - scm_set_car_x (s, dump_key (sub_key)); - else if (Moment *mom = unsmob_moment (scm_car (s))) - scm_set_car_x (s, - scm_list_2 (ly_symbol2scm ("unquote"), - mom->as_scheme ())); - } - - file_contents_ = scm_cons (scm_list_3 (ly_symbol2scm ("define-key"), - scm_from_int (next_available_), - skey), - file_contents_); - - serialized_keys_[key] = key; - key_serial_numbers_[key] = next_available_; - SCM retval = key_serial (next_available_); - next_available_++; - - return retval; -} - -SCM -Object_key_dumper::dump_key (Object_key const *key) -{ - if (key_serial_numbers_.find (key) != key_serial_numbers_.end ()) - return key_serial (key_serial_numbers_[key]); - else if (Object_key const *serialized = serialized_keys_[key]) - return key_serial (key_serial_numbers_[ serialized_keys_ [serialized] ]); - - return serialize_key (key); -} - -SCM -Object_key_dumper::get_file_contents () const -{ - return scm_reverse (file_contents_); -} - -Object_key_dumper::~Object_key_dumper () -{ -} diff --git a/lily/object-key-undumper-scheme.cc b/lily/object-key-undumper-scheme.cc deleted file mode 100644 index 6791a9cb5b..0000000000 --- a/lily/object-key-undumper-scheme.cc +++ /dev/null @@ -1,44 +0,0 @@ -/* - object-key-undumper-scheme.cc -- implement Object_key_undumper bindings - - source file of the GNU LilyPond music typesetter - - (c) 2005--2006 Han-Wen Nienhuys -*/ - -#include "object-key-undumper.hh" - -LY_DEFINE (ly_undumper_read_keys, "ly:undumper-read-keys", - 2, 0, 0, - (SCM undumper, SCM keys), - "Read serialized @var{keys} into @var{undumper}.") -{ - Object_key_undumper *u = unsmob_key_undumper (undumper); - SCM_ASSERT_TYPE (u, undumper, SCM_ARG1, __FUNCTION__, "Undumper"); - - u->parse_contents (keys); - return SCM_UNSPECIFIED; -} - -LY_DEFINE (ly_make_undumper, "ly:make-undumper", - 0, 0, 0, - (), - "Create a key undumper. ") -{ - Object_key_undumper *u = new Object_key_undumper (); - return u->unprotect (); -} - -LY_DEFINE (ly_undumper_lookup, "ly:undumper-lookup", - 2, 0, 0, - (SCM undumper, SCM serial), - "Return the object key for number @var{serial}. ") - -{ - Object_key_undumper *u = unsmob_key_undumper (undumper); - - SCM_ASSERT_TYPE (u, undumper, SCM_ARG1, __FUNCTION__, "undumper"); - SCM_ASSERT_TYPE (scm_is_integer (serial), serial, SCM_ARG2, __FUNCTION__, "integer"); - return u->get_key (scm_to_int (serial))->self_scm (); -} - diff --git a/lily/object-key-undumper.cc b/lily/object-key-undumper.cc deleted file mode 100644 index 3aec3c5808..0000000000 --- a/lily/object-key-undumper.cc +++ /dev/null @@ -1,86 +0,0 @@ -/* - object-key-undumper.cc -- implement Object_key_undumper - - source file of the GNU LilyPond music typesetter - - (c) 2004--2006 Han-Wen Nienhuys -*/ - -#include "object-key-undumper.hh" - -#include "ly-smobs.icc" - -IMPLEMENT_SMOBS (Object_key_undumper); -IMPLEMENT_DEFAULT_EQUAL_P (Object_key_undumper); - -SCM -Object_key_undumper::mark_smob (SCM smob) -{ - Object_key_undumper *undumper = (Object_key_undumper *) SCM_CELL_WORD_1 (smob); - for (Int_to_key_map::const_iterator i (undumper->keys_.begin ()); - i != undumper->keys_.end (); i++) - scm_gc_mark ((*i).second->self_scm ()); - - return SCM_BOOL_F; -} - -int -Object_key_undumper::print_smob (SCM s, SCM port, scm_print_state*) -{ - (void) s; - scm_puts ("#", port); - return 1; -} - -Object_key_undumper::Object_key_undumper () -{ - smobify_self (); -} - -void -Object_key_undumper::parse_contents (SCM contents) -{ - for (SCM s = contents; scm_is_pair (s); s = scm_cdr (s)) - { - SCM entry = scm_car (s); - if (scm_car (entry) != ly_symbol2scm ("define-key")) - continue; - - int number = scm_to_int (scm_cadr (entry)); - SCM skey = scm_caddr (entry); - - SCM new_key = SCM_EOL; - SCM *tail = &new_key; - for (SCM t = skey; scm_is_pair (t); t = scm_cdr (t)) - { - SCM item = scm_car (t); - if (scm_is_pair (item) - && scm_car (item) == ly_symbol2scm ("key")) - { - int index = scm_to_int (scm_cadr (item)); - Object_key const *key = get_key (index); - *tail = scm_cons (key->self_scm (), SCM_EOL); - } - else - *tail = scm_cons (item, SCM_EOL); - tail = SCM_CDRLOC (*tail); - } - - Object_key *k = Object_key::undump (new_key); - keys_[number] = k; - k->unprotect (); - } -} - -Object_key const * -Object_key_undumper::get_key (int idx) -{ - Int_to_key_map::const_iterator i (keys_.find (idx)); - assert (i != keys_.end ()); - - return (*i).second; -} - -Object_key_undumper::~Object_key_undumper () -{ -} diff --git a/lily/object-key.cc b/lily/object-key.cc index 50e42027ef..e69de29bb2 100644 --- a/lily/object-key.cc +++ b/lily/object-key.cc @@ -1,169 +0,0 @@ -/* - object-key.cc -- implement Object_key - - source file of the GNU LilyPond music typesetter - - (c) 2004--2006 Han-Wen Nienhuys -*/ - -#include "lilypond-key.hh" -#include "ly-smobs.icc" - -SCM -Object_key::mark_smob (SCM key) -{ - Object_key *k = (Object_key *) SCM_CELL_WORD_1 (key); - k->derived_mark (); - return SCM_EOL; -} - -void -Object_key::derived_mark () const -{ -} - -Object_key::~Object_key () -{ -} - -int -Object_key::get_type () const -{ - return GENERAL_KEY; -} - -int -Object_key::print_smob (SCM smob, SCM port, scm_print_state*) -{ - Object_key *k = (Object_key *) SCM_CELL_WORD_1 (smob); - scm_puts ("#get_type ()), port); - scm_puts (">", port); - return 1; -} - -Object_key::Object_key () -{ - smobify_self (); -} - -int -Object_key::compare (Object_key const *other) const -{ - if (this == other) - return 0; - - int c = sign (get_type () - other->get_type ()); - if (c) - return c; - else - return do_compare (other); -} - -IMPLEMENT_SMOBS (Object_key); - -SCM -Object_key::equal_p (SCM a, SCM b) -{ - Object_key *ka = unsmob_key (a); - Object_key *kb = unsmob_key (b); - - return (ka->compare (kb)) ? SCM_BOOL_F : SCM_BOOL_T; -} - -int -Object_key::do_compare (Object_key const *) const -{ - return 0; -} - -SCM -Object_key::dump () const -{ - return scm_cons (scm_from_int (get_type ()), - as_scheme ()); -} - -SCM -Object_key::as_scheme () const -{ - return SCM_EOL; -} - -Object_key * -Object_key::from_scheme (SCM) -{ - return new Object_key (); -} - -struct Object_dumper_table_entry -{ - Object_key_type type_; - Object_key *(*ctor_) (SCM); -}; - -static Object_dumper_table_entry undumpers[] -= { - {BASE_KEY, Object_key::from_scheme}, - {COPIED_KEY, Copied_key::from_scheme}, - {GENERAL_KEY, Lilypond_general_key::from_scheme}, - {GROB_KEY, Lilypond_grob_key::from_scheme}, - {CONTEXT_KEY, Lilypond_context_key::from_scheme}, - {KEY_COUNT, 0}, -}; - -Object_key * -Object_key::undump (SCM scm_key) -{ - int t = scm_to_int (scm_car (scm_key)); - assert (t == undumpers[t].type_); - return (undumpers[t].ctor_) (scm_cdr (scm_key)); -} - -/****************************************************************/ - -Copied_key::Copied_key (Object_key const *key, int count) -{ - copy_count_ = count; - original_ = key; -} - -int -Copied_key::get_type () const -{ - return COPIED_KEY; -} - -int -Copied_key::do_compare (Object_key const *key) const -{ - Copied_key const *other = dynamic_cast (key); - - int c = original_->compare (other->original_); - if (c) - return c; - - return sign (copy_count_ - other->copy_count_); -} - -void -Copied_key::derived_mark () const -{ - scm_gc_mark (original_->self_scm ()); -} - -SCM -Copied_key::as_scheme () const -{ - return scm_list_2 (original_ - ? original_->self_scm () - : SCM_BOOL_F, scm_from_int (copy_count_)); -} - -Object_key * -Copied_key::from_scheme (SCM a) -{ - return new Copied_key (unsmob_key (scm_car (a)), - scm_to_int (scm_list_ref (a, scm_from_int (1)))); -} - diff --git a/lily/open-type-font-scheme.cc b/lily/open-type-font-scheme.cc index db4c89c177..c6561b48cb 100644 --- a/lily/open-type-font-scheme.cc +++ b/lily/open-type-font-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "modified-font-metric.hh" diff --git a/lily/open-type-font.cc b/lily/open-type-font.cc index 2f2e5fdaad..2e72d57af3 100644 --- a/lily/open-type-font.cc +++ b/lily/open-type-font.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "open-type-font.hh" @@ -39,7 +39,9 @@ load_table (char const *tag_str, FT_Face face, FT_ULong *length) return buffer; } else - programming_error ("Cannot find OpenType table."); + programming_error (_f ("Free type error: %s", + freetype_error_string (error_code).c_str () + )); return 0; } @@ -97,8 +99,10 @@ open_ft_face (string str) if (error_code == FT_Err_Unknown_File_Format) error (_f ("unsupported font format: %s", str.c_str ())); else if (error_code) - error (_f ("unknown error: %d reading font file: %s", error_code, - str.c_str ())); + error (_f ("error reading font file %s: %s", + str.c_str (), + freetype_error_string (error_code).c_str () + )); return face; } @@ -170,7 +174,8 @@ Open_type_font::get_indexed_char (size_t signed_idx) const char name[len]; size_t code = FT_Get_Glyph_Name (face_, signed_idx, name, len); if (code) - warning (_f ("FT_Get_Glyph_Name() returned error: %u", unsigned (code))); + warning (_f ("FT_Get_Glyph_Name() Freetype error: %s", + freetype_error_string (code))); SCM sym = ly_symbol2scm (name); SCM alist = scm_hashq_ref (lily_character_table_, sym, SCM_BOOL_F); @@ -294,9 +299,10 @@ Open_type_font::glyph_list () const char name[len]; size_t code = FT_Get_Glyph_Name (face_, i, name, len); if (code) - warning (_f ("FT_Get_Glyph_Name() returned error: %u", unsigned (code))); + warning (_f ("FT_Get_Glyph_Name() error: %s", + freetype_error_string (code).c_str ())); - *tail = scm_cons (scm_makfrom0str (name), SCM_EOL); + *tail = scm_cons (scm_from_locale_string (name), SCM_EOL); tail = SCM_CDRLOC (*tail); } diff --git a/lily/optimal-page-breaking.cc b/lily/optimal-page-breaking.cc index 46105f7255..d18ad2837e 100644 --- a/lily/optimal-page-breaking.cc +++ b/lily/optimal-page-breaking.cc @@ -5,7 +5,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #include "optimal-page-breaking.hh" diff --git a/lily/ottava-bracket.cc b/lily/ottava-bracket.cc index f1894a25a8..cf13802844 100644 --- a/lily/ottava-bracket.cc +++ b/lily/ottava-bracket.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "text-interface.hh" diff --git a/lily/ottava-engraver.cc b/lily/ottava-engraver.cc index 6afa928387..c1afcfed3c 100644 --- a/lily/ottava-engraver.cc +++ b/lily/ottava-engraver.cc @@ -1,9 +1,9 @@ /* - text-spanner-engraver.cc -- implement Ottava_spanner_engraver + ottova-engraver.cc -- implement Ottava_spanner_engraver source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "protected-scm.hh" @@ -61,7 +61,7 @@ Ottava_spanner_engraver::process_music () span_->set_property ("text", ott); SCM c0 (get_property ("middleCPosition")); - SCM oc0 (get_property ("originalCentralCPosition")); + SCM oc0 (get_property ("originalMiddleCPosition")); if (scm_less_p (oc0, c0) == SCM_BOOL_T) span_->set_property ("direction", scm_from_int (DOWN)); } @@ -132,5 +132,10 @@ ADD_ACKNOWLEDGER (Ottava_spanner_engraver, note_column); ADD_TRANSLATOR (Ottava_spanner_engraver, /* doc */ "Create a text spanner when the ottavation property changes..", /* create */ "OttavaBracket", - /* read */ "ottavation", + /* read */ "ottavation " + "originalMiddleCPosition " + "currentMusicalColumn " + + , + /* write */ ""); diff --git a/lily/output-def-scheme.cc b/lily/output-def-scheme.cc index 4bf03f2e13..e7533eed16 100644 --- a/lily/output-def-scheme.cc +++ b/lily/output-def-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "output-def.hh" @@ -98,21 +98,6 @@ LY_DEFINE (ly_paper_outputscale, "ly:paper-outputscale", return scm_from_double (output_scale (b)); } -/* - Cannot put in scope, but need a separate function, since we don't - want to allow this in --safe. - */ -LY_DEFINE (ly_output_def_parser, "ly:output-def-parser", - 1, 0, 0, (SCM odef), - "Return the parser where @var{odef} is coming from.") -{ - Output_def *b = unsmob_output_def (odef); - SCM_ASSERT_TYPE (b, odef, SCM_ARG1, __FUNCTION__, "paper"); - - return b->get_parser()->self_scm (); -} - - LY_DEFINE (ly_make_output_def, "ly:make-output-def", 0, 0, 0, (), "Make a output def.") diff --git a/lily/output-def.cc b/lily/output-def.cc index 739b4b9e7b..81e7f7a671 100644 --- a/lily/output-def.cc +++ b/lily/output-def.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "output-def.hh" @@ -26,7 +26,6 @@ Output_def::Output_def () { scope_ = SCM_EOL; - parser_ = 0; parent_ = 0; smobify_self (); @@ -38,7 +37,6 @@ Output_def::Output_def (Output_def const &s) { scope_ = SCM_EOL; parent_ = 0; - parser_ = s.parser_; smobify_self (); input_origin_ = s.input_origin_; @@ -54,12 +52,6 @@ Output_def::~Output_def () IMPLEMENT_SMOBS (Output_def); IMPLEMENT_DEFAULT_EQUAL_P (Output_def); -Lily_parser * -Output_def::get_parser () const -{ - return parent_ ? parent_->get_parser () : parser_; -} - SCM Output_def::mark_smob (SCM m) { diff --git a/lily/output-property-engraver.cc b/lily/output-property-engraver.cc index 6b450ef864..8b42a6cbd3 100644 --- a/lily/output-property-engraver.cc +++ b/lily/output-property-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ diff --git a/lily/page-breaking-scheme.cc b/lily/page-breaking-scheme.cc index 2c28da917e..87d21383b3 100644 --- a/lily/page-breaking-scheme.cc +++ b/lily/page-breaking-scheme.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #include "paper-book.hh" diff --git a/lily/page-breaking.cc b/lily/page-breaking.cc index 5c81dc392c..76a874d4e3 100644 --- a/lily/page-breaking.cc +++ b/lily/page-breaking.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #include "page-breaking.hh" @@ -83,7 +83,7 @@ Page_breaking::break_into_pieces (vsize start_break, vsize end_break, Line_divis assert (0); } - for (vsize i = 0; i < chunks.size () - 1; i++) + for (vsize i = 0; i + 1 < chunks.size (); i++) { vsize sys = next_system (chunks[i]); if (all_[sys].pscore_) @@ -128,7 +128,7 @@ Page_breaking::line_details (vsize start_break, vsize end_break, Line_division c vector ret; assert (chunks.size () == div.size () + 1); - for (vsize i = 0; i < chunks.size () - 1; i++) + for (vsize i = 0; i + 1 < chunks.size (); i++) { vsize sys = next_system (chunks[i]); if (all_[sys].pscore_) @@ -263,7 +263,7 @@ Page_breaking::find_chunks_and_breaks (Break_predicate is_break) { if (all_[i].pscore_) { - vector cols = all_[i].pscore_->root_system ()->columns (); + vector cols = all_[i].pscore_->root_system ()->used_columns (); vector line_breaker_columns; line_breaker_columns.push_back (0); @@ -349,7 +349,7 @@ Page_breaking::system_count_bounds (vector const &chunks, bool m Line_division ret; ret.resize (chunks.size () - 1, 1); - for (vsize i = 0; i < chunks.size () - 1; i++) + for (vsize i = 0; i + 1 < chunks.size (); i++) { vsize sys = next_system (chunks[i]); if (all_[sys].pscore_) diff --git a/lily/page-spacing.cc b/lily/page-spacing.cc index 945a52b60a..2ebd53814e 100644 --- a/lily/page-spacing.cc +++ b/lily/page-spacing.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #include "page-spacing.hh" @@ -164,7 +164,7 @@ space_systems_on_2_pages (vector const &lines, bool ragged_last) { /* if there is a forced break, this reduces to 2 1-page problems */ - for (vsize i = 0; i < lines.size () - 1; i++) + for (vsize i = 0; i + 1 < lines.size (); i++) if (lines[i].page_permission_ == ly_symbol2scm ("force")) { vector lines1 (lines.begin (), lines.begin () + i + 1); @@ -195,7 +195,7 @@ space_systems_on_2_pages (vector const &lines, if (ragged || ragged_last) page2_force[page2_force.size () - 1 - i] = - (page2.force_ < 0 && i < page1_force.size () - 1) ? infinity_f : 0; + (page2.force_ < 0 && i + 1 < page1_force.size ()) ? infinity_f : 0; else page2_force[page2_force.size () - 1 - i] = page2.force_; } @@ -358,7 +358,7 @@ min_page_count (vector const &uncompressed_lines, + ((cur_rod_height > 0) ? lines[i].padding_: 0); if ((next_height > page_height && cur_rod_height > 0) - || (i < lines.size () - 1 && lines[i].page_permission_ == ly_symbol2scm ("force"))) + || (i + 1 < lines.size () && lines[i].page_permission_ == ly_symbol2scm ("force"))) { ret++; cur_rod_height = ext_len + (rag ? lines[i].space_ : 0); diff --git a/lily/page-turn-engraver.cc b/lily/page-turn-engraver.cc index 4064efa37e..522ae7559e 100644 --- a/lily/page-turn-engraver.cc +++ b/lily/page-turn-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #include "engraver.hh" @@ -287,7 +287,7 @@ Page_turn_engraver::finalize () /* it's possible that the last of my newly-split events overlaps the next repeat_penalty, in which case we need to refilter that event */ - if (rep_index < repeat_penalties_.size () - 1 + if (rep_index + 1 < repeat_penalties_.size () && split.size () && split.back ().duration_[RIGHT] > repeat_penalties_[rep_index+1].duration_[LEFT]) { @@ -327,6 +327,7 @@ Page_turn_engraver::finalize () } ADD_ACKNOWLEDGER (Page_turn_engraver, note_head); + ADD_TRANSLATOR (Page_turn_engraver, /* doc */ "Decide where page turns are allowed to go", /* create */ "", diff --git a/lily/page-turn-page-breaking.cc b/lily/page-turn-page-breaking.cc index 911e83467b..58c66ed09d 100644 --- a/lily/page-turn-page-breaking.cc +++ b/lily/page-turn-page-breaking.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #include "page-turn-page-breaking.hh" @@ -53,7 +53,7 @@ Page_turn_page_breaking::put_systems_on_pages (vsize start, /* If [START, END] does not contain an intermediate breakpoint, we may need to consider solutions that result in a bad turn. In this case, we won't abort if the min_page_count is too big */ - if (start < end - 1 && min_p_count > 2) + if (start < end - 1 && min_p_count + (page_number % 2) > 2) return Break_node (); /* if PAGE-NUMBER is odd, we are starting on a right hand page. That is, we @@ -115,7 +115,7 @@ vsize Page_turn_page_breaking::final_page_num (Break_node const &b) { vsize end = b.first_page_number_ + b.page_count_; - return end + 1 - (end % 2); + return end - 1 + (end % 2); } void @@ -171,7 +171,7 @@ Page_turn_page_breaking::calc_subproblem (vsize ending_breakpoint) cur = put_systems_on_pages (start, end, line, div[d], p_num); if (isinf (cur.demerits_) - || (cur.page_count_ > 2 + || (cur.page_count_ + (p_num % 2) > 2 && (!isinf (this_start_best.demerits_)) && final_page_num (cur) > final_page_num (this_start_best))) { @@ -217,7 +217,7 @@ Page_turn_page_breaking::solve () state_.clear (); message (_f ("Calculating page and line breaks (%d possible page breaks)...", (int)breaks_.size () - 1) + " "); - for (vsize i = 0; i < breaks_.size () - 1; i++) + for (vsize i = 0; i + 1 < breaks_.size (); i++) { calc_subproblem (i); progress_indication (string ("[") + to_string (i + 1) + "]"); @@ -263,7 +263,7 @@ Page_turn_page_breaking::make_pages (vector const &soln, SCM systems for (vsize j = 0; j < soln[i].page_count_; j++) lines_per_page.push_back (soln[i].system_count_[j]); - if (i < soln.size () - 1 && (soln[i].first_page_number_ + soln[i].page_count_) % 2) + if (i + 1 < soln.size () && (soln[i].first_page_number_ + soln[i].page_count_) % 2) /* add a blank page */ lines_per_page.push_back (0); } diff --git a/lily/pango-font-scheme.cc b/lily/pango-font-scheme.cc index 951093db4f..fe6d4bacd4 100644 --- a/lily/pango-font-scheme.cc +++ b/lily/pango-font-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #define PANGO_ENABLE_BACKEND // ugh, why necessary? diff --git a/lily/pango-font.cc b/lily/pango-font.cc index 3d58e0dd0e..10cca5bfaf 100644 --- a/lily/pango-font.cc +++ b/lily/pango-font.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #define PANGO_ENABLE_BACKEND // ugh, why necessary? @@ -28,15 +28,15 @@ #include "stencil.hh" Pango_font::Pango_font (PangoFT2FontMap *fontmap, - PangoFontDescription *description, + PangoFontDescription const *description, Real output_scale) { (void) fontmap; + physical_font_tab_ = scm_c_make_hash_table (11); PangoDirection pango_dir = PANGO_DIRECTION_LTR; context_ = pango_ft2_get_context (PANGO_RESOLUTION, PANGO_RESOLUTION); - // context_ = pango_ft2_font_map_create_context (fontmap); pango_description_ = pango_font_description_copy (description); attribute_list_ = pango_attr_list_new (); @@ -69,8 +69,8 @@ void Pango_font::register_font_file (string filename, string ps_name) { scm_hash_set_x (physical_font_tab_, - scm_makfrom0str (ps_name.c_str ()), - scm_makfrom0str (filename.c_str ())); + ly_string2scm (ps_name), + ly_string2scm (filename)); } void @@ -104,7 +104,7 @@ Pango_font::pango_item_string_stencil (PangoItem const *item, string str, char glyph_name[GLYPH_NAME_LEN]; PangoAnalysis const *pa = &(item->analysis); PangoGlyphString *pgs = pango_glyph_string_new (); - + pango_shape (str.c_str () + item->offset, item->length, (PangoAnalysis*) pa, pgs); @@ -163,7 +163,9 @@ Pango_font::pango_item_string_stencil (PangoItem const *item, string str, { int errorcode = FT_Get_Glyph_Name (ftface, pg, glyph_name, GLYPH_NAME_LEN); if (errorcode) - programming_error ("FT_Get_Glyph_Name returns error"); + programming_error (_f ("FT_Get_Glyph_Name() error: %s", + freetype_error_string (errorcode).c_str() + )); } SCM char_id = SCM_EOL; @@ -204,7 +206,7 @@ Pango_font::pango_item_string_stencil (PangoItem const *item, string str, char_id = scm_from_uint32 (pg); } else - char_id = scm_makfrom0str (glyph_name); + char_id = scm_from_locale_string (glyph_name); *tail = scm_cons (scm_list_4 (scm_from_double (ggeo.width * scale_), scm_from_double (ggeo.x_offset * scale_), @@ -215,6 +217,8 @@ Pango_font::pango_item_string_stencil (PangoItem const *item, string str, tail = SCM_CDRLOC (*tail); } + pango_glyph_string_free (pgs); + pgs = 0; PangoFontDescription *descr = pango_font_describe (pa->font); Real size = pango_font_description_get_size (descr) / (Real (PANGO_SCALE)); @@ -261,7 +265,7 @@ Pango_font::pango_item_string_stencil (PangoItem const *item, string str, pango_fc_font_unlock_face (fcfont); SCM expr = scm_list_5 (ly_symbol2scm ("glyph-string"), - scm_makfrom0str (ps_name.c_str ()), + ly_string2scm (ps_name), scm_from_double (size), scm_from_bool (cid_keyed), ly_quote_scm (glyph_exprs)); @@ -355,14 +359,15 @@ Pango_font::text_stencil (string str, bool tight) const */ SCM exp = scm_list_3 (ly_symbol2scm ("utf-8-string"), - scm_makfrom0str (description_string ().c_str ()), - scm_makfrom0str (str.c_str ())); + ly_string2scm (description_string ()), + ly_string2scm (str)); Box b (Interval (0, 0), Interval (0, 0)); b.unite (dest.extent_box ()); return Stencil (b, exp); } + g_list_free (items); return dest; } diff --git a/lily/pango-select-scheme.cc b/lily/pango-select-scheme.cc index 89330c842a..b1edd941c5 100644 --- a/lily/pango-select-scheme.cc +++ b/lily/pango-select-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "config.hh" @@ -19,7 +19,7 @@ LY_DEFINE (ly_make_pango_description_string, "ly:make-pango-description-string", PangoFontDescription *pfd = properties_to_pango_description (chain, scm_to_double (size)); char *str = pango_font_description_to_string (pfd); - SCM scm_str = scm_makfrom0str (str); + SCM scm_str = scm_from_locale_string (str); g_free (str); pango_font_description_free (pfd); return scm_str; diff --git a/lily/pango-select.cc b/lily/pango-select.cc index bd684b92f8..bc97f78751 100644 --- a/lily/pango-select.cc +++ b/lily/pango-select.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "dimensions.hh" @@ -56,9 +56,10 @@ select_pango_font (Output_def *layout, SCM chain) * layout->get_dimension (ly_symbol2scm ("text-font-size"))); char *str = pango_font_description_to_string (pfd); - SCM scm_str = scm_makfrom0str (str); + SCM scm_str = scm_from_locale_string (str); g_free (str); - + pango_font_description_free (pfd); + return find_pango_font (layout, scm_str, 1.0); } diff --git a/lily/paper-book-scheme.cc b/lily/paper-book-scheme.cc index bc1c7007b4..01e777220b 100644 --- a/lily/paper-book-scheme.cc +++ b/lily/paper-book-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "paper-book.hh" diff --git a/lily/paper-book.cc b/lily/paper-book.cc index c66d1d6ae9..89e8b8ded3 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Jan Nieuwenhuizen + (c) 2004--2007 Jan Nieuwenhuizen */ #include "paper-book.hh" @@ -136,6 +136,13 @@ Paper_book::output (SCM output_channel) void Paper_book::classic_output (SCM output) { + if (scm_is_pair (performances_)) + { + SCM proc = ly_lily_module_constant ("write-performances-midis"); + + scm_call_2 (proc, performances (), output); + } + /* Generate all stencils to trigger font loads. */ systems (); diff --git a/lily/paper-column-engraver.cc b/lily/paper-column-engraver.cc index bef70f72a7..2dd184854f 100644 --- a/lily/paper-column-engraver.cc +++ b/lily/paper-column-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "paper-column-engraver.hh" diff --git a/lily/paper-column.cc b/lily/paper-column.cc index 2636b20fe4..4dba6bbbd5 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "paper-column.hh" @@ -19,17 +19,20 @@ #include "output-def.hh" #include "pointer-group-interface.hh" #include "grob-array.hh" +#include "system.hh" +#include "spring.hh" +#include "lookup.hh" +#include "string-convert.hh" Grob * -Paper_column::clone (int count) const +Paper_column::clone () const { - return new Paper_column (*this, count); + return new Paper_column (*this); } void Paper_column::do_break_processing () { - Spaceable_grob::remove_interface (this); Item::do_break_processing (); } @@ -57,15 +60,15 @@ Paper_column::get_column () const return (Paper_column *) (this); } -Paper_column::Paper_column (SCM l, Object_key const *key) - : Item (l, key) // guh.? +Paper_column::Paper_column (SCM l) + : Item (l) { system_ = 0; rank_ = -1; } -Paper_column::Paper_column (Paper_column const &src, int count) - : Item (src, count) +Paper_column::Paper_column (Paper_column const &src) + : Item (src) { system_ = 0; rank_ = src.rank_; @@ -136,34 +139,100 @@ Paper_column::is_breakable (Grob *me) /* Print a vertical line and the rank number, to aid debugging. */ - MAKE_SCHEME_CALLBACK (Paper_column, print, 1); SCM Paper_column::print (SCM p) { - Grob *me = unsmob_grob (p); + Paper_column *me = dynamic_cast (unsmob_grob (p)); string r = to_string (Paper_column::get_rank (me)); Moment *mom = unsmob_moment (me->get_property ("when")); string when = mom ? mom->to_string () : "?/?"; + Font_metric *musfont = Font_interface::get_default_font (me); SCM properties = Font_interface::text_font_alist_chain (me); SCM scm_mol = Text_interface::interpret_markup (me->layout ()->self_scm (), properties, - scm_makfrom0str (r.c_str ())); + ly_string2scm (r)); SCM when_mol = Text_interface::interpret_markup (me->layout ()->self_scm (), properties, - scm_makfrom0str (when.c_str ())); + ly_string2scm (when)); Stencil t = *unsmob_stencil (scm_mol); - t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1, 0.1); + t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1); t.align_to (X_AXIS, CENTER); t.align_to (Y_AXIS, DOWN); Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01), Interval (-2, -1))); - + + SCM small_letters = scm_cons (scm_acons (ly_symbol2scm ("font-size"), + scm_from_int (-6), SCM_EOL), + properties); + + int j = 0; + for (SCM s = me->get_object ("ideal-distances"); + scm_is_pair (s); s = scm_cdr (s)) + { + Spring_smob *sp = unsmob_spring (scm_car (s)); + if (!sp->other_->get_system ()) + continue; + + j++; + Real y = -j * 1 -3; + vector pts; + pts.push_back (Offset (0, y)); + + Offset p2 (sp->distance_, y); + pts.push_back (p2); + + Stencil id_stencil = Lookup::points_to_line_stencil (0.1, pts); + Stencil head (musfont->find_by_name ("arrowheads.open.01")); + + SCM distance_stc = Text_interface::interpret_markup (me->layout ()->self_scm (), + small_letters, + ly_string2scm (String_convert::form_string ("%5.2lf", sp->distance_))); + + id_stencil.add_stencil (unsmob_stencil (distance_stc)->translated (Offset (sp->distance_/3, y+1))); + id_stencil.add_stencil (head.translated (p2)); + id_stencil = id_stencil.in_color (0,0,1); + l.add_stencil (id_stencil); + } + + for (SCM s = me->get_object ("minimum-distances"); + scm_is_pair (s); s = scm_cdr (s)) + { + Real dist = scm_to_double (scm_cdar (s)); + Grob *other = unsmob_grob (scm_caar (s)); + if (!other || other->get_system () != me->get_system ()) + continue; + + j++; + + Real y = -j * 1.0 -3.5; + vector pts; + pts.push_back (Offset (0, y)); + + Offset p2 (dist, y); + pts.push_back (p2); + + Stencil id_stencil = Lookup::points_to_line_stencil (0.1, pts); + Stencil head (musfont->find_by_name ("arrowheads.open.0M1")); + head.translate_axis (y, Y_AXIS); + id_stencil.add_stencil (head); + + SCM distance_stc = Text_interface::interpret_markup (me->layout ()->self_scm (), + small_letters, + ly_string2scm (String_convert::form_string ("%5.2lf", + dist))); + + id_stencil.add_stencil (unsmob_stencil (distance_stc)->translated (Offset (dist/3, y-1))); + + + id_stencil = id_stencil.in_color (1,0,0); + l.add_stencil (id_stencil); + } t.add_stencil (l); return t.smobbed_copy (); } diff --git a/lily/paper-def.cc b/lily/paper-def.cc index 8a17064261..e9a56ae0e1 100644 --- a/lily/paper-def.cc +++ b/lily/paper-def.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "dimensions.hh" @@ -80,10 +80,17 @@ find_pango_font (Output_def *layout, SCM descr, Real factor) PangoFontDescription *description = pango_font_description_from_string (scm_i_string_chars (descr)); + + pango_font_description_set_size (description, + gint (factor * + pango_font_description_get_size (description))); + + Font_metric *fm = all_fonts_global->find_pango_font (description, - factor, output_scale (layout)); + pango_font_description_free (description); + sizes = scm_acons (size_key, fm->self_scm (), sizes); scm_hash_set_x (table, descr, sizes); diff --git a/lily/paper-outputter-scheme.cc b/lily/paper-outputter-scheme.cc index d7fe624952..e4906f4a9b 100644 --- a/lily/paper-outputter-scheme.cc +++ b/lily/paper-outputter-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "paper-outputter.hh" diff --git a/lily/paper-outputter.cc b/lily/paper-outputter.cc index f11f40d905..e7e48c2fb3 100644 --- a/lily/paper-outputter.cc +++ b/lily/paper-outputter.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/lily/paper-score-scheme.cc b/lily/paper-score-scheme.cc index a2e475093a..0c6a16c21c 100644 --- a/lily/paper-score-scheme.cc +++ b/lily/paper-score-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "paper-score.hh" diff --git a/lily/paper-score.cc b/lily/paper-score.cc index 047e880f3c..bd6d3a6ede 100644 --- a/lily/paper-score.cc +++ b/lily/paper-score.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #include "paper-score.hh" @@ -62,7 +62,7 @@ Paper_score::typeset_system (System *system) vector Paper_score::find_break_indices () const { - vector all = root_system ()->columns (); + vector all = root_system ()->used_columns (); vector retval; for (vsize i = 0; i < all.size (); i++) @@ -125,7 +125,7 @@ Paper_score::process () down the road. doubly, also done in Score_engraver */ - vector pc (system_->columns ()); + vector pc (system_->used_columns ()); pc[0]->set_property ("line-break-permission", ly_symbol2scm ("allow")); pc.back ()->set_property ("line-break-permission", ly_symbol2scm ("allow")); diff --git a/lily/paper-system.cc b/lily/paper-system.cc index 5d3d19c513..544f64d8b0 100644 --- a/lily/paper-system.cc +++ b/lily/paper-system.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Jan Nieuwenhuizen + (c) 2004--2007 Jan Nieuwenhuizen */ #include "paper-system.hh" diff --git a/lily/parenthesis-engraver.cc b/lily/parenthesis-engraver.cc index cef5c55493..8f190f969c 100644 --- a/lily/parenthesis-engraver.cc +++ b/lily/parenthesis-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/parse-scm.cc b/lily/parse-scm.cc index c8d8d36bfa..c4d535d85d 100644 --- a/lily/parse-scm.cc +++ b/lily/parse-scm.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "parse-scm.hh" @@ -31,6 +31,9 @@ internal_ly_parse_scm (Parse_start *ps) scm_seek (port, scm_long2num (off), scm_long2num (SEEK_SET)); SCM from = scm_ftell (port); + scm_set_port_line_x (port, scm_from_int (ps->start_location_.line_number () -1)); + scm_set_port_column_x (port, scm_from_int (ps->start_location_.column_number () -1)); + SCM answer = SCM_UNSPECIFIED; SCM form = scm_read (port); diff --git a/lily/parser.yy b/lily/parser.yy index ebb322d773..02f03dea92 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -300,7 +300,7 @@ If we give names, Bison complains. %type book_body %type bare_unsigned -%type figured_bass_alteration +%type figured_bass_alteration %type dots %type exclamations %type optional_rest @@ -350,6 +350,7 @@ If we give names, Bison complains. %type absolute_pitch %type assignment_id %type bare_number +%type unsigned_number %type bass_figure %type figured_bass_modification %type br_bass_figure @@ -502,7 +503,7 @@ embedded_scm: lilypond_header_body: { - $$ = get_header(PARSER); + $$ = get_header (PARSER); PARSER->lexer_->add_scope ($$); } | lilypond_header_body assignment { @@ -854,9 +855,9 @@ alternative_music: repeated_music: - REPEAT simple_string bare_unsigned music alternative_music + REPEAT simple_string unsigned_number music alternative_music { - $$ = MAKE_SYNTAX ("repeat", @$, $2, scm_int2num ($3), $4, $5); + $$ = MAKE_SYNTAX ("repeat", @$, $2, $3, $4, $5); } ; @@ -975,7 +976,7 @@ prefix_composite_music: generic_prefix_music_scm { $$ = run_music_function (PARSER, $1); } - | CONTEXT simple_string optional_id optional_context_mod music { + | CONTEXT simple_string optional_id optional_context_mod music { $$ = MAKE_SYNTAX ("context-specification", @$, $2, $3, $5, $4, SCM_BOOL_F); } | NEWCONTEXT simple_string optional_id optional_context_mod music { @@ -1609,7 +1610,7 @@ direction_reqd_event: octave_check: /**/ { $$ = SCM_EOL; } | '=' { $$ = scm_from_int (0); } - | '=' sub_quotes { $$ = scm_from_int ($2); } + | '=' sub_quotes { $$ = scm_from_int (-$2); } | '=' sup_quotes { $$ = scm_from_int ($2); } ; @@ -1700,25 +1701,25 @@ gen_text_def: script_abbreviation: '^' { - $$ = scm_makfrom0str ("Hat"); + $$ = scm_from_locale_string ("Hat"); } | '+' { - $$ = scm_makfrom0str ("Plus"); + $$ = scm_from_locale_string ("Plus"); } | '-' { - $$ = scm_makfrom0str ("Dash"); + $$ = scm_from_locale_string ("Dash"); } | '|' { - $$ = scm_makfrom0str ("Bar"); + $$ = scm_from_locale_string ("Bar"); } | ANGLE_CLOSE { - $$ = scm_makfrom0str ("Larger"); + $$ = scm_from_locale_string ("Larger"); } | '.' { - $$ = scm_makfrom0str ("Dot"); + $$ = scm_from_locale_string ("Dot"); } | '_' { - $$ = scm_makfrom0str ("Underscore"); + $$ = scm_from_locale_string ("Underscore"); } ; @@ -1823,9 +1824,9 @@ bass_number: ; figured_bass_alteration: - '-' { $$ = -2; } - | '+' { $$ = 2; } - | '!' { $$ = 0; } + '-' { $$ = ly_rational2scm (FLAT_ALTERATION); } + | '+' { $$ = ly_rational2scm (SHARP_ALTERATION); } + | '!' { $$ = scm_from_int (0); } ; bass_figure: @@ -1850,11 +1851,11 @@ bass_figure: } | bass_figure figured_bass_alteration { Music *m = unsmob_music ($1); - if ($2) { + if (scm_to_double ($2)) { SCM salter = m->get_property ("alteration"); - int alter = scm_is_number (salter) ? scm_to_int (salter) : 0; + SCM alter = scm_is_number (salter) ? salter : scm_from_int (0); m->set_property ("alteration", - scm_from_int (alter + $2)); + scm_sum (alter, $2)); } else { m->set_property ("alteration", scm_from_int (0)); } @@ -2134,6 +2135,14 @@ bare_unsigned: } ; +unsigned_number: + bare_unsigned { $$ = scm_from_int ($1); } + | NUMBER_IDENTIFIER { + $$ = $1; + } + ; + + exclamations: { $$ = 0; } | exclamations '!' { $$ ++; } @@ -2375,7 +2384,7 @@ Lily_lexer::try_special_identifiers (SCM *destination, SCM sid) SCM get_next_unique_context_id () { - return scm_makfrom0str ("$uniqueContextId"); + return scm_from_locale_string ("$uniqueContextId"); } @@ -2385,7 +2394,7 @@ get_next_unique_lyrics_context_id () static int new_context_count; char s[128]; snprintf (s, sizeof (s)-1, "uniqueContext%d", new_context_count++); - return scm_makfrom0str (s); + return scm_from_locale_string (s); } diff --git a/lily/part-combine-engraver.cc b/lily/part-combine-engraver.cc index 121ad3fbd2..b12eb19a5f 100644 --- a/lily/part-combine-engraver.cc +++ b/lily/part-combine-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ @@ -104,6 +104,9 @@ ADD_TRANSLATOR (Part_combine_engraver, /* doc */ "Part combine engraver for orchestral scores: " "Print markings a2, Solo, Solo II, and unisono ", /* create */ "CombineTextScript", - /* read */ "printPartCombineTexts soloText soloIIText " + /* read */ + "printPartCombineTexts " + "soloText " + "soloIIText " "aDueText", /* write */ ""); diff --git a/lily/part-combine-iterator.cc b/lily/part-combine-iterator.cc index 6dbff41180..8841fb826b 100644 --- a/lily/part-combine-iterator.cc +++ b/lily/part-combine-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "context.hh" diff --git a/lily/percent-repeat-engraver.cc b/lily/percent-repeat-engraver.cc index a6c47e872c..55f99cd5cf 100644 --- a/lily/percent-repeat-engraver.cc +++ b/lily/percent-repeat-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys , Erik Sandberg + (c) 2000--2007 Han-Wen Nienhuys , Erik Sandberg */ diff --git a/lily/percent-repeat-item.cc b/lily/percent-repeat-item.cc index 705d9394b2..451647fb5c 100644 --- a/lily/percent-repeat-item.cc +++ b/lily/percent-repeat-item.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #include "percent-repeat-item.hh" @@ -38,14 +38,14 @@ Percent_repeat_item_interface::x_percent (Grob *me, int count, Stencil s = brew_slash (me); for (int i = count; i--;) - m.add_at_edge (X_AXIS, RIGHT, s, -slash_neg_kern, 0); + m.add_at_edge (X_AXIS, RIGHT, s, -slash_neg_kern); Stencil d1 = Font_interface::get_default_font (me)->find_by_name ("dots.dot"); Stencil d2 = d1; d1.translate_axis (0.5, Y_AXIS); d2.translate_axis (-0.5, Y_AXIS); - m.add_at_edge (X_AXIS, LEFT, d1, -dot_neg_kern, 0); - m.add_at_edge (X_AXIS, RIGHT, d2, -dot_neg_kern, 0); + m.add_at_edge (X_AXIS, LEFT, d1, -dot_neg_kern); + m.add_at_edge (X_AXIS, RIGHT, d2, -dot_neg_kern); return m; } diff --git a/lily/percent-repeat-iterator.cc b/lily/percent-repeat-iterator.cc index 077d51907d..0039b36415 100644 --- a/lily/percent-repeat-iterator.cc +++ b/lily/percent-repeat-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys Erik Sandberg */ diff --git a/lily/performance-scheme.cc b/lily/performance-scheme.cc index 1d760da6de..3f45829882 100644 --- a/lily/performance-scheme.cc +++ b/lily/performance-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "performance.hh" diff --git a/lily/performance.cc b/lily/performance.cc index 59cc64a2e2..e536622f06 100644 --- a/lily/performance.cc +++ b/lily/performance.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "performance.hh" @@ -17,7 +17,7 @@ using namespace std; #include "international.hh" #include "lily-version.hh" #include "main.hh" -#include "midi-item.hh" +#include "midi-chunk.hh" #include "midi-stream.hh" #include "score.hh" #include "string-convert.hh" @@ -34,15 +34,13 @@ Performance::~Performance () } void -Performance::output (Midi_stream &midi_stream) +Performance::output (Midi_stream &midi_stream) const { int tracks_ = audio_staffs_.size (); - // ugh - int clocks_per_4 = 384; - - midi_stream << Midi_header (1, tracks_, clocks_per_4); - message (_ ("Track...") + " "); + midi_stream.write (Midi_header (1, tracks_, 384)); + if (be_verbose_global) + progress_indication (_ ("Track...") + " "); int channel = 0; for (vsize i = 0; i < audio_staffs_.size (); i++) @@ -89,7 +87,7 @@ Performance::add_element (Audio_element *p) } void -Performance::write_output (string out) +Performance::write_output (string out) const { if (out == "-") out = "lelie.midi"; @@ -107,3 +105,7 @@ Performance::write_output (string out) } +void +Performance::process () +{ +} diff --git a/lily/performer-group.cc b/lily/performer-group.cc index 6eb2b656c2..4b3270f4ee 100644 --- a/lily/performer-group.cc +++ b/lily/performer-group.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/lily/performer.cc b/lily/performer.cc index 9d99873989..7add5ba193 100644 --- a/lily/performer.cc +++ b/lily/performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/lily/pfb.cc b/lily/pfb.cc index a96aac7761..f062c986db 100644 --- a/lily/pfb.cc +++ b/lily/pfb.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include @@ -85,7 +85,7 @@ LY_DEFINE (ly_pfb_to_pfa, "ly:pfb->pfa", vector pfb_string = gulp_file (file_name, 0); char *pfa = pfb2pfa ((Byte *) &pfb_string[0], pfb_string.size ()); - SCM pfa_scm = scm_makfrom0str (pfa); + SCM pfa_scm = scm_from_locale_string (pfa); free (pfa); if (be_verbose_global) diff --git a/lily/phrasing-slur-engraver.cc b/lily/phrasing-slur-engraver.cc index c1261f3066..b2301d38e5 100644 --- a/lily/phrasing-slur-engraver.cc +++ b/lily/phrasing-slur-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/piano-pedal-align-engraver.cc b/lily/piano-pedal-align-engraver.cc index 6b1fc5b29d..a7031fbb01 100644 --- a/lily/piano-pedal-align-engraver.cc +++ b/lily/piano-pedal-align-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ diff --git a/lily/piano-pedal-bracket.cc b/lily/piano-pedal-bracket.cc index 8c76a60d13..86964ce53f 100644 --- a/lily/piano-pedal-bracket.cc +++ b/lily/piano-pedal-bracket.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Han-Wen Nienhuys + (c) 2003--2007 Han-Wen Nienhuys */ #include "stencil.hh" @@ -100,4 +100,4 @@ ADD_INTERFACE (Piano_pedal_bracket, "edge-height " "shorten-pair " "bracket-flare " - "pedal-text"); + "pedal-text "); diff --git a/lily/piano-pedal-engraver.cc b/lily/piano-pedal-engraver.cc index debc884360..703183b3c6 100644 --- a/lily/piano-pedal-engraver.cc +++ b/lily/piano-pedal-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen , + (c) 2000--2007 Jan Nieuwenhuizen , Erik Sandberg Chris Jackson - extended to support diff --git a/lily/piano-pedal-performer.cc b/lily/piano-pedal-performer.cc index 1ab27bca07..ef01942221 100644 --- a/lily/piano-pedal-performer.cc +++ b/lily/piano-pedal-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ #include "performer.hh" diff --git a/lily/pitch-interval.cc b/lily/pitch-interval.cc index ee2d4e3281..064c634327 100644 --- a/lily/pitch-interval.cc +++ b/lily/pitch-interval.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "pitch-interval.hh" diff --git a/lily/pitch-scheme.cc b/lily/pitch-scheme.cc index e45cd841b7..440df366eb 100644 --- a/lily/pitch-scheme.cc +++ b/lily/pitch-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "pitch.hh" diff --git a/lily/pitch-squash-engraver.cc b/lily/pitch-squash-engraver.cc index f072c3c84e..8fd4d4e26d 100644 --- a/lily/pitch-squash-engraver.cc +++ b/lily/pitch-squash-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/pitch.cc b/lily/pitch.cc index 880dc79edf..7c43708890 100644 --- a/lily/pitch.cc +++ b/lily/pitch.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "pitch.hh" @@ -168,10 +168,10 @@ Pitch::to_string () const { int n = (notename_ + 2) % scale_->step_tones_.size (); string s = ::to_string (char (n + 'a')); - Rational qtones = alteration_ * Rational (4,1); - int qt = int (rint (Real (qtones))); + Rational qtones = alteration_ * Rational (4,1); + int qt = int (rint (Real (qtones))); - s += string (accname[qt + 4]); + s += string (accname[qt + 4]); if (octave_ >= 0) { int o = octave_ + 1; @@ -245,7 +245,7 @@ Pitch::print_smob (SCM s, SCM port, scm_print_state *) { Pitch *r = (Pitch *) SCM_CELL_WORD_1 (s); scm_puts ("#to_string ().c_str ()), port); + scm_display (ly_string2scm (r->to_string ()), port); scm_puts (" >", port); return 1; } @@ -302,7 +302,9 @@ Pitch::transposed (Pitch d) const return p; } +Rational NATURAL_ALTERATION (0); Rational FLAT_ALTERATION (-1, 2); +Rational DOUBLE_FLAT_ALTERATION (-1); Rational SHARP_ALTERATION (1, 2); Pitch diff --git a/lily/pitched-trill-engraver.cc b/lily/pitched-trill-engraver.cc index d29f6f42ca..2d632a02a1 100644 --- a/lily/pitched-trill-engraver.cc +++ b/lily/pitched-trill-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "engraver.hh" @@ -110,8 +110,7 @@ Pitched_trill_engraver::make_trill (Stream_event *ev) trill_accidental_ = make_item ("TrillPitchAccidental", ev->self_scm ()); // fixme: naming -> alterations - trill_accidental_->set_property ("accidentals", scm_list_1 (scm_from_int (Rational (4) - * p->get_alteration ()))); + trill_accidental_->set_property ("alteration", ly_rational2scm (p->get_alteration ())); Side_position_interface::add_support (trill_accidental_, trill_head_); trill_head_->set_object ("accidental-grob", trill_accidental_->self_scm ()); diff --git a/lily/pointer-group-interface.cc b/lily/pointer-group-interface.cc index a04d4512c0..d1302391e4 100644 --- a/lily/pointer-group-interface.cc +++ b/lily/pointer-group-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "pointer-group-interface.hh" diff --git a/lily/prob-scheme.cc b/lily/prob-scheme.cc index bfa355d9a2..f1e9179661 100644 --- a/lily/prob-scheme.cc +++ b/lily/prob-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "prob.hh" diff --git a/lily/prob.cc b/lily/prob.cc index a45e089a08..e6facbddc5 100644 --- a/lily/prob.cc +++ b/lily/prob.cc @@ -3,13 +3,14 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Jan Nieuwenhuizen + (c) 2004--2007 Jan Nieuwenhuizen */ #include "prob.hh" #include "main.hh" #include "item.hh" #include "input.hh" +#include "profile.hh" #include "ly-smobs.icc" @@ -140,6 +141,11 @@ Prob::print_smob (SCM smob, SCM port, scm_print_state*) SCM Prob::internal_get_property (SCM sym) const { +#ifndef NDEBUG + if (profile_property_accesses) + note_property_access (&prob_property_lookup_table, sym); +#endif + /* TODO: type checking */ @@ -152,18 +158,8 @@ Prob::internal_get_property (SCM sym) const } void -Prob::internal_set_property (SCM sym, SCM val -#ifndef NDEBUG - , char const *file, int line, char const *fun -#endif - ) +Prob::internal_set_property (SCM sym, SCM val) { -#ifndef NDEBUG - (void) file; - (void) line; - (void) fun; -#endif - if (do_internal_type_checking_global) type_check_assignment (sym, val); diff --git a/lily/profile.cc b/lily/profile.cc index 6531a3f330..0390a64a62 100644 --- a/lily/profile.cc +++ b/lily/profile.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "profile.hh" @@ -12,22 +12,25 @@ void note_property_access (SCM *table, SCM sym); SCM context_property_lookup_table; SCM grob_property_lookup_table; +SCM prob_property_lookup_table; -LY_DEFINE (ly_context_property_lookup_stats, "ly:context-property-lookup-stats", - 0, 0, 0, (), - "") +LY_DEFINE (ly_property_lookup_stats, "ly:property-lookup-stats", + 1, 0, 0, (SCM sym), + "Return hash table with a property access corresponding to @var{sym}. " + "Choices are prob, grob and context.") { - return context_property_lookup_table ? context_property_lookup_table - : scm_c_make_hash_table (1); + if (sym == ly_symbol2scm ("context")) + return context_property_lookup_table ? context_property_lookup_table + : scm_c_make_hash_table (1); + if (sym == ly_symbol2scm ("prob")) + return prob_property_lookup_table ? prob_property_lookup_table + : scm_c_make_hash_table (1); + if (sym == ly_symbol2scm ("grob")) + return grob_property_lookup_table ? grob_property_lookup_table + : scm_c_make_hash_table (1); + return scm_c_make_hash_table (1); } -LY_DEFINE (ly_property_lookup_stats, "ly:grob-property-lookup-stats", - 0, 0, 0, (), - "") -{ - return grob_property_lookup_table ? grob_property_lookup_table - : scm_c_make_hash_table (1); -} void note_property_access (SCM *table, SCM sym) diff --git a/lily/program-option.cc b/lily/program-option.cc index 02213e4c71..5d9bebd738 100644 --- a/lily/program-option.cc +++ b/lily/program-option.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #include "program-option.hh" @@ -12,15 +12,13 @@ #include using namespace std; +#include "profile.hh" #include "international.hh" #include "main.hh" #include "parse-scm.hh" #include "string-convert.hh" #include "warn.hh" -/* Write midi as formatted ascii stream? */ -bool do_midi_debugging_global; -bool use_object_keys; bool debug_skylines; /* @@ -48,11 +46,6 @@ void internal_set_option (SCM var, SCM val) profile_property_accesses = to_boolean (val); val = scm_from_bool (to_boolean (val)); } - else if (var == ly_symbol2scm ("debug-midi")) - { - do_midi_debugging_global = to_boolean (val); - val = scm_from_bool (to_boolean (val)); - } else if (var == ly_symbol2scm ("point-and-click")) { point_and_click_global = to_boolean (val); @@ -73,6 +66,11 @@ void internal_set_option (SCM var, SCM val) parsed_objects_should_be_dead = to_boolean (val); val = scm_from_bool (parsed_objects_should_be_dead); } + else if (var == ly_symbol2scm ("safe")) + { + be_safe_global = to_boolean (val); + val = scm_from_bool (be_safe_global); + } else if (var == ly_symbol2scm ("old-relative")) { lily_1_8_relative = to_boolean (val); @@ -80,11 +78,6 @@ void internal_set_option (SCM var, SCM val) lily_1_8_compatibility_used = to_boolean (val); val = scm_from_bool (to_boolean (val)); } - else if (var == ly_symbol2scm ("object-keys")) - { - use_object_keys = to_boolean (val); - val = scm_from_bool (to_boolean (val)); - } else if (var == ly_symbol2scm ("strict-infinity-checking")) { strict_infinity_checking = to_boolean (val); @@ -152,12 +145,11 @@ get_help_string () } LY_DEFINE (ly_option_usage, "ly:option-usage", 0, 0, 0, (), - "Print ly:set-option usage") + "Print @code{ly:set-option} usage") { string help = get_help_string (); - fputs (help.c_str (), stdout); + progress_indication (help); - exit (0); return SCM_UNSPECIFIED; } @@ -188,7 +180,10 @@ LY_DEFINE (ly_set_option, "ly:set-option", 1, 1, 0, (SCM var, SCM val), __FUNCTION__, "symbol"); if (ly_symbol2scm ("help") == var) - ly_option_usage (); + { + ly_option_usage (); + exit (0); + } if (val == SCM_UNDEFINED) val = SCM_BOOL_T; @@ -208,6 +203,18 @@ LY_DEFINE (ly_set_option, "ly:set-option", 1, 1, 0, (SCM var, SCM val), return SCM_UNSPECIFIED; } +LY_DEFINE (ly_command_line_options, "ly:command-line-options", 0, 0, 0, (), + "The Scheme specified on command-line with @samp{-d}.") +{ + return ly_string2scm (init_scheme_variables_global); +} + +LY_DEFINE (ly_command_line_code, "ly:command-line-code", 0, 0, 0, (), + "The Scheme specified on command-line with @samp{-e}.") +{ + return ly_string2scm (init_scheme_code_global); +} + LY_DEFINE (ly_command_line_verbose_p, "ly:command-line-verbose?", 0, 0, 0, (), "Was be_verbose_global set?") { @@ -216,6 +223,13 @@ LY_DEFINE (ly_command_line_verbose_p, "ly:command-line-verbose?", 0, 0, 0, (), +LY_DEFINE (ly_all_option, "ly:all-options", + 0, 0, 0, (), + "Get all option settings in an alist.") +{ + return ly_hash2alist (option_hash); +} + LY_DEFINE (ly_get_option, "ly:get-option", 1, 0, 0, (SCM var), "Get a global option setting.") @@ -226,6 +240,7 @@ LY_DEFINE (ly_get_option, "ly:get-option", 1, 0, 0, (SCM var), } + bool get_program_option (const char *s) { diff --git a/lily/property-iterator.cc b/lily/property-iterator.cc index cfa6fb6286..f067a66282 100644 --- a/lily/property-iterator.cc +++ b/lily/property-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "property-iterator.hh" diff --git a/lily/protected-scm.cc b/lily/protected-scm.cc index d7a8498a92..ccb91ab087 100644 --- a/lily/protected-scm.cc +++ b/lily/protected-scm.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "protected-scm.hh" diff --git a/lily/quote-iterator.cc b/lily/quote-iterator.cc index c55aae3428..7f42310f7f 100644 --- a/lily/quote-iterator.cc +++ b/lily/quote-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "music-wrapper-iterator.hh" @@ -246,8 +246,7 @@ Quote_iterator::process (Moment m) Pitch diff = pitch_interval (qp, mp); ev = ev->clone (); - SCM props = transpose_mutable (ev->get_property_alist (true), diff); - ev = new Stream_event (ev->get_property ("class"), props); + transpose_mutable (ev->get_property_alist (true), diff); transposed_musics_ = scm_cons (ev->unprotect (), transposed_musics_); } quote_outlet_.get_outlet ()->event_source ()->broadcast (ev); diff --git a/lily/relative-octave-check.cc b/lily/relative-octave-check.cc index cc1efe3d21..1c15364b86 100644 --- a/lily/relative-octave-check.cc +++ b/lily/relative-octave-check.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "input.hh" diff --git a/lily/relative-octave-music.cc b/lily/relative-octave-music.cc index f940a8b68b..cd8aead2d0 100644 --- a/lily/relative-octave-music.cc +++ b/lily/relative-octave-music.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "music.hh" diff --git a/lily/relocate.cc b/lily/relocate.cc index a60b262c5e..47502f7dbd 100644 --- a/lily/relocate.cc +++ b/lily/relocate.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -44,7 +44,12 @@ sane_putenv (char const *key, string value, bool overwrite) progress_indication (_f ("Setting %s to %s" , key, value.c_str ()) + "\n"); - return putenv (s); + int retval = putenv (s); + /* + unfortunately, we can't portably free S here, + due to various bugs in glibc prior to 2.1.1 + */ + return retval; } return -1; @@ -228,11 +233,7 @@ setup_paths (char const *argv0_ptr) /* When running from build dir, a full LILYPOND_PREFIX is set-up at - $(OUTBASE)/share/lilypond/TOPLEVEL_VERSION - - This historical hack will allow the shorthand - - LILYPONDPREFIX=out lily/out/lilypond ... + $(OUTBASE)/{share,lib}/lilypond/current */ diff --git a/lily/repeat-acknowledge-engraver.cc b/lily/repeat-acknowledge-engraver.cc index 56301cd2a3..3e3025556f 100644 --- a/lily/repeat-acknowledge-engraver.cc +++ b/lily/repeat-acknowledge-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "engraver.hh" @@ -102,7 +102,7 @@ Repeat_acknowledge_engraver::process_music () if (!scm_is_string (wb) || ly_is_equal (db, wb)) { if (s != "" || (volta_found && !scm_is_string (wb))) - context ()->set_property ("whichBar", scm_makfrom0str (s.c_str ())); + context ()->set_property ("whichBar", ly_string2scm (s)); } } diff --git a/lily/repeat-tie-engraver.cc b/lily/repeat-tie-engraver.cc index 7678850d89..6b16fbc088 100644 --- a/lily/repeat-tie-engraver.cc +++ b/lily/repeat-tie-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -60,14 +60,23 @@ Repeat_tie_engraver::acknowledge_note_head (Grob_info inf) { semi_tie_column_ = make_item ("RepeatTieColumn", event_->self_scm ()); } - - Grob *semi_tie = make_item ("RepeatTie", event_->self_scm ()); + + SCM cause = event_->self_scm (); + Grob *semi_tie = make_item ("RepeatTie", cause); semi_tie->set_object ("note-head", inf.grob ()->self_scm ()); Pointer_group_interface::add_grob (semi_tie_column_, ly_symbol2scm ("ties"), semi_tie); semi_tie->set_parent (semi_tie_column_, Y_AXIS); semi_ties_.push_back (semi_tie); + + + if (is_direction (unsmob_stream_event (cause)->get_property ("direction"))) + { + Direction d = to_dir (unsmob_stream_event (cause)->get_property ("direction")); + semi_tie->set_property ("direction", scm_from_int (d)); + } + } ADD_ACKNOWLEDGER (Repeat_tie_engraver, note_head); diff --git a/lily/repeated-music.cc b/lily/repeated-music.cc index be05ae58b0..666b1fbf1d 100644 --- a/lily/repeated-music.cc +++ b/lily/repeated-music.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "repeated-music.hh" diff --git a/lily/rest-collision-engraver.cc b/lily/rest-collision-engraver.cc index fb1c763b9e..d0704a10b5 100644 --- a/lily/rest-collision-engraver.cc +++ b/lily/rest-collision-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "warn.hh" diff --git a/lily/rest-collision.cc b/lily/rest-collision.cc index f748b56a82..b8ad86ba91 100644 --- a/lily/rest-collision.cc +++ b/lily/rest-collision.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "rest-collision.hh" @@ -101,16 +101,7 @@ Rest_collision::calc_positioning_done (SCM smob) { Grob *e = elts[i]; if (unsmob_grob (e->get_object ("rest"))) - { - /* - Ignore rests under beam. - */ - Grob *st = unsmob_grob (e->get_object ("stem")); - if (st && unsmob_grob (st->get_object ("beam"))) - continue; - - rests.push_back (e); - } + rests.push_back (e); else notes.push_back (e); } @@ -126,7 +117,7 @@ Rest_collision::calc_positioning_done (SCM smob) no partners to collide with */ if (rests.size () + notes.size () < 2) - return SCM_UNSPECIFIED; + return SCM_BOOL_T; Real staff_space = Staff_symbol_referencer::staff_space (me); /* @@ -164,7 +155,7 @@ Rest_collision::calc_positioning_done (SCM smob) if (ordered_rests[-d].size () > 1) ordered_rests[-d][0]->warning (_ ("too many colliding rests")); - return SCM_UNSPECIFIED; + return SCM_BOOL_T; } } while (flip (&d) != LEFT); @@ -219,14 +210,14 @@ Rest_collision::calc_positioning_done (SCM smob) } if (!rcol) - return SCM_UNSPECIFIED; + return SCM_BOOL_T; Grob *rest = Note_column::get_rest (rcol); Grob *common = common_refpoint_of_array (notes, rcol, Y_AXIS); Interval restdim = rcol->extent (common, Y_AXIS); if (restdim.is_empty ()) - return SCM_UNSPECIFIED; + return SCM_BOOL_T; Real staff_space = Staff_symbol_referencer::staff_space (rcol); Real minimum_dist = robust_scm2double (me->get_property ("minimum-distance"), 1.0) * staff_space; @@ -258,7 +249,7 @@ Rest_collision::calc_positioning_done (SCM smob) Note_column::translate_rests (rcol, discrete_y); } - return SCM_UNSPECIFIED; + return SCM_BOOL_T; } ADD_INTERFACE (Rest_collision, diff --git a/lily/rest-engraver.cc b/lily/rest-engraver.cc index ec812ec2ed..e6e7ecb7de 100644 --- a/lily/rest-engraver.cc +++ b/lily/rest-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/rest.cc b/lily/rest.cc index e3543e4cb9..1e15144839 100644 --- a/lily/rest.cc +++ b/lily/rest.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "rest.hh" @@ -40,18 +40,6 @@ Rest::y_offset_callback (SCM smob) else amount += ss / 2; - Grob *dot = unsmob_grob (me->get_object ("dot")); - if (dot && duration_log > 4) // UGH. - { - dot->set_property ("staff-position", - scm_from_int ((duration_log == 7) ? 4 : 3)); - } - if (dot && duration_log >= -1 && duration_log <= 1) // UGH again. - { - dot->set_property ("staff-position", - scm_from_int ((duration_log == 0) ? -1 : 1)); - } - if (!position_override) amount += 2 * ss * get_grob_direction (me);; @@ -187,12 +175,25 @@ Rest::generic_extent_callback (Grob *me, Axis a) return ly_interval2scm (unsmob_stencil (m)->extent (a)); } +MAKE_SCHEME_CALLBACK (Rest, pure_height, 3); +SCM +Rest::pure_height (SCM smob, SCM start, SCM end) +{ + (void) start; + (void) end; + + Grob *me = unsmob_grob (smob); + SCM m = brew_internal_stencil (me, false); + return ly_interval2scm (unsmob_stencil (m)->extent (Y_AXIS)); +} + ADD_INTERFACE (Rest, "A rest symbol.", /* properties */ - "style " "direction " - "minimum-distance"); + "minimum-distance " + "style " + ); diff --git a/lily/rhythmic-column-engraver.cc b/lily/rhythmic-column-engraver.cc index 4d77927127..fc21e618eb 100644 --- a/lily/rhythmic-column-engraver.cc +++ b/lily/rhythmic-column-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/rhythmic-head.cc b/lily/rhythmic-head.cc index 00ef3ae020..93349e06fe 100644 --- a/lily/rhythmic-head.cc +++ b/lily/rhythmic-head.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "rhythmic-head.hh" diff --git a/lily/rod.cc b/lily/rod.cc index 4801eb3cbe..2e6ab483db 100644 --- a/lily/rod.cc +++ b/lily/rod.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "rod.hh" diff --git a/lily/scale.cc b/lily/scale.cc index 89e8103887..c9fa8b7f22 100644 --- a/lily/scale.cc +++ b/lily/scale.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ diff --git a/lily/scheme-listener-scheme.cc b/lily/scheme-listener-scheme.cc index 7e8370068f..5d46d7fc5b 100644 --- a/lily/scheme-listener-scheme.cc +++ b/lily/scheme-listener-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Erik Sandberg + (c) 2006--2007 Erik Sandberg */ #include "scheme-listener.hh" diff --git a/lily/scheme-listener.cc b/lily/scheme-listener.cc index d6ef475150..7d2f9da824 100644 --- a/lily/scheme-listener.cc +++ b/lily/scheme-listener.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Erik Sandberg + (c) 2006--2007 Erik Sandberg */ #include "scheme-listener.hh" diff --git a/lily/scm-hash.cc b/lily/scm-hash.cc index 5b889ace4f..e64de8b397 100644 --- a/lily/scm-hash.cc +++ b/lily/scm-hash.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "scm-hash.hh" diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc index 91cca081e7..eb89e555f8 100644 --- a/lily/score-engraver.cc +++ b/lily/score-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "score-engraver.hh" @@ -79,8 +79,7 @@ Score_engraver::initialize () SCM props = updated_grob_properties (context (), ly_symbol2scm ("System")); - Object_key const *sys_key = context ()->get_grob_key ("System"); - pscore_->typeset_system (new System (props, sys_key)); + pscore_->typeset_system (new System (props)); system_ = pscore_->root_system (); context ()->set_property ("rootSystem", system_->self_scm ()); @@ -99,6 +98,20 @@ Score_engraver::connect_to_context (Context *c) d->add_listener (GET_LISTENER (finish), ly_symbol2scm ("Finish")); } +/* + uncovered: + + check_removal always returns false for Score contexts, it has been that way +since I joined the project. There is a reason for this: The typeset score is +stored in the Score_engraver, which in turn is accessed through the +Global_context returned by ly:run-translator. So the score-translator must be +connected to the score-context after run-translator finishes. + +I plan to change this: we should junk run-translator, and instead keep track +of both context and translator in the SCM code, and access the typeset score +directly via the created global-translator. Then it would be possible to +disconnect score-translators at iteration time. -es + */ void Score_engraver::disconnect_from_context () { @@ -171,7 +184,7 @@ ADD_TRANSLATOR_GROUP (Score_engraver, /* read */ "currentMusicalColumn " "currentCommandColumn " - "verticallySpacedContexts", + "verticallySpacedContexts ", /* write */ ""); diff --git a/lily/score-performer.cc b/lily/score-performer.cc index 73f79add86..99d2f84967 100644 --- a/lily/score-performer.cc +++ b/lily/score-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Jan Nieuwenhuizen + (c) 1996--2007 Jan Nieuwenhuizen */ #include "score-performer.hh" @@ -92,6 +92,7 @@ Score_performer::prepare (SCM sev) SCM sm = ev->get_property ("moment"); Moment *m = unsmob_moment (sm); audio_column_ = new Audio_column (*m); + announce_element (Audio_element_info (audio_column_, 0)); precomputed_recurse_over_translators (context (), START_TRANSLATION_TIMESTEP, UP); } @@ -113,7 +114,7 @@ Score_performer::one_time_step (SCM) { if (!skipping_) { - skip_start_mom_ = audio_column_->at_mom (); + skip_start_mom_ = audio_column_->when (); skipping_ = true; } } @@ -121,11 +122,11 @@ Score_performer::one_time_step (SCM) { if (skipping_) { - offset_mom_ -= audio_column_->at_mom () - skip_start_mom_; + offset_mom_ -= audio_column_->when () - skip_start_mom_; skipping_ = false; } - audio_column_->offset_at_mom (offset_mom_); + audio_column_->offset_when (offset_mom_); precomputed_recurse_over_translators (context (), PROCESS_MUSIC, UP); do_announces (); } diff --git a/lily/score-scheme.cc b/lily/score-scheme.cc index b48219ad44..eebdedbb95 100644 --- a/lily/score-scheme.cc +++ b/lily/score-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "score.hh" @@ -11,7 +11,6 @@ #include "music.hh" #include "output-def.hh" #include "global-context.hh" -#include "lilypond-key.hh" #include "music-output.hh" #include "paper-score.hh" #include "paper-book.hh" @@ -74,7 +73,7 @@ LY_DEFINE (ly_score_error_p, "ly:score-error?", } LY_DEFINE (ly_score_embedded_format, "ly:score-embedded-format", - 2, 1, 0, (SCM score, SCM layout, SCM key), + 2, 0, 0, (SCM score, SCM layout), "Run @var{score} through @var{layout}, an output definition, " "scaled to correct output-scale already, " "return a list of layout-lines. " @@ -107,74 +106,9 @@ LY_DEFINE (ly_score_embedded_format, "ly:score-embedded-format", itself. */ score_def->parent_ = od; - SCM context = ly_run_translator (sc->get_music (), score_def->self_scm (), - key); + SCM context = ly_run_translator (sc->get_music (), score_def->self_scm ()); SCM output = ly_format_output (context); scm_remember_upto_here_1 (prot); return output; } - -LY_DEFINE (ly_score_process, "ly:render-music-as-systems", - 5, 0, 0, (SCM music, - SCM outdef, - SCM book_outputdef, - SCM header, - SCM outname), - "Create output using a default \\book block. ") -{ - SCM_ASSERT_TYPE(unsmob_music(music), music, - SCM_ARG1, __FUNCTION__, "music"); - SCM_ASSERT_TYPE(unsmob_output_def (outdef), outdef, - SCM_ARG2, __FUNCTION__, "output def"); - SCM_ASSERT_TYPE(unsmob_output_def (book_outputdef), book_outputdef, - SCM_ARG3, __FUNCTION__, "output def"); - SCM_ASSERT_TYPE(scm_is_string (outname), outname, - SCM_ARG5, __FUNCTION__, "string"); - - - SCM scaled_def = outdef; - SCM scaled_bookdef = book_outputdef; - - Output_def *bpd = unsmob_output_def (book_outputdef); - - /* ugh . */ - assert (bpd->c_variable ("is-paper") == SCM_BOOL_T); - - Real scale = scm_to_double (bpd->c_variable ("output-scale")); - - Output_def *def = scale_output_def (unsmob_output_def (outdef), scale); - Output_def *bdef = scale_output_def (bpd, scale); - def->parent_ = bdef; - - scaled_def = def->self_scm (); - scaled_bookdef = bdef->self_scm (); - - def->unprotect (); - bdef->unprotect (); - - SCM context = ly_run_translator (music, scaled_def, SCM_BOOL_F); - SCM output_as_scm = ly_format_output (context); - Music_output *output = unsmob_music_output (output_as_scm); - - Paper_score *pscore = dynamic_cast (output); - assert (pscore); - - /* ugh, this is strange, Paper_book without a Book object. */ - Paper_book *paper_book = new Paper_book (); - paper_book->header_ = header; - paper_book->paper_ = unsmob_output_def (scaled_bookdef); - - if (ly_is_module (header)) - paper_book->add_score (header); - - paper_book->add_score (pscore->self_scm ()); - paper_book->classic_output (outname); - paper_book->unprotect (); - - scm_remember_upto_here_1 (scaled_def); - scm_remember_upto_here_1 (scaled_bookdef); - - return SCM_UNSPECIFIED; -} - diff --git a/lily/score.cc b/lily/score.cc index 63169ca462..5b11a0d427 100644 --- a/lily/score.cc +++ b/lily/score.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "score.hh" @@ -17,7 +17,6 @@ using namespace std; #include "global-context.hh" #include "international.hh" #include "lily-parser.hh" -#include "lilypond-key.hh" #include "main.hh" #include "music.hh" #include "music.hh" @@ -114,8 +113,7 @@ Score::Score (Score const &s) */ SCM Score::book_rendering (Output_def *layoutbook, - Output_def *default_def, - Object_key *book_key) + Output_def *default_def) { if (error_found_) return SCM_EOL; @@ -131,9 +129,6 @@ Score::book_rendering (Output_def *layoutbook, int outdef_count = defs_.size (); - Object_key *key = new Lilypond_general_key (book_key, user_key_, 0); - SCM scm_key = key->unprotect (); - for (int i = 0; !i || i < outdef_count; i++) { Output_def *def = outdef_count ? defs_[i] : default_def; @@ -148,7 +143,7 @@ Score::book_rendering (Output_def *layoutbook, } /* TODO: fix or junk --no-layout. */ - SCM context = ly_run_translator (music_, def->self_scm (), scm_key); + SCM context = ly_run_translator (music_, def->self_scm ()); if (dynamic_cast (unsmob_context (context))) { SCM s = ly_format_output (context); @@ -160,7 +155,6 @@ Score::book_rendering (Output_def *layoutbook, scm_remember_upto_here_1 (scaled); } - scm_remember_upto_here_1 (scm_key); scm_remember_upto_here_1 (scaled_bookdef); return outputs; } diff --git a/lily/script-column-engraver.cc b/lily/script-column-engraver.cc index ada6f0aac4..6a0211530d 100644 --- a/lily/script-column-engraver.cc +++ b/lily/script-column-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/script-column.cc b/lily/script-column.cc index a8fc0c3fc4..1ae7969b4e 100644 --- a/lily/script-column.cc +++ b/lily/script-column.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "script-column.hh" diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc index 1719864361..72359defcf 100644 --- a/lily/script-engraver.cc +++ b/lily/script-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/script-interface.cc b/lily/script-interface.cc index 94bebe9e60..9087b88e6c 100644 --- a/lily/script-interface.cc +++ b/lily/script-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "script-interface.hh" diff --git a/lily/script-row-engraver.cc b/lily/script-row-engraver.cc index b84c5f22a2..0e08362c58 100644 --- a/lily/script-row-engraver.cc +++ b/lily/script-row-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ diff --git a/lily/self-aligment-interface.cc b/lily/self-aligment-interface.cc index 9f986e7c7f..ff089b6bbd 100644 --- a/lily/self-aligment-interface.cc +++ b/lily/self-aligment-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "self-alignment-interface.hh" diff --git a/lily/semi-tie-column.cc b/lily/semi-tie-column.cc index 7a02ac578b..c7d44a9568 100644 --- a/lily/semi-tie-column.cc +++ b/lily/semi-tie-column.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -55,14 +55,18 @@ Semi_tie_column::calc_positioning_done (SCM smob) SCM manual_configs = me->get_property ("tie-configuration"); problem.set_manual_tie_configuration (manual_configs); - Ties_configuration base = problem.generate_optimal_chord_configuration (); + Ties_configuration base = problem.generate_optimal_configuration (); for (vsize i = 0; i < lv_ties.size(); i++) { - Tie::set_control_points (lv_ties[i], problem.common_x_refpoint (), base[i], - problem.details_); + SCM cp = Tie::get_control_points (lv_ties[i], problem.common_x_refpoint (), base[i], + problem.details_); + + lv_ties[i]->set_property ("control-points", cp); set_grob_direction (lv_ties[i], base[i].dir_); - } + problem.set_debug_scoring (base); + } + return SCM_BOOL_T; } diff --git a/lily/semi-tie.cc b/lily/semi-tie.cc index 77b266e6c4..a95b30737f 100644 --- a/lily/semi-tie.cc +++ b/lily/semi-tie.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -23,6 +23,7 @@ ADD_INTERFACE(Semi_tie, "control-points " "direction " "details " + "head-direction " "note-head " "thickness " ); @@ -43,8 +44,8 @@ Semi_tie::calc_control_points (SCM smob) programming_error ("lv tie without Semi_tie_column. Killing lv tie."); me->suicide (); } - - return SCM_UNSPECIFIED; + + return me->get_property_data ("control-points"); } int diff --git a/lily/separating-group-spanner.cc b/lily/separating-group-spanner.cc index fb8cce0022..f8975cd515 100644 --- a/lily/separating-group-spanner.cc +++ b/lily/separating-group-spanner.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "separating-group-spanner.hh" diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc index b2aeb9b2ab..f493840d95 100644 --- a/lily/separating-line-group-engraver.cc +++ b/lily/separating-line-group-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "engraver.hh" @@ -93,13 +93,6 @@ Separating_line_group_engraver::finalize () sep_span_->set_bound (RIGHT, unsmob_grob (ccol)); sep_span_ = 0; - for (vsize i = 0; i < last_spacings_.note_spacings_.size (); i++) - { - Pointer_group_interface::add_grob (last_spacings_.note_spacings_[i], - ly_symbol2scm ("right-items"), - column); - } - if (last_spacings_.staff_spacing_ && last_spacings_.staff_spacing_->get_column () == column) last_spacings_.staff_spacing_->suicide (); @@ -146,14 +139,8 @@ Separating_line_group_engraver::acknowledge_item (Grob_info i) Pointer_group_interface::add_grob (it, ly_symbol2scm ("left-items"), break_item_); - if (int i = last_spacings_.note_spacings_.size ()) - { - for (; i--;) - Pointer_group_interface::add_grob (last_spacings_.note_spacings_[i], - ly_symbol2scm ("right-items"), - break_item_); - } - else if (last_spacings_.staff_spacing_) + if (!last_spacings_.note_spacings_.size () + && last_spacings_.staff_spacing_) { SCM ri = last_spacings_.staff_spacing_->get_object ("right-items"); Grob_array *ga = unsmob_grob_array (ri); diff --git a/lily/separation-item.cc b/lily/separation-item.cc index 0867007375..c0536b6ce3 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "separation-item.hh" diff --git a/lily/sequential-iterator.cc b/lily/sequential-iterator.cc index db8eb5865e..8679bcbbe1 100644 --- a/lily/sequential-iterator.cc +++ b/lily/sequential-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "sequential-iterator.hh" diff --git a/lily/side-position-interface.cc b/lily/side-position-interface.cc index 96751edf2c..0d56fe1868 100644 --- a/lily/side-position-interface.cc +++ b/lily/side-position-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "side-position-interface.hh" diff --git a/lily/simple-closure.cc b/lily/simple-closure.cc index cea6584972..f473b30e47 100644 --- a/lily/simple-closure.cc +++ b/lily/simple-closure.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "simple-closure.hh" diff --git a/lily/simple-music-iterator.cc b/lily/simple-music-iterator.cc index b2d686b32e..05fcc293f4 100644 --- a/lily/simple-music-iterator.cc +++ b/lily/simple-music-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "simple-music-iterator.hh" diff --git a/lily/simple-spacer-scheme.cc b/lily/simple-spacer-scheme.cc index 1ffe464fc2..24b6d1c763 100644 --- a/lily/simple-spacer-scheme.cc +++ b/lily/simple-spacer-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include diff --git a/lily/simple-spacer.cc b/lily/simple-spacer.cc index ffc4bfcbfc..5f28644ba6 100644 --- a/lily/simple-spacer.cc +++ b/lily/simple-spacer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys TODO: - add support for different stretch/shrink constants? @@ -356,29 +356,6 @@ next_spaceable_column (vector const &list, vsize starting) return 0; } -static void -get_column_spring (Grob *this_col, Grob *next_col, Real *ideal, Real *inv_hooke) -{ - Spring_smob *spring = 0; - - for (SCM s = this_col->get_object ("ideal-distances"); - !spring && scm_is_pair (s); - s = scm_cdr (s)) - { - Spring_smob *sp = unsmob_spring (scm_car (s)); - - if (sp->other_ == next_col) - spring = sp; - } - - if (!spring) - programming_error (_f ("No spring between column %d and next one", - Paper_column::get_rank (this_col))); - - *ideal = (spring) ? spring->distance_ : 5.0; - *inv_hooke = (spring) ? spring->inverse_strength_ : 1.0; -} - static Column_description get_column_description (vector const &cols, vsize col_index, bool line_starter) { @@ -389,10 +366,10 @@ get_column_description (vector const &cols, vsize col_index, bool line_st Column_description description; Grob *next_col = next_spaceable_column (cols, col_index); if (next_col) - get_column_spring (col, next_col, &description.ideal_, &description.inverse_hooke_); + Spaceable_grob::get_spring (col, next_col, &description.ideal_, &description.inverse_hooke_); Grob *end_col = dynamic_cast (cols[col_index+1])->find_prebroken_piece (LEFT); if (end_col) - get_column_spring (col, end_col, &description.end_ideal_, &description.end_inverse_hooke_); + Spaceable_grob::get_spring (col, end_col, &description.end_ideal_, &description.end_inverse_hooke_); for (SCM s = Spaceable_grob::get_minimum_distances (col); scm_is_pair (s); s = scm_cdr (s)) @@ -432,7 +409,7 @@ get_line_forces (vector const &columns, breaks.clear (); breaks.push_back (0); cols.push_back (Column_description ()); - for (vsize i = 1; i < non_loose.size () - 1; i++) + for (vsize i = 1; i + 1 < non_loose.size (); i++) { if (Paper_column::is_breakable (non_loose[i])) breaks.push_back (cols.size ()); @@ -442,7 +419,7 @@ get_line_forces (vector const &columns, breaks.push_back (cols.size ()); force.resize (breaks.size () * breaks.size (), infinity_f); - for (vsize b = 0; b < breaks.size () - 1; b++) + for (vsize b = 0; b + 1 < breaks.size (); b++) { cols[breaks[b]] = get_column_description (non_loose, breaks[b], true); vsize st = breaks[b]; @@ -507,7 +484,7 @@ get_line_configuration (vector const &columns, Column_x_positions ret; ret.cols_.push_back (dynamic_cast (columns[0])->find_prebroken_piece (RIGHT)); - for (vsize i = 1; i < columns.size () - 1; i++) + for (vsize i = 1; i + 1 < columns.size (); i++) { if (is_loose (columns[i])) ret.loose_cols_.push_back (columns[i]); @@ -518,7 +495,7 @@ get_line_configuration (vector const &columns, /* since we've already put our line-ending column in the column list, we can ignore the end_XXX_ fields of our column_description */ - for (vsize i = 0; i < ret.cols_.size () - 1; i++) + for (vsize i = 0; i + 1 < ret.cols_.size (); i++) { cols.push_back (get_column_description (ret.cols_, i, i == 0)); spacer.add_spring (cols[i].ideal_, cols[i].inverse_hooke_); @@ -551,7 +528,7 @@ get_line_configuration (vector const &columns, /* Check if breaking constraints are met. */ - for (vsize i = 1; i < ret.cols_.size () - 1; i++) + for (vsize i = 1; i + 1 < ret.cols_.size (); i++) { SCM p = ret.cols_[i]->get_property ("line-break-permission"); if (p == ly_symbol2scm ("force")) diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc index 62d3b3c200..badc98d65b 100644 --- a/lily/simultaneous-music-iterator.cc +++ b/lily/simultaneous-music-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "simultaneous-music-iterator.hh" diff --git a/lily/skyline.cc b/lily/skyline.cc index 6b53a62ef8..b729e5312b 100644 --- a/lily/skyline.cc +++ b/lily/skyline.cc @@ -2,10 +2,11 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #include "skyline.hh" +#include #include "ly-smobs.icc" @@ -41,6 +42,31 @@ but the distance routine does. */ +/* + FIXME: + + * Consider to use + + typedef list Skyline; + struct Skyline_point + { + Real x; + Drul_array ys; + }; + + this is a cleaner representation, as it doesn't duplicate the X, and + doesn't need bogus buildings at infinity --hwn. + + + * All the messing around with EPS is very fishy. There are no + complicated numerical algorithms involved, so EPS should not be + necessary. + + --hwn + + + */ + #define EPS 1e-10 static inline bool @@ -84,11 +110,11 @@ Skyline::print () const } bool -Skyline::is_legal_skyline () const +is_legal_skyline (list const &buildings) { list::const_iterator i; Real last_x = -infinity_f; - for (i = buildings_.begin (); i != buildings_.end (); i++) + for (i = buildings.begin (); i != buildings.end (); i++) { if (i->iv_[LEFT] != last_x) return false; @@ -159,7 +185,7 @@ Building::print () const } Real -Building::intersection (Building const &other) const +Building::intersection_x (Building const &other) const { return (y_intercept_ - other.y_intercept_) / (other.slope_ - slope_); } @@ -213,9 +239,16 @@ skyline_trailing_part (list *sky, Real x) bool Building::conceals_beginning (Building const &other) const { - if (approx_equal (intersection (other), iv_[LEFT]) || approx_equal (height_[LEFT], other.height_[LEFT])) - return slope_ > other.slope_; - return height_[LEFT] > other.height_[LEFT]; + bool w = false; + Real h = other.height (iv_[LEFT]); + if (approx_equal (height_[LEFT], h)) + w = slope_ > other.slope_; + else if (height_[LEFT] > h) + w = true; + else + w = false; + + return w; } bool @@ -254,7 +287,7 @@ Skyline::internal_merge_skyline (list *s1, list *s2, if (approx_greater_than (s2_start_height, s1_start_height)) end = s2->front ().iv_[LEFT]; else if (approx_greater_than (s2_end_height, s1_end_height)) - end = b.intersection (s2->front ()); + end = b.intersection_x (s2->front ()); end = min (end, b.iv_[RIGHT]); b.leading_part (end); @@ -293,34 +326,78 @@ single_skyline (Building b, Real horizon_padding, list *const ret) -infinity_f, b.iv_[LEFT])); } -void -Skyline::internal_build_skyline (list *buildings, list *const result) +/* remove a non-overlapping set of buildings from BUILDINGS and build a skyline + out of them */ +static list +non_overlapping_skyline (list *const buildings) +{ + list result; + Real last_end = -infinity_f; + list::iterator i = buildings->begin (); + while (i != buildings->end ()) + { + if (approx_less_than (i->iv_[LEFT], last_end)) + { + i++; + continue; + } + + if (approx_greater_than (i->iv_[LEFT], last_end)) + result.push_back (Building (last_end, -infinity_f, -infinity_f, i->iv_[LEFT])); + else + i->iv_[LEFT] = last_end; + + last_end = i->iv_[RIGHT]; + list::iterator j = i; + i++; + result.splice (result.end (), *buildings, j); + } + if (last_end < infinity_f) + result.push_back (Building (last_end, -infinity_f, -infinity_f, infinity_f)); + assert (is_legal_skyline (result)); + return result; +} + +list +Skyline::internal_build_skyline (list *buildings) { vsize size = buildings->size (); if (size == 0) { - empty_skyline (result); - return; + list result; + empty_skyline (&result); + return result; } else if (size == 1) { - single_skyline (buildings->front (), 0, result); - return; + list result; + single_skyline (buildings->front (), 0, &result); + return result; } - list right_half; - list::iterator i = buildings->begin (); - - for (vsize s = 0; s < size/2; s++) - i++; - right_half.splice (right_half.end (), *buildings, i, buildings->end ()); + deque > partials; + buildings->sort (); + while (!buildings->empty ()) + partials.push_back (non_overlapping_skyline (buildings)); - list right; - list left; - internal_build_skyline (&right_half, &right); - internal_build_skyline (buildings, &left); - internal_merge_skyline (&right, &left, result); + /* we'd like to say while (partials->size () > 1) but that's O(n). + Instead, we exit in the middle of the loop */ + while (!partials.empty ()) + { + list merged; + list one = partials.front (); + partials.pop_front (); + if (partials.empty ()) + return one; + + list two = partials.front (); + partials.pop_front (); + internal_merge_skyline (&one, &two, &merged); + partials.push_back (merged); + } + assert (0); + return list (); } Skyline::Skyline () @@ -374,8 +451,8 @@ Skyline::Skyline (vector const &boxes, Real horizon_padding, Axis horizon_a } } - internal_build_skyline (&bldgs, &buildings_); - assert (is_legal_skyline ()); + buildings_ = internal_build_skyline (&bldgs); + assert (is_legal_skyline (buildings_)); } Skyline::Skyline (Box const &b, Real horizon_padding, Axis horizon_axis, Direction sky) @@ -394,7 +471,7 @@ Skyline::merge (Skyline const &other) list my_bld; my_bld.splice (my_bld.begin (), buildings_); internal_merge_skyline (&other_bld, &my_bld, &buildings_); - assert (is_legal_skyline ()); + assert (is_legal_skyline (buildings_)); } void @@ -406,7 +483,7 @@ Skyline::insert (Box const &b, Real horizon_padding, Axis a) my_bld.splice (my_bld.begin (), buildings_); single_skyline (Building (b, 0, a, sky_), horizon_padding, &other_bld); internal_merge_skyline (&other_bld, &my_bld, &buildings_); - assert (is_legal_skyline ()); + assert (is_legal_skyline (buildings_)); } void @@ -419,7 +496,7 @@ Skyline::raise (Real r) i->height_[RIGHT] += sky_ * r; i->y_intercept_ += sky_ * r; } - assert (is_legal_skyline ()); + assert (is_legal_skyline (buildings_)); } void @@ -574,6 +651,7 @@ IMPLEMENT_DEFAULT_EQUAL_P (Skyline_pair); SCM Skyline::mark_smob (SCM) { + ASSERT_LIVE_IS_ALLOWED(); return SCM_EOL; } diff --git a/lily/slash-repeat-engraver.cc b/lily/slash-repeat-engraver.cc index 7df5c317a0..7d71b677a1 100644 --- a/lily/slash-repeat-engraver.cc +++ b/lily/slash-repeat-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys , Erik Sandberg + (c) 2000--2007 Han-Wen Nienhuys , Erik Sandberg */ diff --git a/lily/slur-configuration.cc b/lily/slur-configuration.cc index b1ce277351..6e44c9d6db 100644 --- a/lily/slur-configuration.cc +++ b/lily/slur-configuration.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "slur-configuration.hh" diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index 64853b8284..8f7a752548 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/slur-performer.cc b/lily/slur-performer.cc index 6c8cd3a192..20d5d5a4fc 100644 --- a/lily/slur-performer.cc +++ b/lily/slur-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Jan Nieuwenhuizen + (c) 1996--2007 Jan Nieuwenhuizen */ #include "performer.hh" diff --git a/lily/slur-score-parameters.cc b/lily/slur-score-parameters.cc index 0a1a09f6f2..a399e4d9d0 100644 --- a/lily/slur-score-parameters.cc +++ b/lily/slur-score-parameters.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index 4e6167a650..6dc6b5718a 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -66,38 +66,6 @@ Slur_score_state::~Slur_score_state () junk_pointers (configurations_); } -Real -broken_trend_y (Slur_score_state const &state, Direction hdir) -{ - /* A broken slur should maintain the same vertical trend - the unbroken slur would have had. */ - Real by = 0.0; - if (Spanner *mother = dynamic_cast (state.slur_->original ())) - { - Grob *neighbor = mother->broken_neighbor (hdir); - if (!neighbor) - return by; - - - Spanner *common_mother - = dynamic_cast (state.common_[Y_AXIS]->original ()); - int common_k - = broken_spanner_index (dynamic_cast (state.common_[Y_AXIS])); - int common_j = common_k + hdir; - - if (common_j < 0 || vsize (common_j) >= common_mother->broken_intos_.size ()) - return by; - - Grob *common_next_system = common_mother->broken_intos_[common_j]; - - SCM last_point = scm_car (scm_last_pair (neighbor->get_property ("control-points"))); - - return scm_to_double (scm_cdr (last_point)) - + neighbor->relative_coordinate (common_next_system, Y_AXIS); - } - return by; -} - /* copy slur dir forwards across line break. */ @@ -394,7 +362,7 @@ Slur_score_state::get_best_curve () } slur_->set_property ("quant-score", - scm_makfrom0str (total.c_str ())); + ly_string2scm (total)); } #endif @@ -815,34 +783,21 @@ Slur_score_state::get_extra_encompass_infos () const if (Accidental_interface::has_interface (g)) { penalty = parameters_.accidental_collision_; - /* Begin copy accidental.cc */ - bool parens = false; - if (to_boolean (g->get_property ("cautionary"))) - { - SCM cstyle = g->get_property ("cautionary-style"); - parens = ly_is_equal (cstyle, ly_symbol2scm ("parentheses")); - } - SCM accs = g->get_property ("accidentals"); + Rational alt = ly_scm2rational (g->get_property ("alteration")); SCM scm_style = g->get_property ("style"); if (!scm_is_symbol (scm_style) - && !parens - && scm_ilength (accs) == 1) + && !to_boolean (g->get_property ("parenthesized")) + && !to_boolean (g->get_property ("restore-first"))) { /* End copy accidental.cc */ - switch (scm_to_int (scm_car (accs))) - { - case FLAT: - case DOUBLE_FLAT: - xp = LEFT; - break; - case SHARP: - xp = 0.5 * dir_; - break; - case NATURAL: - xp = -dir_; - break; - } + if (alt == FLAT_ALTERATION + || alt == DOUBLE_FLAT_ALTERATION) + xp = LEFT; + else if (alt == SHARP_ALTERATION) + xp = 0.5 * dir_; + else if (alt == NATURAL_ALTERATION) + xp = -dir_; } } diff --git a/lily/slur.cc b/lily/slur.cc index 88697c2bb1..1f9e605fb9 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -153,7 +153,7 @@ Slur::print (SCM smob) Stencil tm = *unsmob_stencil (Text_interface::interpret_markup (me->layout ()->self_scm (), properties, quant_score)); - a.add_at_edge (Y_AXIS, get_grob_direction (me), tm, 1.0, 0); + a.add_at_edge (Y_AXIS, get_grob_direction (me), tm, 1.0); } #endif diff --git a/lily/smobs.cc b/lily/smobs.cc index fff178ccb2..34b5bb36ab 100644 --- a/lily/smobs.cc +++ b/lily/smobs.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "smobs.hh" diff --git a/lily/source-file.cc b/lily/source-file.cc index 4415e8dad7..879653dff0 100644 --- a/lily/source-file.cc +++ b/lily/source-file.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ @@ -138,9 +138,9 @@ Source_file::Source_file (string filename_string) void Source_file::init_port () { - SCM str = scm_makfrom0str (c_str ()); + SCM str = scm_from_locale_string (c_str ()); str_port_ = scm_mkstrport (SCM_INUM0, str, SCM_OPN | SCM_RDNG, __FUNCTION__); - scm_set_port_filename_x (str_port_, scm_makfrom0str (name_.c_str ())); + scm_set_port_filename_x (str_port_, ly_string2scm (name_)); } diff --git a/lily/source.cc b/lily/source.cc index 811b4dd681..e69de29bb2 100644 --- a/lily/source.cc +++ b/lily/source.cc @@ -1,66 +0,0 @@ -/* - source.cc -- implement Sources - - source file of the LilyPond music typesetter - - (c) 1997--2006 Han-Wen Nienhuys -*/ - -#include "source.hh" - -#include "source-file.hh" -#include "file-path.hh" - -Sources::Sources () -{ - path_ = 0; -} - - -Sources::Sources (Sources const &) -{ - assert (false); -} - - -void -Sources::set_path (File_path *f) -{ - path_ = f; -} - -/** - open a file - - File_string the file to be opened, name might be changed if it is - found in a search path. -*/ -Source_file * -Sources::get_file (string *file_string) //UGH -{ - if (*file_string != "-" && path_) - { - string file_string_o = path_->find (*file_string); - if ((file_string_o == "") && (*file_string != "")) - return 0; - *file_string = file_string_o; - } - Source_file *f = new Source_file (*file_string); - add (f); - return f; -} - -void -Sources::add (Source_file *sourcefile) -{ - sourcefiles_.push_back (sourcefile); -} - -Sources::~Sources () -{ - for (vsize i = 0; i < sourcefiles_.size (); i++) - { - sourcefiles_[i]->unprotect (); - } -} - diff --git a/lily/sources.cc b/lily/sources.cc new file mode 100644 index 0000000000..bfd3e0d295 --- /dev/null +++ b/lily/sources.cc @@ -0,0 +1,66 @@ +/* + source.cc -- implement Sources + + source file of the LilyPond music typesetter + + (c) 1997--2007 Han-Wen Nienhuys +*/ + +#include "sources.hh" + +#include "source-file.hh" +#include "file-path.hh" + +Sources::Sources () +{ + path_ = 0; +} + + +Sources::Sources (Sources const &) +{ + assert (false); +} + + +void +Sources::set_path (File_path *f) +{ + path_ = f; +} + +/** + open a file + + File_string the file to be opened, name might be changed if it is + found in a search path. +*/ +Source_file * +Sources::get_file (string *file_string) //UGH +{ + if (*file_string != "-" && path_) + { + string file_string_o = path_->find (*file_string); + if ((file_string_o == "") && (*file_string != "")) + return 0; + *file_string = file_string_o; + } + Source_file *f = new Source_file (*file_string); + add (f); + return f; +} + +void +Sources::add (Source_file *sourcefile) +{ + sourcefiles_.push_back (sourcefile); +} + +Sources::~Sources () +{ + for (vsize i = 0; i < sourcefiles_.size (); i++) + { + sourcefiles_[i]->unprotect (); + } +} + diff --git a/lily/spaceable-grob.cc b/lily/spaceable-grob.cc index 679c2bcb19..ad6e7d6181 100644 --- a/lily/spaceable-grob.cc +++ b/lily/spaceable-grob.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "spaceable-grob.hh" @@ -15,6 +15,7 @@ #include "pointer-group-interface.hh" #include "grob.hh" #include "paper-column.hh" +#include "international.hh" SCM Spaceable_grob::get_minimum_distances (Grob *me) @@ -98,28 +99,30 @@ Spaceable_grob::add_spring (Grob *me, Grob *other, } void -Spaceable_grob::get_spring (Grob *me, Grob *other, Real *dist, Real *inv_strength) +Spaceable_grob::get_spring (Grob *this_col, Grob *next_col, Real *dist, Real *inv_strength) { - for (SCM s = me->get_object ("ideal-distances"); - scm_is_pair (s); s = scm_cdr (s)) + Spring_smob *spring = 0; + + for (SCM s = this_col->get_object ("ideal-distances"); + !spring && scm_is_pair (s); + s = scm_cdr (s)) { - Spring_smob *spring = unsmob_spring (scm_car (s)); - if (spring && spring->other_ == other) - { - *dist = spring->distance_; - *inv_strength = spring->inverse_strength_; - } + Spring_smob *sp = unsmob_spring (scm_car (s)); + + if (sp && sp->other_ == next_col) + spring = sp; } -} -void -Spaceable_grob::remove_interface (Grob *me) -{ - me->set_object ("minimum-distances", SCM_EOL); - me->set_object ("spacing-wishes", SCM_EOL); - me->set_object ("ideal-distances", SCM_EOL); + if (!spring) + programming_error (_f ("No spring between column %d and next one", + Paper_column::get_rank (this_col))); + + *dist = (spring) ? spring->distance_ : 5.0; + *inv_strength = (spring) ? spring->inverse_strength_ : 1.0; } + + ADD_INTERFACE (Spaceable_grob, "A layout object that takes part in the spacing problem. ", @@ -132,5 +135,7 @@ ADD_INTERFACE (Spaceable_grob, "measure-length " "minimum-distances " "right-neighbors " - "spacing-wishes"); + "spacing-wishes " + + ); diff --git a/lily/spacing-basic.cc b/lily/spacing-basic.cc index 835801d94a..63d97f2652 100644 --- a/lily/spacing-basic.cc +++ b/lily/spacing-basic.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "spacing-spanner.hh" @@ -164,7 +164,6 @@ Spacing_spanner::note_spacing (Grob *me, Grob *lc, Grob *rc, { Spacing_options grace_opts; grace_opts.init_from_grob (grace_spacing); - bool bla; dist = grace_opts.get_duration_space (delta_t.grace_part_, &bla); } diff --git a/lily/spacing-determine-loose-columns.cc b/lily/spacing-determine-loose-columns.cc index 8f6355b26e..920e66bd03 100644 --- a/lily/spacing-determine-loose-columns.cc +++ b/lily/spacing-determine-loose-columns.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "staff-spacing.hh" @@ -39,7 +39,7 @@ is_loose_column (Grob *l, Grob *col, Grob *r, Spacing_options const *options) if ((options->float_nonmusical_columns_ - ||options->float_grace_columns_) + || options->float_grace_columns_) && Paper_column::when_mom (col).grace_part_) { return true; @@ -104,9 +104,6 @@ is_loose_column (Grob *l, Grob *col, Grob *r, Spacing_options const *options) return false; /* - A rather hairy check, but we really only want to move around - clefs. (anything else?) - in any case, we don't want to move bar lines. */ extract_grob_set (col, "elements", elts); @@ -120,9 +117,6 @@ is_loose_column (Grob *l, Grob *col, Grob *r, Spacing_options const *options) { Grob *h = gelts[j]; - /* - ugh. -- fix staff-bar name? - */ if (h && h->get_property ("break-align-symbol") == ly_symbol2scm ("staff-bar")) return false; } @@ -200,8 +194,9 @@ Spacing_spanner::set_distances_for_loose_col (Grob *me, Grob *c, between. */ void -Spacing_spanner::prune_loose_columns (Grob *me, vector *cols, - Spacing_options const *options) +Spacing_spanner::prune_loose_columns (Grob *me, + vector *cols, + Spacing_options *options) { vector newcols; @@ -209,7 +204,7 @@ Spacing_spanner::prune_loose_columns (Grob *me, vector *cols, { Grob *c = cols->at (i); - bool loose = (i > 0 && i < cols->size () - 1) + bool loose = (i > 0 && i + 1 < cols->size ()) && is_loose_column (cols->at (i - 1), c, cols->at (i + 1), options); if (loose) @@ -234,8 +229,20 @@ Spacing_spanner::prune_loose_columns (Grob *me, vector *cols, } else { + Grob *min_item = 0; + int min_rank = INT_MAX; + for (vsize j = 0; j < right_items.size (); j ++) + { + int rank = dynamic_cast (right_items[j])->get_column ()->get_rank (); + if (rank < min_rank) + { + min_item = right_items[j]; + min_rank = rank; + } + } + c->set_object ("between-cols", scm_cons (lns, - right_items[0]->self_scm ())); + min_item->self_scm ())); /* Set distance constraints for loose columns @@ -264,7 +271,7 @@ Spacing_spanner::set_explicit_neighbor_columns (vector const &cols) { SCM right_neighbors = Grob_array::make_array (); Grob_array *rn_arr = unsmob_grob_array (right_neighbors); - int min_rank = 100000; // inf. + int min_rank = INT_MAX; extract_grob_set (cols[i], "spacing-wishes", wishes); for (vsize k = wishes.size (); k--;) @@ -338,8 +345,6 @@ Spacing_spanner::set_implicit_neighbor_columns (vector const &cols) if (!Paper_column::is_breakable (it) && !Paper_column::is_musical (it)) continue; - // it->breakable || it->musical - /* sloppy with typing left/right-neighbors should take list, but paper-column found instead. */ @@ -352,7 +357,7 @@ Spacing_spanner::set_implicit_neighbor_columns (vector const &cols) cols[i]->set_object ("left-neighbors", ga_scm); } extract_grob_set (cols[i], "right-neighbors", rns); - if (rns.empty () && i < cols.size () - 1) + if (rns.empty () && i + 1 < cols.size ()) { SCM ga_scm = Grob_array::make_array (); Grob_array *ga = unsmob_grob_array (ga_scm); diff --git a/lily/spacing-engraver.cc b/lily/spacing-engraver.cc index 81d5f2c829..ad49a345b6 100644 --- a/lily/spacing-engraver.cc +++ b/lily/spacing-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/spacing-loose-columns.cc b/lily/spacing-loose-columns.cc index 94bc552e6f..3a69e26802 100644 --- a/lily/spacing-loose-columns.cc +++ b/lily/spacing-loose-columns.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "system.hh" @@ -66,16 +66,41 @@ set_loose_columns (System *which, Column_x_positions const *posns) loose = right = re->get_column (); } - if (!right->get_system ()) + if (right->get_system ()) + ; /* do nothing */ + else if (right->find_prebroken_piece (LEFT) + && right->find_prebroken_piece (LEFT)->get_system () == which) right = right->find_prebroken_piece (LEFT); + else if (Paper_column::get_rank (which->get_bound (RIGHT)) < Paper_column::get_rank (right)) + + right = which->get_bound (RIGHT); + else + { + clique.back ()->programming_error ("Loose column does not have right side to attach to."); + System *base_system = dynamic_cast (which->original ()); + int j = Paper_column::get_rank (clique.back ()) + 1; + int end_rank = Paper_column::get_rank (which->get_bound (RIGHT)); + extract_grob_set (base_system, "columns", base_cols); + for (; j < end_rank; j++) + { + if (base_cols[j]->get_system () == which) + right = dynamic_cast ((Grob*)base_cols[j]); + } + } + + if (!right) + { + programming_error ("Can't attach loose column sensibly. Attaching to end of system."); + right = which->get_bound (RIGHT); + } Grob *common = right->common_refpoint (left, X_AXIS); clique.push_back (right); vector clique_spacing; clique_spacing.push_back (0.0); - for (vsize j = 1; j < clique.size () - 1; j ++) + for (vsize j = 1; j + 1 < clique.size (); j ++) { Grob *clique_col = clique[j]; diff --git a/lily/spacing-options.cc b/lily/spacing-options.cc index c0e11fa62c..8c7b7c3ca5 100644 --- a/lily/spacing-options.cc +++ b/lily/spacing-options.cc @@ -3,14 +3,16 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ #include "spacing-options.hh" +#include "spacing-spanner.hh" #include "grob.hh" #include "misc.hh" #include "moment.hh" +#include "spanner.hh" void Spacing_options::init_from_grob (Grob *me) @@ -33,7 +35,6 @@ Spacing_options::init_from_grob (Grob *me) global_shortest_ = shortest_dur.main_part_; else global_shortest_ = shortest_dur.grace_part_; - } Spacing_options::Spacing_options () diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index a196c3990f..50848ecc59 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "spacing-spanner.hh" @@ -29,14 +29,15 @@ using namespace std; #include "warn.hh" vector -Spacing_spanner::get_columns (Spanner *me) +Spacing_spanner::get_columns (Grob *me_grob) { - vector all (get_root_system (me)->columns ()); + Spanner *me = dynamic_cast (me_grob); + vector all (get_root_system (me)->used_columns ()); vsize start = binary_search (all, (Grob*)me->get_bound (LEFT), &Paper_column::less_than); vsize end = binary_search (all, (Grob*) me->get_bound (RIGHT), - &Paper_column::less_than); - + &Paper_column::less_than); + all = vector::vector (all.begin () + start, all.begin () + end + 1); return all; @@ -51,15 +52,14 @@ Spacing_spanner::set_springs (SCM smob) /* can't use get_system() ? --hwn. */ - vector all (get_columns (me)); - set_explicit_neighbor_columns (all); - Spacing_options options; options.init_from_grob (me); + vector cols = Spacing_spanner::get_columns (me); + set_explicit_neighbor_columns (cols); - prune_loose_columns (me, &all, &options); - set_implicit_neighbor_columns (all); - generate_springs (me, all, &options); + prune_loose_columns (me, &cols, &options); + set_implicit_neighbor_columns (cols); + generate_springs (me, cols, &options); return SCM_UNSPECIFIED; } @@ -223,7 +223,7 @@ Spacing_spanner::generate_springs (Grob *me, for (vsize i = 0; i < cols.size (); i++) { Paper_column *col = dynamic_cast (cols[i]); - Paper_column *next = (i < cols.size()-1) ? dynamic_cast (cols[i+1]) : 0; + Paper_column *next = (i + 1 < cols.size ()) ? dynamic_cast (cols[i+1]) : 0; if (i > 0) generate_pair_spacing (me, prev, col, next, options); @@ -318,6 +318,9 @@ Spacing_spanner::musical_column_spacing (Grob *me, if (!Paper_column::is_musical (right_col)) { + /* + reconsider this: breaks with wide marks/tempos/etc. + */ Real left_col_stick_out = robust_relative_extent (left_col, left_col, X_AXIS)[RIGHT]; compound_fixed_note_space = max (left_col_stick_out, options->increment_); @@ -394,6 +397,42 @@ Spacing_spanner::musical_column_spacing (Grob *me, Spaceable_grob::add_spring (left_col, right_col, distance, inverse_strength); } +/* + Check if COL fills the whole measure. + */ +bool +Spacing_spanner::fills_measure (Grob *me, Item *left, Item *col) +{ + System *sys = get_root_system (me); + Item *next = sys->column (col->get_column()->get_rank () + 1); + if (!next) + return false; + + if (Paper_column::is_musical (next) + || Paper_column::is_musical (left) + || !Paper_column::is_musical (col) + || !Paper_column::is_used (next)) + return false; + + Moment dt = + Paper_column::when_mom (next) - Paper_column::when_mom (col); + + Moment *len = unsmob_moment (left->get_property ("measure-length")); + if (!len) + return false; + + /* + Don't check for exact measure length, since ending measures are + often shortened due to pickups. + */ + if (dt.main_part_ > len->main_part_ / Rational (2) + && (next->is_broken () + || next->break_status_dir ())) + return true; + + return false; +} + /* Read hints from L and generate springs. */ @@ -421,13 +460,12 @@ Spacing_spanner::breakable_column_spacing (Grob *me, Item *l, Item *r, if (!spacing_grob || !Staff_spacing::has_interface (spacing_grob)) continue; - Real space; - Real fixed_space; + Real space = 0.; + Real fixed_space = 0.; /* column for the left one settings should be ok due automatic pointer munging. - */ assert (spacing_grob->get_column () == l); @@ -474,19 +512,19 @@ Spacing_spanner::breakable_column_spacing (Grob *me, Item *l, Item *r, } + if (Paper_column::is_musical (r) + && l->break_status_dir () == CENTER + && fills_measure (me, l, r)) + { + compound_space += 1.0; + } + if (options->stretch_uniformly_ && l->break_status_dir () != RIGHT) compound_fixed = 0.0; assert (!isinf (compound_space)); compound_space = max (compound_space, compound_fixed); - /* - There used to be code that changed spacing depending on - raggedright setting. Ugh. - - Do it more cleanly, or rename the property. - - */ Real inverse_strength = (compound_space - compound_fixed); Real distance = compound_space; Spaceable_grob::add_spring (l, r, distance, inverse_strength); @@ -517,9 +555,3 @@ ADD_INTERFACE (Spacing_spanner, ); -ADD_INTERFACE (Spacing_interface, - "Something to do with line breaking and spacing. " - "Kill this one after determining line breaks.", - - ""); - diff --git a/lily/span-arpeggio-engraver.cc b/lily/span-arpeggio-engraver.cc index 4a81d5bdba..a465b7da11 100644 --- a/lily/span-arpeggio-engraver.cc +++ b/lily/span-arpeggio-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ diff --git a/lily/span-bar-engraver.cc b/lily/span-bar-engraver.cc index 7e28a6bc41..a1618a2756 100644 --- a/lily/span-bar-engraver.cc +++ b/lily/span-bar-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "bar-line.hh" diff --git a/lily/span-bar.cc b/lily/span-bar.cc index 4566d73f77..072b110e7a 100644 --- a/lily/span-bar.cc +++ b/lily/span-bar.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "span-bar.hh" @@ -185,7 +185,7 @@ Span_bar::calc_glyph_name (SCM smob) else if (type == ":|:") type = ".|."; - return scm_makfrom0str (type.c_str ()); + return ly_string2scm (type); } Interval diff --git a/lily/span-dynamic-performer.cc b/lily/span-dynamic-performer.cc deleted file mode 100644 index e5938f0852..0000000000 --- a/lily/span-dynamic-performer.cc +++ /dev/null @@ -1,186 +0,0 @@ -/* - span-dynamic-performer.cc -- implement Span_dynamic_performer - - source file of the GNU LilyPond music typesetter - - (c) 2000--2006 Jan Nieuwenhuizen -*/ - -#include "performer.hh" - -#include "audio-item.hh" -#include "international.hh" -#include "stream-event.hh" - -#include "translator.icc" - -/* - TODO: fold this into 1 engraver: \< and \> should also stop when - absdyn is encountered. -*/ -struct Audio_dynamic_tuple -{ - Audio_dynamic *audio_; - Moment mom_; -}; - -/** - perform span-dynamics -*/ -class Span_dynamic_performer : public Performer -{ -public: - TRANSLATOR_DECLARATIONS (Span_dynamic_performer); - -protected: - virtual void acknowledge_audio_element (Audio_element_info); - void process_music (); - void stop_translation_timestep (); - - DECLARE_TRANSLATOR_LISTENER (decrescendo); - DECLARE_TRANSLATOR_LISTENER (crescendo); -private: - Audio_dynamic *audio_; - Real last_volume_; - Stream_event *span_start_event_; - Drul_array span_events_; - vector dynamic_tuples_; - vector finished_dynamic_tuples_; - Direction dir_; - Direction finished_dir_; -}; - -Span_dynamic_performer::Span_dynamic_performer () -{ - span_events_[START] = 0; - span_events_[STOP] = 0; - span_start_event_ = 0; - audio_ = 0; - last_volume_ = 0; -} - -void -Span_dynamic_performer::acknowledge_audio_element (Audio_element_info i) -{ - if (Audio_dynamic *d = dynamic_cast (i.elem_)) - last_volume_ = d->volume_; -} - -void -Span_dynamic_performer::process_music () -{ - if (span_start_event_ || span_events_[START]) - { - audio_ = new Audio_dynamic (0); - Audio_element_info info (audio_, span_events_[START] - ? span_events_[START] - : span_events_[STOP]); - announce_element (info); - Audio_dynamic_tuple a = { audio_, now_mom () }; - dynamic_tuples_.push_back (a); - } - - if (span_events_[STOP]) - { - if (!span_start_event_) - { - span_events_[STOP]->origin ()->warning (_ ("cannot find start of (de)crescendo")); - span_events_[STOP] = 0; - } - else - { - finished_dir_ = dir_; - finished_dynamic_tuples_ = dynamic_tuples_; - } - dynamic_tuples_.clear (); - span_start_event_ = 0; - } - - if (span_events_[START]) - { - dir_ = (span_events_[START]->in_event_class ("crescendo-event")) - ? RIGHT : LEFT; - span_start_event_ = span_events_[START]; - - dynamic_tuples_.clear (); - Audio_dynamic_tuple a = { audio_, now_mom () }; - dynamic_tuples_.push_back (a); - } - - if (span_events_[STOP]) - finished_dynamic_tuples_.back ().audio_->volume_ = last_volume_; - - if (span_events_[START]) - dynamic_tuples_[0].audio_->volume_ = last_volume_; - - span_events_[START] = 0; - span_events_[STOP] = 0; -} - -void -Span_dynamic_performer::stop_translation_timestep () -{ - if (finished_dynamic_tuples_.size () > 1) - { - Real start_volume = finished_dynamic_tuples_[0].audio_->volume_; - Real dv = finished_dynamic_tuples_.back ().audio_->volume_ - - start_volume; - /* - urg. - Catch and fix the case of: - - | | - x| x| - f cresc. -- -- -- -- -- pp - - Actually, we should provide a non-displayed dynamic/volume setting, - to set volume to 'ff' just before the pp. - */ - if (!dv || sign (dv) != finished_dir_) - { - // urg. 20%: about two volume steps - dv = (Real)finished_dir_ * 0.2; - if (!start_volume) - start_volume = finished_dynamic_tuples_.back ().audio_->volume_ - - dv; - } - Moment start_mom = finished_dynamic_tuples_[0].mom_; - Moment dt = finished_dynamic_tuples_.back ().mom_ - start_mom; - for (vsize i = 0; i < finished_dynamic_tuples_.size (); i++) - { - Audio_dynamic_tuple *a = &finished_dynamic_tuples_[i]; - Real volume = start_volume + dv * (Real) (a->mom_ - start_mom).main_part_ - / (Real)dt.main_part_; - a->audio_->volume_ = volume; - } - finished_dynamic_tuples_.clear (); - } - - if (audio_) - { - audio_ = 0; - } - - span_events_[STOP] = 0; - span_events_[START] = 0; -} - -IMPLEMENT_TRANSLATOR_LISTENER (Span_dynamic_performer, decrescendo); -void -Span_dynamic_performer::listen_decrescendo (Stream_event *r) -{ - Direction d = to_dir (r->get_property ("span-direction")); - span_events_[d] = r; -} - -IMPLEMENT_TRANSLATOR_LISTENER (Span_dynamic_performer, crescendo); -void -Span_dynamic_performer::listen_crescendo (Stream_event *r) -{ - Direction d = to_dir (r->get_property ("span-direction")); - span_events_[d] = r; -} - -ADD_TRANSLATOR (Span_dynamic_performer, - "", "", - "", ""); diff --git a/lily/spanner-break-forbid-engraver.cc b/lily/spanner-break-forbid-engraver.cc new file mode 100644 index 0000000000..41d061c058 --- /dev/null +++ b/lily/spanner-break-forbid-engraver.cc @@ -0,0 +1,68 @@ +/* + spanner-break-forbid-engraver.cc -- implement Spanner_break_forbid_engraver + + source file of the GNU LilyPond music typesetter + + (c) 2007 Han-Wen Nienhuys +*/ + + + +#include "engraver.hh" +#include "international.hh" +#include "spanner.hh" +#include "stream-event.hh" +#include "warn.hh" +#include "context.hh" + +#include "translator.icc" + +class Spanner_break_forbid_engraver : public Engraver +{ + TRANSLATOR_DECLARATIONS (Spanner_break_forbid_engraver); + vector running_spanners_; +protected: + DECLARE_ACKNOWLEDGER (unbreakable_spanner); + DECLARE_END_ACKNOWLEDGER (unbreakable_spanner); + + void process_music (); +}; + + +void +Spanner_break_forbid_engraver::process_music () +{ + if (running_spanners_.size ()) + { + context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T); + } +} + +void +Spanner_break_forbid_engraver::acknowledge_end_unbreakable_spanner (Grob_info gi) +{ + vector::iterator i = find (running_spanners_.begin (), running_spanners_.end (), + gi.spanner ()); + if (i != running_spanners_.end ()) + running_spanners_.erase (i); +} + +void +Spanner_break_forbid_engraver::acknowledge_unbreakable_spanner (Grob_info gi) +{ + if (!to_boolean (gi.grob ()->get_property ("breakable"))) + running_spanners_.push_back (gi.spanner ()); +} + +Spanner_break_forbid_engraver::Spanner_break_forbid_engraver () +{ +} + + +ADD_END_ACKNOWLEDGER (Spanner_break_forbid_engraver, unbreakable_spanner); +ADD_ACKNOWLEDGER (Spanner_break_forbid_engraver, unbreakable_spanner); +ADD_TRANSLATOR (Spanner_break_forbid_engraver, + /* doc */ "Forbid breaks in certain spanners", + /* create */ "", + /* read */ "", + /* write */ ""); diff --git a/lily/spanner-scheme.cc b/lily/spanner-scheme.cc new file mode 100644 index 0000000000..e5a33e0c4b --- /dev/null +++ b/lily/spanner-scheme.cc @@ -0,0 +1,47 @@ +/* + spanner-scheme.cc -- implement Spanner bindings. + + source file of the GNU LilyPond music typesetter + + (c) 2007 Han-Wen Nienhuys + +*/ + +#include "spanner.hh" +#include "item.hh" + +LY_DEFINE (ly_spanner_get_bound, "ly:spanner-bound", + 2, 0, 0, (SCM slur, SCM dir), + "Get one of the bounds of @var{spanner}. @var{dir} is @code{-1} " + "for left, and @code{1} for right.") +{ + Spanner *sl = dynamic_cast (unsmob_grob (slur)); + SCM_ASSERT_TYPE (sl, slur, SCM_ARG1, __FUNCTION__, "spanner grob"); + SCM_ASSERT_TYPE (is_direction (dir), slur, SCM_ARG2, __FUNCTION__, "dir"); + return sl->get_bound (to_dir (dir))->self_scm (); +} + +/* TODO: maybe we should return a vector -- random access is more + logical for this list? */ +LY_DEFINE (ly_spanner_broken_into, "ly:spanner-broken-into", + 1, 0, 0, (SCM spanner), + "Return broken-into list for @var{spanner}.") +{ + Spanner *me = dynamic_cast (unsmob_grob (spanner)); + SCM_ASSERT_TYPE (me, spanner, SCM_ARG1, __FUNCTION__, "spanner"); + + SCM s = SCM_EOL; + for (vsize i = me->broken_intos_.size (); i--;) + s = scm_cons (me->broken_intos_[i]->self_scm (), s); + return s; +} + +LY_DEFINE (ly_spanner_p, "ly:spanner?", + 1, 0, 0, (SCM g), + "Is @var{g} a spanner object?") +{ + Grob *me = unsmob_grob (g); + bool b = dynamic_cast (me); + + return ly_bool2scm (b); +} diff --git a/lily/spanner.cc b/lily/spanner.cc index f4909f53b2..e1fe55efe1 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #include "pointer-group-interface.hh" @@ -16,9 +16,9 @@ #include "warn.hh" Grob * -Spanner::clone (int count) const +Spanner::clone () const { - return new Spanner (*this, count); + return new Spanner (*this); } void @@ -64,7 +64,7 @@ Spanner::do_break_processing () programming_error ("no broken bound"); else if (bound->get_system ()) { - Spanner *span = dynamic_cast (clone (broken_intos_.size ())); + Spanner *span = dynamic_cast (clone ()); span->set_bound (LEFT, bound); span->set_bound (RIGHT, bound); @@ -102,7 +102,7 @@ Spanner::do_break_processing () continue; } - Spanner *span = dynamic_cast (clone (broken_intos_.size ())); + Spanner *span = dynamic_cast (clone ()); span->set_bound (LEFT, bounds[LEFT]); span->set_bound (RIGHT, bounds[RIGHT]); @@ -196,16 +196,16 @@ Spanner::set_bound (Direction d, Grob *s) Pointer_group_interface::add_grob (i, ly_symbol2scm ("bounded-by-me"), this); } -Spanner::Spanner (SCM s, Object_key const *key) - : Grob (s, key) +Spanner::Spanner (SCM s) + : Grob (s) { break_index_ = 0; spanned_drul_[LEFT] = 0; spanned_drul_[RIGHT] = 0; } -Spanner::Spanner (Spanner const &s, int count) - : Grob (s, count) +Spanner::Spanner (Spanner const &s) + : Grob (s) { spanned_drul_[LEFT] = spanned_drul_[RIGHT] = 0; } diff --git a/lily/spring-smob.cc b/lily/spring-smob.cc index 1ab1507fbf..a57f5029f2 100644 --- a/lily/spring-smob.cc +++ b/lily/spring-smob.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "spring.hh" diff --git a/lily/staff-collecting-engraver.cc b/lily/staff-collecting-engraver.cc index af4d5e04f0..72b1bf51cd 100644 --- a/lily/staff-collecting-engraver.cc +++ b/lily/staff-collecting-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #include "staff-symbol.hh" diff --git a/lily/staff-performer.cc b/lily/staff-performer.cc index 7c982d0546..1359af5e01 100644 --- a/lily/staff-performer.cc +++ b/lily/staff-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "warn.hh" diff --git a/lily/staff-spacing.cc b/lily/staff-spacing.cc index f89113187e..79e7028644 100644 --- a/lily/staff-spacing.cc +++ b/lily/staff-spacing.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #include "staff-spacing.hh" @@ -30,65 +30,100 @@ void Staff_spacing::next_note_correction (Grob *me, Grob *g, Interval bar_size, + Real current_space, Real current_fixed, Real *space, - Real *fix) + Real *fix, + int *wish_count) { - (void)space; - + (void) current_fixed; if (!g || !Note_column::has_interface (g)) return ; Item *col = dynamic_cast (g)->get_column (); - Real max_corr = max (0., (- g->extent (col, X_AXIS)[LEFT])); + Real left_stickout_correction = max (0., (- g->extent (col, X_AXIS)[LEFT])); + + /* staff space -> positions */ + bar_size *= 2; /* Duh. If this gets out of hand, we should invent something more generic. */ - if (Grob *a = Note_column::accidentals (g)) + Grob *accs = Note_column::accidentals (g); + if (accs) { Interval v; - if (Accidental_placement::has_interface (a)) - v = Accidental_placement::get_relevant_accidental_extent (a, col, me); + if (Accidental_placement::has_interface (accs)) + v = Accidental_placement::get_relevant_accidental_extent (accs, col, me); else - v = a->extent (col, X_AXIS); - - max_corr = max (max_corr, (- v[LEFT])); + v = accs->extent (col, X_AXIS); + + left_stickout_correction = max (left_stickout_correction, (- v[LEFT])); } - if (Grob *a = unsmob_grob (g->get_object ("arpeggio"))) - max_corr = max (max_corr, - a->extent (col, X_AXIS)[LEFT]); + Grob *arpeggio = unsmob_grob (g->get_object ("arpeggio")); + if (arpeggio) + left_stickout_correction = max (left_stickout_correction, - arpeggio->extent (col, X_AXIS)[LEFT]); + /* Let's decrease the space a little if the problem is not located after a barline. */ if (bar_size.is_empty ()) - max_corr *= 0.75; - - if (!bar_size.is_empty ()) - if (Grob *stem = Note_column::get_stem (g)) - { - Direction d = get_grob_direction (stem); - if (d == DOWN) - { - Real stem_start = Stem::head_positions (stem) [DOWN]; - Real stem_end = Stem::stem_end_position (stem); - Interval stem_posns (min (stem_start, stem_end), - max (stem_end, stem_start)); - - stem_posns.intersect (bar_size); - - Real corr = min (abs (stem_posns.length () / 7.0), 1.0); - corr *= robust_scm2double (me->get_property ("stem-spacing-correction"), 1); - - if (d != DOWN) - corr = 0.0; - max_corr = max (max_corr, corr); - } - } - - *fix += max_corr; -} + left_stickout_correction *= 0.75; + + /* + We want 0.3 ss before the sticking-out object. + + current_fixed/2 is our guess at (right side of left object + 0.3) + */ + left_stickout_correction += current_fixed/2 - current_space; + left_stickout_correction = max (left_stickout_correction, 0.0); + + Real optical_corr = 0.0; + Grob *stem = Note_column::get_stem (g); + if (!bar_size.is_empty () + && !arpeggio + && !accs + && stem) + { + Direction d = get_grob_direction (stem); + if (Stem::is_normal_stem (stem) && d == DOWN) + { + + /* + can't look at stem-end-position, since that triggers + beam slope computations. + */ + Real stem_start = Stem::head_positions (stem) [d]; + Real stem_end = stem_start + + d * robust_scm2double (stem->get_property ("length"), 7); + + Interval stem_posns (min (stem_start, stem_end), + max (stem_end, stem_start)); + + stem_posns.intersect (bar_size); + + optical_corr = min (abs (stem_posns.length () / 7.0), 1.0); + optical_corr *= robust_scm2double (me->get_property ("stem-spacing-correction"), 1); + } + } + + + Real correction = optical_corr + left_stickout_correction; + if (correction) + { + (*wish_count) ++; + + /* + This minute adjustments don't make sense for widely spaced scores. + Hence, we need to keep the stretchable (that is, space - fix) + distance equal. + */ + *space += correction; + *fix += correction; + } +} /* Y-positions that are covered by BAR_GROB, in the case that it is a barline. */ @@ -107,7 +142,7 @@ Staff_spacing::bar_y_positions (Grob *bar_grob) || glyph_string.substr (0, 1) == ".") { Grob *common = bar_grob->common_refpoint (staff_sym, Y_AXIS); - Interval bar_size = bar_grob->extent (common, Y_AXIS); + bar_size = bar_grob->extent (common, Y_AXIS); bar_size *= 1.0 / Staff_symbol_referencer::staff_space (bar_grob); } } @@ -121,8 +156,10 @@ Staff_spacing::bar_y_positions (Grob *bar_grob) pointers to the separation-items, not the note-columns or note-spacings. */ + void Staff_spacing::next_notes_correction (Grob *me, Grob *last_grob, + Real current_space, Real current_fixed, Real *compound_space, Real *compound_fixed ) { @@ -133,33 +170,42 @@ Staff_spacing::next_notes_correction (Grob *me, Grob *last_grob, *compound_fixed = 0.0; *compound_space = 0.0; int wish_count = 0; - + for (vsize i = right_items.size (); i--;) { Grob *g = right_items[i]; - - Real space = 0.0; - Real fixed = 0.0; - - next_note_correction (me, g, bar_size, &space, &fixed); - - *compound_space += space; - *compound_fixed += fixed; - wish_count ++; - - extract_grob_set (g, "elements", elts); - for (vsize j = elts.size (); j--;) + if (Note_column::has_interface (right_items[i])) { + Grob *g = right_items[i]; + Real space = 0.0; Real fixed = 0.0; - next_note_correction (me, elts[j], bar_size, &space, &fixed); - *compound_fixed += fixed; + + next_note_correction (me, g, bar_size, + current_space, current_fixed, + &space, &fixed, &wish_count); + *compound_space += space; - wish_count ++; + *compound_fixed += fixed; + } + else + { + extract_grob_set (g, "elements", elts); + for (vsize j = elts.size (); j--;) + { + Real space = 0.0; + Real fixed = 0.0; + next_note_correction (me, elts[j], bar_size, + current_space, current_fixed, + &space, &fixed, + &wish_count); + *compound_fixed += fixed; + *compound_space += space; + } } } - - if (wish_count) + + if (wish_count > 1) { *compound_space /= wish_count; *compound_fixed /= wish_count; @@ -255,8 +301,11 @@ Staff_spacing::get_spacing_params (Grob *me, Real *space, Real *fixed) *fixed = *space; } - Real correction_fixed, correction_space; - next_notes_correction (me, last_grob, &correction_space, &correction_fixed ); + Real correction_fixed = 0.0; + Real correction_space = 0.0; + next_notes_correction (me, last_grob, + *space, *fixed, + &correction_space, &correction_fixed ); *space += correction_space; *fixed += correction_fixed; } diff --git a/lily/staff-symbol-engraver.cc b/lily/staff-symbol-engraver.cc index fe053011fc..0b0d212a90 100644 --- a/lily/staff-symbol-engraver.cc +++ b/lily/staff-symbol-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/staff-symbol-referencer-scheme.cc b/lily/staff-symbol-referencer-scheme.cc index da8491e8fa..ec12f1639b 100644 --- a/lily/staff-symbol-referencer-scheme.cc +++ b/lily/staff-symbol-referencer-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "grob.hh" diff --git a/lily/staff-symbol-referencer.cc b/lily/staff-symbol-referencer.cc index 7fe0bf3131..53637c86e5 100644 --- a/lily/staff-symbol-referencer.cc +++ b/lily/staff-symbol-referencer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "staff-symbol-referencer.hh" @@ -92,6 +92,25 @@ Staff_symbol_referencer::get_position (Grob *me) return robust_scm2double (me->get_property ("staff-position"), p); } + +Interval +Staff_symbol_referencer::extent_in_staff (Grob *me) +{ + Grob *st = get_staff_symbol (me); + Grob *c = st ? me->common_refpoint (st, Y_AXIS) : 0; + + Interval retval; + if (st && c) + { + retval = me->extent (c, Y_AXIS) + - st->relative_coordinate (c, Y_AXIS); + } + + return retval; +} + + + int Staff_symbol_referencer::get_rounded_position (Grob *me) { @@ -172,3 +191,4 @@ ADD_INTERFACE (Staff_symbol_referencer, /* properties */ "staff-position"); + diff --git a/lily/staff-symbol.cc b/lily/staff-symbol.cc index f999346753..9f6b1915e8 100644 --- a/lily/staff-symbol.cc +++ b/lily/staff-symbol.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "staff-symbol.hh" diff --git a/lily/stanza-number-align-engraver.cc b/lily/stanza-number-align-engraver.cc index 94e726864f..2e862dc269 100644 --- a/lily/stanza-number-align-engraver.cc +++ b/lily/stanza-number-align-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "context.hh" @@ -60,9 +60,10 @@ Stanza_number_align_engraver::stop_translation_timestep () ADD_ACKNOWLEDGER (Stanza_number_align_engraver, lyric_syllable); ADD_ACKNOWLEDGER (Stanza_number_align_engraver, stanza_number); + ADD_TRANSLATOR (Stanza_number_align_engraver, "This engraver ensures that stanza numbers are neatly aligned. ", "", - " ", + "", ""); diff --git a/lily/stanza-number-engraver.cc b/lily/stanza-number-engraver.cc index bdf4ae5db2..41759ff12a 100644 --- a/lily/stanza-number-engraver.cc +++ b/lily/stanza-number-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys , Glen Prideaux + (c) 2000--2007 Han-Wen Nienhuys , Glen Prideaux */ #include "engraver.hh" diff --git a/lily/stem-engraver.cc b/lily/stem-engraver.cc index 1dfef14b73..164bedff36 100644 --- a/lily/stem-engraver.cc +++ b/lily/stem-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index e607fda1b0..c8fbd63d18 100644 --- a/lily/stem-tremolo.cc +++ b/lily/stem-tremolo.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "stem-tremolo.hh" @@ -33,8 +33,8 @@ Stem_tremolo::calc_slope (SCM smob) if (is_number_pair (s)) dy = - scm_to_double (scm_car (s)) + scm_to_double (scm_cdr (s)); - Grob *s2 = Beam::last_visible_stem (beam); - Grob *s1 = Beam::first_visible_stem (beam); + Grob *s2 = Beam::last_normal_stem (beam); + Grob *s1 = Beam::first_normal_stem (beam); Grob *common = s1->common_refpoint (s2, X_AXIS); Real dx = s2->relative_coordinate (common, X_AXIS) - @@ -147,8 +147,14 @@ Stem_tremolo::height (SCM smob) return ly_interval2scm (s1.extent (Y_AXIS)); } +Real +Stem_tremolo::vertical_length (Grob *me) +{ + return untranslated_stencil (me, 0.35).extent (Y_AXIS).length (); +} + Stencil -Stem_tremolo::translated_stencil (Grob *me, Real slope) +Stem_tremolo::untranslated_stencil (Grob *me, Real slope) { Grob *stem = unsmob_grob (me->get_object ("stem")); if (!stem) @@ -157,30 +163,37 @@ Stem_tremolo::translated_stencil (Grob *me, Real slope) return Stencil(); } - Spanner *beam = Stem::get_beam (stem); Direction stemdir = get_grob_direction (stem); - if (stemdir == 0) + if (!stemdir) stemdir = UP; bool whole_note = Stem::duration_log (stem) <= 0; - Real beam_translation = get_beam_translation (me); - /* for a whole note, we position relative to the notehead, so we want the stencil aligned on the flag closest to the head */ Direction stencil_dir = whole_note ? -stemdir : stemdir; - Stencil mol = raw_stencil (me, slope, stencil_dir); + return raw_stencil (me, slope, stencil_dir); +} - Interval mol_ext = mol.extent (Y_AXIS); - Real ss = Staff_symbol_referencer::staff_space (me); + +Stencil +Stem_tremolo::translated_stencil (Grob *me, Real slope) +{ + Stencil mol = untranslated_stencil (me, slope); - // ugh, rather calc from Stem_tremolo_req - int beam_count = beam ? (Stem::beam_multiplicity (stem).length () + 1) : 0; + Grob *stem = unsmob_grob (me->get_object ("stem")); + if (!stem) + return Stencil (); + + Direction stemdir = get_grob_direction (stem); + if (stemdir == 0) + stemdir = UP; - Real beamthickness = 0.0; - SCM sbt = (beam) ? beam->get_property ("thickness") : SCM_EOL; - if (scm_is_number (sbt)) - beamthickness = scm_to_double (sbt) * ss; + Spanner *beam = Stem::get_beam (stem); + Real beam_translation = get_beam_translation (me); + + int beam_count = beam ? (Stem::beam_multiplicity (stem).length () + 1) : 0; + Real ss = Staff_symbol_referencer::staff_space (me); Real end_y = Stem::stem_end_position (stem) * ss / 2 @@ -192,6 +205,8 @@ Stem_tremolo::translated_stencil (Grob *me, Real slope) if (stemdir == UP) end_y -= stemdir * beam_translation * 0.5; } + + bool whole_note = Stem::duration_log (stem) <= 0; if (whole_note) { /* we shouldn't position relative to the end of the stem since the stem diff --git a/lily/stem.cc b/lily/stem.cc index fc21f2d6b9..7c369e4bb0 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys Jan Nieuwenhuizen TODO: This is way too hairy @@ -154,7 +154,7 @@ Stem::last_head (Grob *me) Drul_array Stem::extremal_heads (Grob *me) { - const int inf = 1000000; + const int inf = INT_MAX; Drul_array extpos; extpos[DOWN] = inf; extpos[UP] = -inf; @@ -214,28 +214,36 @@ Stem::add_head (Grob *me, Grob *n) bool Stem::is_invisible (Grob *me) { - Real stemlet_length = robust_scm2double (me->get_property ("stemlet-length"), - 0.0); + return !is_normal_stem (me) + && (robust_scm2double (me->get_property ("stemlet-length"), + 0.0) == 0.0); +} + - return !((head_count (me) - || stemlet_length > 0.0) - && scm_to_int (me->get_property ("duration-log")) >= 1); +bool +Stem::is_normal_stem (Grob *me) +{ + return head_count (me) && scm_to_int (me->get_property ("duration-log")) >= 1; } + MAKE_SCHEME_CALLBACK (Stem, pure_height, 3) SCM Stem::pure_height (SCM smob, SCM start, SCM end) { (void) start; (void) end; - - + Grob *me = unsmob_grob (smob); + Interval iv; + + if (!is_normal_stem (me)) + return ly_interval2scm (iv); + Real ss = Staff_symbol_referencer::staff_space (me); Real len = scm_to_double (calc_length (smob)) * ss / 2; Direction dir = get_grob_direction (me); - Interval iv; Interval hp = head_positions (me); if (dir == UP) iv = Interval (0, len); @@ -317,7 +325,7 @@ Stem::calc_stem_end_position (SCM smob) return scm_from_double (stem_end); } - +/* Length is in half-spaces (or: positions) here. */ MAKE_SCHEME_CALLBACK (Stem, calc_length, 1) SCM Stem::calc_length (SCM smob) @@ -364,8 +372,7 @@ Stem::calc_length (SCM smob) (Stem_tremolo::raw_stencil () looks at the beam.) --hwn */ Real minlen = 1.0 - + 2 * t_flag->extent (t_flag, Y_AXIS).length () - / ss; + + 2 * Stem_tremolo::vertical_length (t_flag) / ss; /* We don't want to add the whole extent of the flag because the trem and the flag can overlap partly. beam_translation gives a good @@ -794,8 +801,16 @@ SCM Stem::offset_callback (SCM smob) { Grob *me = unsmob_grob (smob); - Real r = 0.0; + extract_grob_set (me, "rests", rests); + if (rests.size ()) + { + Grob *rest = rests.back (); + Real r = rest->extent (rest, X_AXIS).center (); + return scm_from_double (r); + } + + if (Grob *f = first_head (me)) { Interval head_wid = f->extent (f, X_AXIS); @@ -808,7 +823,7 @@ Stem::offset_callback (SCM smob) Direction d = get_grob_direction (me); Real real_attach = head_wid.linear_combination (d * attach); - r = real_attach; + Real r = real_attach; /* If not centered: correct for stem thickness. */ if (attach) @@ -816,17 +831,11 @@ Stem::offset_callback (SCM smob) Real rule_thick = thickness (me); r += -d * rule_thick * 0.5; } + return scm_from_double (r); } - else - { - extract_grob_set (me, "rests", rests); - if (rests.size ()) - { - Grob *rest = rests.back (); - r = rest->extent (rest, X_AXIS).center (); - } - } - return scm_from_double (r); + + programming_error ("Weird stem."); + return scm_from_double (0.0); } Spanner * diff --git a/lily/stencil-expression.cc b/lily/stencil-expression.cc index 6e51ec9b9d..64ad13d95f 100644 --- a/lily/stencil-expression.cc +++ b/lily/stencil-expression.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "stencil.hh" diff --git a/lily/stencil-interpret.cc b/lily/stencil-interpret.cc index e438734536..f6deee072e 100644 --- a/lily/stencil-interpret.cc +++ b/lily/stencil-interpret.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "stencil.hh" diff --git a/lily/stencil-scheme.cc b/lily/stencil-scheme.cc index 2669e14808..6ef0e191fd 100644 --- a/lily/stencil-scheme.cc +++ b/lily/stencil-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ @@ -85,58 +85,6 @@ LY_DEFINE (ly_stencil_empty_p, "ly:stencil-empty?", return scm_from_bool (s->is_empty ()); } -LY_DEFINE (ly_stencil_origin, "ly:stencil-origin", - 2, 0, 0, (SCM stil, SCM axis), - "Return a pair of numbers signifying the origin @var{stil} in " - "@var{axis} direction (0 or 1 for x and y axis respectively).") -{ - Stencil *s = unsmob_stencil (stil); - SCM_ASSERT_TYPE (s, stil, SCM_ARG1, __FUNCTION__, "stencil"); - SCM_ASSERT_TYPE (is_axis (axis), axis, SCM_ARG2, __FUNCTION__, "axis"); - - return scm_from_double (s->origin ()[Axis (scm_to_int (axis))]); -} - -LY_DEFINE (ly_stencil_moved_to_edge, "ly:stencil-moved-to-edge", - 4, 2, 0, (SCM first, SCM axis, SCM direction, SCM second, - SCM padding, SCM minimum), - "Similar to @code{ly:stencil-combine-edge}, but returns " - "@var{second} positioned to be next to @var{first}. ") -{ - /* - C&P from combine-at-edge. - */ - Stencil *s1 = unsmob_stencil (first); - Stencil *s2 = unsmob_stencil (second); - Stencil first_stencil; - - SCM_ASSERT_TYPE (is_axis (axis), axis, SCM_ARG3, __FUNCTION__, "axis"); - SCM_ASSERT_TYPE (is_direction (direction), direction, SCM_ARG4, __FUNCTION__, "dir"); - - Real p = 0.0; - if (padding != SCM_UNDEFINED) - { - SCM_ASSERT_TYPE (scm_is_number (padding), padding, SCM_ARG5, __FUNCTION__, "number"); - p = scm_to_double (padding); - } - Real m = 0.0; - if (minimum != SCM_UNDEFINED) - { - SCM_ASSERT_TYPE (scm_is_number (minimum), minimum, SCM_ARG6, __FUNCTION__, "number"); - m = scm_to_double (minimum); - } - - if (s1) - first_stencil = *s1; - - if (s2) - return first_stencil.moved_to_edge (Axis (scm_to_int (axis)), - Direction (scm_to_int (direction)), - *s2, p, m).smobbed_copy (); - else - return Stencil ().smobbed_copy (); -} - LY_DEFINE (ly_stencil_combine_at_edge, "ly:stencil-combine-at-edge", 4, 2, 0, (SCM first, SCM axis, SCM direction, SCM second, @@ -179,7 +127,7 @@ LY_DEFINE (ly_stencil_combine_at_edge, "ly:stencil-combine-at-edge", if (s2) result.add_at_edge (Axis (scm_to_int (axis)), - Direction (scm_to_int (direction)), *s2, p, m); + Direction (scm_to_int (direction)), *s2, p); return result.smobbed_copy (); } diff --git a/lily/stencil.cc b/lily/stencil.cc index 329c5cae61..b88b0c8bde 100644 --- a/lily/stencil.cc +++ b/lily/stencil.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "stencil.hh" @@ -72,11 +72,6 @@ Stencil::extent_box () const { return dim_; } -Offset -Stencil::origin () const -{ - return origin_; -} /* * Rotate this stencil around the point [x, y] @@ -143,7 +138,6 @@ Stencil::translate (Offset o) expr_, SCM_UNDEFINED); if (!is_empty ()) dim_.translate (o); - origin_ += o; } void @@ -186,13 +180,9 @@ Stencil::align_to (Axis a, Real x) translate_axis (-i.linear_combination (x), a); } -/* FIXME: unintuitive naming, you would expect *this to be moved. - Kept (keeping?) API for compat with add_at_edge (). - - What is PADDING, what is MINIMUM, exactly? */ -Stencil -Stencil::moved_to_edge (Axis a, Direction d, Stencil const &s, - Real padding, Real minimum) const +/* See scheme Function. */ +void +Stencil::add_at_edge (Axis a, Direction d, Stencil const &s, Real padding) { Interval my_extent = dim_[a]; Interval i (s.extent (a)); @@ -210,20 +200,7 @@ Stencil::moved_to_edge (Axis a, Direction d, Stencil const &s, Stencil toadd (s); toadd.translate_axis (offset, a); - - if (minimum > 0 && d * (-origin ()[a] + toadd.origin ()[a]) < minimum) - toadd.translate_axis (-toadd.origin ()[a] - + origin ()[a] + d * minimum, a); - - return toadd; -} - -/* See scheme Function. */ -void -Stencil::add_at_edge (Axis a, Direction d, Stencil const &s, Real padding, - Real minimum) -{ - add_stencil (moved_to_edge (a, d, s, padding, minimum)); + add_stencil (toadd); } Stencil @@ -237,3 +214,12 @@ Stencil::in_color (Real r, Real g, Real b) const expr ())); return new_stencil; } + +/* convenience */ +Stencil +Stencil::translated (Offset z) const +{ + Stencil s (*this); + s.translate (z); + return s; +} diff --git a/lily/stream-event-scheme.cc b/lily/stream-event-scheme.cc index 46f19b2ee2..e6e4fb7dc6 100644 --- a/lily/stream-event-scheme.cc +++ b/lily/stream-event-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Erik Sandberg + (c) 2006--2007 Erik Sandberg */ #include "stream-event.hh" diff --git a/lily/string-number-engraver.cc b/lily/string-number-engraver.cc index d4aac87bc7..9164fe74bf 100644 --- a/lily/string-number-engraver.cc +++ b/lily/string-number-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/sustain-pedal.cc b/lily/sustain-pedal.cc index 2e6cd91bd9..8056ea89a2 100644 --- a/lily/sustain-pedal.cc +++ b/lily/sustain-pedal.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "grob.hh" #include "stencil.hh" @@ -58,7 +58,7 @@ Sustain_pedal::print (SCM smob) idx += string (&text.c_str ()[i], 1); Stencil m = Font_interface::get_default_font (e)->find_by_name (idx); if (!m.is_empty ()) - mol.add_at_edge (X_AXIS, RIGHT, m, 0, 0); + mol.add_at_edge (X_AXIS, RIGHT, m, 0); } return mol.smobbed_copy (); diff --git a/lily/swallow-engraver.cc b/lily/swallow-engraver.cc index e86e004c1a..7d0c851ab0 100644 --- a/lily/swallow-engraver.cc +++ b/lily/swallow-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/swallow-perf.cc b/lily/swallow-perf.cc index 595b2a99d6..2bd42dfa5c 100644 --- a/lily/swallow-perf.cc +++ b/lily/swallow-perf.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "performer.hh" diff --git a/lily/system-start-delimiter-engraver.cc b/lily/system-start-delimiter-engraver.cc index 5c28a61231..479618addc 100644 --- a/lily/system-start-delimiter-engraver.cc +++ b/lily/system-start-delimiter-engraver.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -96,8 +96,7 @@ Bracket_nesting_group::add_support (Grob *g) Bracket_nesting_group::~Bracket_nesting_group () { - for (vsize i = 0 ; i < children_.size (); i++) - delete children_[i]; + junk_pointers (children_); } void @@ -212,6 +211,8 @@ System_start_delimiter_engraver::finalize () nesting_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); nesting_->set_nesting_support (0); + + delete nesting_; } } diff --git a/lily/system-start-delimiter.cc b/lily/system-start-delimiter.cc index c3fe50250a..206ccd84db 100644 --- a/lily/system-start-delimiter.cc +++ b/lily/system-start-delimiter.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "system-start-delimiter.hh" @@ -42,7 +42,7 @@ System_start_delimiter::staff_bracket (Grob *me, Real height) Stencil bracket = Lookup::filled_box (box); Direction d = DOWN; do - bracket.add_at_edge (Y_AXIS, d, tips[d], -overlap, 0.0); + bracket.add_at_edge (Y_AXIS, d, tips[d], -overlap); while (flip (&d) != DOWN); bracket = Stencil (box, bracket.expr ()); diff --git a/lily/system-start-text.cc b/lily/system-start-text.cc index a0a90b06c3..00795d22d7 100644 --- a/lily/system-start-text.cc +++ b/lily/system-start-text.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2007 Han-Wen Nienhuys */ diff --git a/lily/system.cc b/lily/system.cc index 3ca397976b..06ac09e39a 100644 --- a/lily/system.cc +++ b/lily/system.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #include "system.hh" @@ -21,13 +21,13 @@ #include "pointer-group-interface.hh" #include "spacing-interface.hh" #include "staff-symbol-referencer.hh" -#include "tweak-registration.hh" #include "warn.hh" +#include "lookup.hh" extern bool debug_skylines; -System::System (System const &src, int count) - : Spanner (src, count) +System::System (System const &src) + : Spanner (src) { all_elements_ = 0; pscore_ = 0; @@ -35,8 +35,8 @@ System::System (System const &src, int count) init_elements (); } -System::System (SCM s, Object_key const *key) - : Spanner (s, key) +System::System (SCM s) + : Spanner (s) { all_elements_ = 0; rank_ = 0; @@ -53,9 +53,9 @@ System::init_elements () } Grob * -System::clone (int index) const +System::clone () const { - return new System (*this, index); + return new System (*this); } int @@ -209,7 +209,7 @@ System::break_into_pieces (vector const &breaking) { for (vsize i = 0; i < breaking.size (); i++) { - System *system = dynamic_cast (clone (broken_intos_.size ())); + System *system = dynamic_cast (clone ()); system->rank_ = broken_intos_.size (); vector c (breaking[i].cols_); @@ -251,21 +251,6 @@ System::add_column (Paper_column *p) Axis_group_interface::add_element (this, p); } -void -apply_tweaks (Grob *g, bool broken) -{ - if (bool (g->original ()) == broken) - { - SCM tweaks = global_registry_->get_tweaks (g); - for (SCM s = tweaks; scm_is_pair (s); s = scm_cdr (s)) - { - SCM proc = scm_caar (s); - SCM rest = scm_cdar (s); - scm_apply_1 (proc, g->self_scm (), rest); - } - } -} - void System::pre_processing () { @@ -285,9 +270,6 @@ System::pre_processing () fixup_refpoints (all_elements_->array ()); - for (vsize i = 0; i < all_elements_->size (); i++) - apply_tweaks (all_elements_->grob (i), false); - for (vsize i = 0; i < all_elements_->size (); i++) { Grob *g = all_elements_->grob (i); @@ -308,7 +290,6 @@ System::post_processing () { Grob *g = all_elements_->grob (i); - apply_tweaks (g, true); (void) g->get_property ("after-line-breaking"); } @@ -399,8 +380,8 @@ System::get_paper_system () exprs)); if (debug_skylines) { - sys_stencil.add_stencil (points_to_line_stencil (skylines_[UP].to_points ()).in_color (255, 0, 0)); - sys_stencil.add_stencil (points_to_line_stencil (skylines_[DOWN].to_points ()).in_color (0, 255, 0)); + sys_stencil.add_stencil (Lookup::points_to_line_stencil (0.1, skylines_[UP].to_points ()).in_color (255, 0, 0)); + sys_stencil.add_stencil (Lookup::points_to_line_stencil (0.1, skylines_[DOWN].to_points ()).in_color (0, 255, 0)); } Grob *left_bound = this->get_bound (LEFT); @@ -445,9 +426,7 @@ System::broken_col_range (Item const *left, Item const *right) const extract_grob_set (this, "columns", cols); - vsize i = binary_search (cols, (Grob *) left, - Paper_column::less_than); - + vsize i = Paper_column::get_rank (left); int end_rank = Paper_column::get_rank (right); if (i < cols.size ()) i++; @@ -468,7 +447,7 @@ System::broken_col_range (Item const *left, Item const *right) const /** Return all columns, but filter out any unused columns , since they might disrupt the spacing problem. */ vector -System::columns () const +System::used_columns () const { extract_grob_set (this, "columns", ro_columns); @@ -490,6 +469,16 @@ System::columns () const return columns; } +Paper_column * +System::column (vsize which) const +{ + extract_grob_set (this, "columns", columns); + if (which >= columns.size ()) + return 0; + + return dynamic_cast (columns[which]); +} + Paper_score* System::paper_score () const { diff --git a/lily/tab-harmonic-engraver.cc b/lily/tab-harmonic-engraver.cc index 385b462cbd..900f4816dc 100644 --- a/lily/tab-harmonic-engraver.cc +++ b/lily/tab-harmonic-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/tab-note-heads-engraver.cc b/lily/tab-note-heads-engraver.cc index 4fb33f7199..dd82a1d8e1 100644 --- a/lily/tab-note-heads-engraver.cc +++ b/lily/tab-note-heads-engraver.cc @@ -1,7 +1,7 @@ /* tab-note-heads-engraver.cc -- part of GNU LilyPond - (c) 2002--2006 Han-Wen Nienhuys, Jean-Baptiste Lamy , + (c) 2002--2007 Han-Wen Nienhuys, Jean-Baptiste Lamy , */ #include diff --git a/lily/tab-staff-symbol-engraver.cc b/lily/tab-staff-symbol-engraver.cc index ccdbf8683e..03ba28679c 100644 --- a/lily/tab-staff-symbol-engraver.cc +++ b/lily/tab-staff-symbol-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/template5.cc b/lily/template5.cc index fcc788fd14..cbf4f3bfa7 100644 --- a/lily/template5.cc +++ b/lily/template5.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "moment.hh" diff --git a/lily/tempo-performer.cc b/lily/tempo-performer.cc index 34864274c4..ac537891ef 100644 --- a/lily/tempo-performer.cc +++ b/lily/tempo-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "performer.hh" diff --git a/lily/text-engraver.cc b/lily/text-engraver.cc index a3447ccce7..c53cf3e4fd 100644 --- a/lily/text-engraver.cc +++ b/lily/text-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "directional-element-interface.hh" diff --git a/lily/text-interface.cc b/lily/text-interface.cc index ebfae5ae5b..eec8150894 100644 --- a/lily/text-interface.cc +++ b/lily/text-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys Jan Nieuwenhuizen */ diff --git a/lily/text-metrics.cc b/lily/text-metrics.cc index 164d0062ff..05b17fdfcc 100644 --- a/lily/text-metrics.cc +++ b/lily/text-metrics.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2007 Han-Wen Nienhuys */ #include "dimensions.hh" @@ -31,7 +31,7 @@ lookup_tex_text_dimension (Font_metric *font, SCM text) if (text_dimension_hash_tab) { scm_hash_ref (text_dimension_hash_tab, - scm_makfrom0str (key_str.c_str ()), + ly_string2scm (key_str), SCM_BOOL_F); } if (scm_is_pair (val)) diff --git a/lily/text-spanner-engraver.cc b/lily/text-spanner-engraver.cc index 2994956a50..2ab6dd8d48 100644 --- a/lily/text-spanner-engraver.cc +++ b/lily/text-spanner-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ #include "engraver.hh" diff --git a/lily/text-spanner.cc b/lily/text-spanner.cc index ea4c25074a..e98ae0f7df 100644 --- a/lily/text-spanner.cc +++ b/lily/text-spanner.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen Revised over good by Han-Wen. */ diff --git a/lily/tie-column.cc b/lily/tie-column.cc index dd54530e81..9eefbbf8ee 100644 --- a/lily/tie-column.cc +++ b/lily/tie-column.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "tie-column.hh" @@ -79,14 +79,6 @@ Tie_column::calc_positioning_done (SCM smob) if (!ties.size ()) return SCM_BOOL_T; - if (ties.size() == 1) - { - /* - Already handled by standard mechanisms. - */ - return SCM_BOOL_T; - } - vector_sort (ties, Tie::less); Tie_formatting_problem problem; @@ -96,34 +88,19 @@ Tie_column::calc_positioning_done (SCM smob) problem.set_manual_tie_configuration (manual_configs); - Ties_configuration base = problem.generate_optimal_chord_configuration (); + Ties_configuration base = problem.generate_optimal_configuration (); for (vsize i = 0; i < base.size(); i++) { - Tie::set_control_points (ties[i], problem.common_x_refpoint (), - base[i], - problem.details_); + SCM cp = Tie::get_control_points (ties[i], problem.common_x_refpoint (), + base[i], + problem.details_); + + ties[i]->set_property ("control-points", cp); set_grob_direction (ties[i], base[i].dir_); -#if DEBUG_TIE_SCORING - if (to_boolean (me->layout () - ->lookup_variable (ly_symbol2scm ("debug-tie-scoring")))) - { - string card = to_string ("%d (%.2f): ", base[i].position_, base[i].delta_y_) - + base[i].card () + base.tie_card (i); - - - if (i == 0) - card += base.card (); - if (i == base.size () - 1) - card += to_string ("TOTAL=%.2f", base.score ()); - - ties[i]->set_property ("quant-score", - scm_makfrom0str (card.c_str ())); - } -#endif - + problem.set_debug_scoring (base); } return SCM_BOOL_T; } diff --git a/lily/tie-configuration.cc b/lily/tie-configuration.cc index 9192b3795e..2491f7e3ef 100644 --- a/lily/tie-configuration.cc +++ b/lily/tie-configuration.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -157,8 +157,46 @@ Ties_configuration::score () const return score_; } + +string +Ties_configuration::complete_tie_card (vsize i) const +{ + string s; + s += to_string ("%d (%.2f) %c: ", (*this)[i].position_, (*this)[i].delta_y_, + ((*this)[i].dir_ == UP ? 'u' : 'd')) + + (*this)[i].card () + (*this).tie_card (i); + + /* + this is a little awkward, but we must decide where to put + aggregrates. + */ + if (i == 0) + s += card (); + + if (i + 1 == size ()) + s += to_string ("TOTAL=%.2f", score ()); + + return s; +} + +/* for use inside GDB */ +string +Ties_configuration::complete_score_card () const +{ + string s; + for (vsize i = 0; i < size(); i++) + { + s += complete_tie_card (i); + } + + return s; +} + + + string Ties_configuration::card () const { return score_card_; } + diff --git a/lily/tie-details.cc b/lily/tie-details.cc index 852f04466b..ddb662fd30 100644 --- a/lily/tie-details.cc +++ b/lily/tie-details.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -54,6 +54,7 @@ Tie_details::from_grob (Grob *me) tie_tie_collision_penalty_ = get_real_detail ("tie-tie-collision-penalty", 30); tie_tie_collision_distance_ = get_real_detail ("tie-tie-collision-distance", .25); horizontal_distance_penalty_factor_ = get_real_detail ("horizontal-distance-penalty-factor", 5); + same_dir_as_stem_penalty_ = get_real_detail ("same-dir-as-stem-penalty", 20); vertical_distance_penalty_factor_ = get_real_detail ("vertical-distance-penalty-factor", 5); intra_space_threshold_ = get_real_detail ("intra-space-threshold", 1.0); outer_tie_length_symmetry_penalty_factor_ = get_real_detail ("outer-tie-length-symmetry-penalty-factor", 3.0); @@ -62,6 +63,7 @@ Tie_details::from_grob (Grob *me) outer_tie_vertical_gap_ = get_real_detail ("outer-tie-vertical-gap", 0.15); single_tie_region_size_ = get_int_detail ("single-tie-region-size", 3); + skyline_padding_ = get_real_detail ("skyline-padding", 0.05); multi_tie_region_size_ = get_int_detail ("multi-tie-region-size", 1); } diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc index af3c5a4ad6..b97a5ad9c2 100644 --- a/lily/tie-engraver.cc +++ b/lily/tie-engraver.cc @@ -3,13 +3,12 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "engraver.hh" #include "context.hh" -#include "grob-pitch-tuple.hh" #include "international.hh" #include "item.hh" #include "note-head.hh" @@ -124,8 +123,7 @@ Tie_engraver::acknowledge_note_head (Grob_info i) if (ly_is_equal (right_ev->get_property ("pitch"), left_ev->get_property ("pitch"))) { - Grob *p = new Spanner (heads_to_tie_[i].tie_definition_, - context ()->get_grob_key ("Tie")); + Grob *p = new Spanner (heads_to_tie_[i].tie_definition_); SCM cause = heads_to_tie_[i].tie_event_ ? heads_to_tie_[i].tie_event_->self_scm () @@ -160,8 +158,8 @@ Tie_engraver::start_translation_timestep () { context ()->set_property ("tieMelismaBusy", ly_bool2scm (heads_to_tie_.size ())); - - if (!to_boolean (get_property ("tieWaitForNote"))) + + if (heads_to_tie_.size () && !to_boolean (get_property ("tieWaitForNote"))) { Moment now = now_mom (); for (vsize i = heads_to_tie_.size (); i--; ) @@ -181,9 +179,14 @@ Tie_engraver::stop_translation_timestep () if (!wait) heads_to_tie_.clear (); + Grob *sep = unsmob_grob (get_property ("breakableSeparationItem")); for (vsize i = 0; i < ties_.size (); i++) - typeset_tie (ties_[i]); - + { + if (sep) + ties_[i]->set_object ("separation-item", sep->self_scm ()); + + typeset_tie (ties_[i]); + } ties_.clear (); tie_column_ = 0; } diff --git a/lily/tie-formatting-problem.cc b/lily/tie-formatting-problem.cc index 527091267f..6c7e2a024f 100644 --- a/lily/tie-formatting-problem.cc +++ b/lily/tie-formatting-problem.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ @@ -22,7 +22,8 @@ #include "tie-configuration.hh" #include "tie.hh" #include "warn.hh" - +#include "pointer-group-interface.hh" +#include "output-def.hh" void Tie_formatting_problem::print_ties_configuration (Ties_configuration const *ties) @@ -103,6 +104,9 @@ Tie_formatting_problem::set_column_chord_outline (vector bounds, Interval x = dots->extent (x_refpoint_, X_AXIS); int p = int (Staff_symbol_referencer::get_position (dots)); + /* + TODO: shouldn't this use column-rank dependent key? + */ dot_positions_.insert (p); dot_x_.unite (x); @@ -115,45 +119,76 @@ Tie_formatting_problem::set_column_chord_outline (vector bounds, Tuple2 key (column_rank, int (dir)); - if (stem - && !Stem::is_invisible (stem)) + if (stem) { - Interval x; - x.add_point (stem->relative_coordinate (x_refpoint_, X_AXIS)); - x.widen (staff_space / 20); // ugh. - Interval y; - y.add_point (Stem::stem_end_position (stem) * staff_space * .5); - - Direction stemdir = get_grob_direction (stem); - y.add_point (Stem::head_positions (stem)[-stemdir] - * staff_space * .5); - - boxes.push_back (Box (x, y)); + if (Stem::is_normal_stem (stem)) + { + + Interval x; + x.add_point (stem->relative_coordinate (x_refpoint_, X_AXIS)); + x.widen (staff_space / 20); // ugh. + Interval y; + y.add_point (Stem::stem_end_position (stem) * staff_space * .5); + + Direction stemdir = get_grob_direction (stem); + y.add_point (Stem::head_positions (stem)[-stemdir] + * staff_space * .5); + + /* + add extents of stem. + */ + boxes.push_back (Box (x, y)); - stem_extents_[key].unite (Box (x,y)); + stem_extents_[key].unite (Box (x,y)); - if (dir == LEFT) + if (dir == LEFT) + { + Box flag_box = Stem::get_translated_flag (stem).extent_box (); + flag_box.translate( Offset (x[RIGHT], X_AXIS)); + boxes.push_back (flag_box); + } + } + else { - Box flag_box = Stem::get_translated_flag (stem).extent_box (); - flag_box.translate( Offset (x[RIGHT], X_AXIS)); - boxes.push_back (flag_box); + Grob *head = Stem::support_head (stem); + + /* + In case of invisible stem, don't pass x-center of heads. + */ + Real x_center = head->extent (x_refpoint_, X_AXIS).center (); + Interval x_ext; + x_ext[-dir] = x_center; + Interval y_ext; + for (vsize j = 0; j < head_boxes.size (); j++) + y_ext.unite (head_boxes[j][Y_AXIS]); + + boxes.push_back (Box (x_ext, y_ext)); } - } - else if (stem) - { - Grob *head = Stem::support_head (stem); - /* - In case of invisible stem, don't pass x-center of heads. - */ - Real x_center = head->extent (x_refpoint_, X_AXIS).center (); - Interval x_ext; - x_ext[-dir] = x_center; - Interval y_ext; - for (vsize j = 0; j < head_boxes.size (); j++) - y_ext.unite (head_boxes[j][Y_AXIS]); + extract_grob_set (stem, "note-heads", heads); + for (vsize i = 0; i < heads.size(); i ++) + { + if (find (bounds.begin(), bounds.end (), dynamic_cast (heads[i])) == bounds.end ()) + { + /* + other untied notes in the same chord. + */ + + Interval y = Staff_symbol_referencer::extent_in_staff (heads[i]); + Interval x = heads[i]->extent (x_refpoint_, X_AXIS); + boxes.push_back (Box (x, y)); + } + + Grob *acc = unsmob_grob (heads[i]->get_object ("accidental-grob")); + if (acc && acc->is_live () && dir == RIGHT) + { + boxes.push_back (Box (acc->extent (x_refpoint_, X_AXIS), + Staff_symbol_referencer::extent_in_staff (acc))); + } - boxes.push_back (Box (x_ext, y_ext)); + head_positions_[column_rank].add_point (int (Staff_symbol_referencer::get_position (heads[i]))); + } + } Direction updowndir = DOWN; @@ -176,10 +211,11 @@ Tie_formatting_problem::set_column_chord_outline (vector bounds, while (flip (&updowndir) != DOWN); /* todo: the horizon_padding is somewhat arbitrary */ - chord_outlines_[key] = Skyline (boxes, 0.1, Y_AXIS, -dir); + chord_outlines_[key] = Skyline (boxes, details_.skyline_padding_, Y_AXIS, -dir); if (bounds[0]->break_status_dir ()) { Real x = robust_relative_extent (bounds[0], x_refpoint_, X_AXIS)[-dir]; + chord_outlines_[key].set_minimum_height (x); } else @@ -266,8 +302,19 @@ Tie_formatting_problem::from_ties (vector const &ties) for (vsize i = 0; i < ties.size (); i++) { Item *it = dynamic_cast (ties[i])->get_bound (d); - - bounds.push_back (it); + if (it->break_status_dir ()) + { + Item *sep + = dynamic_cast (unsmob_grob (ties[i]->get_object ("separation-item"))); + if (sep && sep->get_column () == it->get_column ()) + it = sep; + + bounds.push_back (it); + } + else + { + bounds.push_back (it); + } } set_chord_outline (bounds, d); @@ -278,16 +325,12 @@ Tie_formatting_problem::from_ties (vector const &ties) for (vsize i = 0; i < ties.size (); i++) { Tie_specification spec; - - spec.get_tie_manual_settings (ties[i]); - - + spec.from_grob (ties[i]); do { spec.note_head_drul_[d] = Tie::head (ties[i], d); - spec.column_ranks_[d] = - dynamic_cast (ties[i])->get_bound (d)->get_column ()->get_rank (); + spec.column_ranks_[d] = Tie::get_column_rank (ties[i], d); } while (flip (&d) != LEFT); specifications_.push_back (spec); @@ -317,10 +360,10 @@ Tie_formatting_problem::from_semi_ties (vector const &semi_ties, Directio spec.position_ = int (Staff_symbol_referencer::get_position (head)); } - spec.get_tie_manual_settings (semi_ties[i]); + spec.from_grob (semi_ties[i]); spec.note_head_drul_[head_dir] = head; - column_rank = dynamic_cast (head)->get_column ()->get_rank (); + column_rank = Tie::get_column_rank (semi_ties[i], head_dir); spec.column_ranks_ = Drul_array (column_rank, column_rank); heads.push_back (head); specifications_.push_back (spec); @@ -354,7 +397,8 @@ Tie_formatting_problem::get_tie_specification (int i) const Return configuration, create it if necessary. */ Tie_configuration* -Tie_formatting_problem::get_configuration (int pos, Direction dir, Drul_array columns) const +Tie_formatting_problem::get_configuration (int pos, Direction dir, Drul_array columns, + bool tune_dy) const { int key_components[] = { pos, dir, columns[LEFT], columns[RIGHT] @@ -368,14 +412,14 @@ Tie_formatting_problem::get_configuration (int pos, Direction dir, Drul_arraypossibilities_[key] = conf; return conf; } Tie_configuration* Tie_formatting_problem::generate_configuration (int pos, Direction dir, - Drul_array columns) const + Drul_array columns, bool y_tune) const { Tie_configuration *conf = new Tie_configuration; conf->position_ = pos; @@ -385,7 +429,6 @@ Tie_formatting_problem::generate_configuration (int pos, Direction dir, Real y = conf->position_ * 0.5 * details_.staff_space_; - bool y_tune = true; if (dot_positions_.find (pos) != dot_positions_.end ()) { conf->delta_y_ += dir * 0.25 * details_.staff_space_; @@ -416,37 +459,41 @@ Tie_formatting_problem::generate_configuration (int pos, Direction dir, size. */ - if (h < details_.intra_space_threshold_ * 0.5 * details_.staff_space_) + if (head_positions_slice (columns[LEFT]).contains (pos) + || head_positions_slice (columns[RIGHT]).contains (pos) + || abs (pos) < 2 * Staff_symbol_referencer::staff_radius (details_.staff_symbol_referencer_)) { - if (!Staff_symbol_referencer::on_line (details_.staff_symbol_referencer_, pos) - && abs (pos) < 2 * Staff_symbol_referencer::staff_radius (details_.staff_symbol_referencer_)) - { - conf->center_tie_vertically (details_); - } - else if (Staff_symbol_referencer::on_line (details_.staff_symbol_referencer_, pos)) + if (h < details_.intra_space_threshold_ * 0.5 * details_.staff_space_) { - conf->delta_y_ += dir * - details_.tip_staff_line_clearance_ * 0.5 * details_.staff_space_; + if (!Staff_symbol_referencer::on_line (details_.staff_symbol_referencer_, pos) + && abs (pos) < 2 * Staff_symbol_referencer::staff_radius (details_.staff_symbol_referencer_)) + { + conf->center_tie_vertically (details_); + } + else if (Staff_symbol_referencer::on_line (details_.staff_symbol_referencer_, pos)) + { + conf->delta_y_ += dir * + details_.tip_staff_line_clearance_ * 0.5 * details_.staff_space_; + } } - } - else - { - Real top_y = y + conf->delta_y_ + conf->dir_ * h; - Real top_pos = top_y / (0.5*details_.staff_space_); - int round_pos = int (my_round (top_pos)); - - /* TODO: should use other variable? */ - Real clearance = details_.center_staff_line_clearance_; - if (fabs (top_pos - round_pos) < clearance - && Staff_symbol_referencer::on_staff_line (details_.staff_symbol_referencer_, - round_pos)) + else { - Real new_y = (round_pos + clearance * conf->dir_) * 0.5 * details_.staff_space_; - conf->delta_y_ = (new_y - top_y); + Real top_y = y + conf->delta_y_ + conf->dir_ * h; + Real top_pos = top_y / (0.5*details_.staff_space_); + int round_pos = int (my_round (top_pos)); + + /* TODO: should use other variable? */ + Real clearance = details_.center_staff_line_clearance_; + if (fabs (top_pos - round_pos) < clearance + && Staff_symbol_referencer::on_staff_line (details_.staff_symbol_referencer_, + round_pos)) + { + Real new_y = (round_pos + clearance * conf->dir_) * 0.5 * details_.staff_space_; + conf->delta_y_ = (new_y - top_y); + } } } - } - + } conf->attachment_x_ = get_attachment (y + conf->delta_y_, conf->column_ranks_); if (conf->height (details_) < details_.intra_space_threshold_ * 0.5 * details_.staff_space_) { @@ -532,7 +579,8 @@ Tie_formatting_problem::score_aptitude (Tie_configuration *conf, } { - Real p = details_.vertical_distance_penalty_factor_ * fabs (curve_y - tie_y); + Real relevant_dist = max (fabs (curve_y - tie_y) - 0.5, 0.0); + Real p = details_.vertical_distance_penalty_factor_ * convex_amplifier (1.0, 0.9, relevant_dist); if (ties_conf) ties_conf->add_tie_score (p, tie_idx, "vdist"); else @@ -547,22 +595,79 @@ Tie_formatting_problem::score_aptitude (Tie_configuration *conf, Interval head_x = spec.note_head_drul_[d]->extent (x_refpoint_, X_AXIS); Real dist = head_x.distance (conf->attachment_x_[d]); + /* TODO: flatten with log or sqrt. */ - Real p = details_.horizontal_distance_penalty_factor_ * dist; + Real p = details_.horizontal_distance_penalty_factor_ + * convex_amplifier (1.25, 1.0, dist); if (ties_conf) ties_conf->add_tie_score (p, tie_idx, (d == LEFT) ? "lhdist" : "rhdist"); else penalty += p; + } while (flip (&d) != LEFT); + if (ties_conf + && ties_conf->size() == 1) + { + Direction d = LEFT; + Drul_array stems (0, 0); + do + { + if (!spec.note_head_drul_[d]) + continue; + + Grob *stem = unsmob_grob (spec.note_head_drul_[d]->get_object ("stem")); + if (stem + && Stem::is_normal_stem (stem)) + stems[d] = stem; + } + while (flip (&d) != LEFT); + + bool tie_stem_dir_ok = true; + bool tie_position_dir_ok = true; + if (stems[LEFT] && !stems[RIGHT]) + tie_stem_dir_ok = conf->dir_ != get_grob_direction (stems[LEFT]); + else if (!stems[LEFT] && stems[RIGHT]) + tie_stem_dir_ok = conf->dir_ != get_grob_direction (stems[RIGHT]); + else if (stems[LEFT] && stems[RIGHT] + && get_grob_direction (stems[LEFT]) == get_grob_direction (stems[RIGHT])) + tie_stem_dir_ok = conf->dir_ != get_grob_direction (stems[LEFT]); + else if (spec.position_) + tie_position_dir_ok = conf->dir_ == sign (spec.position_); + + if (!tie_stem_dir_ok) + ties_conf->add_score (details_.same_dir_as_stem_penalty_, "tie/stem dir"); + if (!tie_position_dir_ok) + ties_conf->add_score (details_.same_dir_as_stem_penalty_, "tie/pos dir"); + } + while (flip (&d) != LEFT); + + return penalty; } + +Slice +Tie_formatting_problem::head_positions_slice (int rank) const +{ + Position_extent_map::const_iterator i (head_positions_.find (rank)); + if (i != head_positions_.end ()) + { + return (*i).second; + } + Slice empty; + return empty; +} + +/* + Score a configuration, ie. how well these ties looks without regard + to the note heads that they should connect to. + */ void Tie_formatting_problem::score_configuration (Tie_configuration *conf) const { @@ -591,13 +696,17 @@ Tie_formatting_problem::score_configuration (Tie_configuration *conf) const conf->add_score ( details_.staff_line_collision_penalty_ * peak_around (0.1 * details_.center_staff_line_clearance_, - details_.center_staff_line_clearance_, + details_.center_staff_line_clearance_, fabs (top_pos - round_top_pos)), "line center"); } - - if (Staff_symbol_referencer::on_line (details_.staff_symbol_referencer_, - int (rint (tip_pos)))) + + int rounded_tip_pos = int (rint (tip_pos)); + if (Staff_symbol_referencer::on_line (details_.staff_symbol_referencer_, rounded_tip_pos) + && (head_positions_slice (conf->column_ranks_[LEFT]).contains (rounded_tip_pos) + || head_positions_slice (conf->column_ranks_[RIGHT]).contains (rounded_tip_pos) + || abs (rounded_tip_pos) < 2 * Staff_symbol_referencer::staff_radius (details_.staff_symbol_referencer_)) + ) { conf->add_score (details_.staff_line_collision_penalty_ * peak_around (0.1 * details_.tip_staff_line_clearance_, @@ -632,96 +741,6 @@ Tie_formatting_problem::score_configuration (Tie_configuration *conf) const conf->scored_ = true; } -Tie_configuration -Tie_formatting_problem::find_optimal_tie_configuration (Tie_specification const &spec) const -{ - vector confs; - - int pos = spec.position_; - Direction dir = spec.manual_dir_; - - for (int i = 0; i < details_.single_tie_region_size_; i ++) - { - confs.push_back (generate_configuration (pos + i * dir, dir, - spec.column_ranks_)); - - if (spec.has_manual_position_) - { - confs.back ()->delta_y_ - = (spec.manual_position_ - spec.position_) - * 0.5 * details_.staff_space_; - - break; - } - } - - vector scores; - - int best_idx = -1; - Real best_score = 1e6; - for (vsize i = 0; i < confs.size (); i ++) - { - score_configuration (confs[i]); - Real score = score_aptitude (confs[i], spec, 0, 0) - + confs[i]->score (); - - if (score < best_score) - { - best_score = score; - best_idx = i; - } - } - - if (best_idx < 0) - programming_error ("No best tie configuration found."); - - Tie_configuration best - = (best_idx >= 0) ? *confs[best_idx] : *confs[0]; - - for (vsize i = 0; i < confs.size (); i++) - delete confs[i]; - - return best; -} - -Tie_specification::Tie_specification () -{ - has_manual_position_ = false; - has_manual_dir_ = false; - position_ = 0; - manual_position_ = 0; - manual_dir_ = CENTER; - note_head_drul_[LEFT] = - note_head_drul_[RIGHT] = 0; - column_ranks_[RIGHT] = - column_ranks_[LEFT] = 0; -} - - -void -Tie_specification::get_tie_manual_settings (Grob *tie) -{ - if (scm_is_number (tie->get_property_data ("direction"))) - { - manual_dir_ = to_dir (tie->get_property ("direction")); - has_manual_dir_ = true; - } - - position_ = Tie::get_position (tie); - if (scm_is_number (tie->get_property ("staff-position"))) - { - manual_position_ = scm_to_double (tie->get_property ("staff-position")); - has_manual_position_ = true; - position_ = int (my_round (manual_position_)); - } -} - -int -Tie_specification::column_span () const -{ - return column_ranks_[RIGHT] - column_ranks_[LEFT]; -} - void Tie_formatting_problem::score_ties_aptitude (Ties_configuration *ties) const { @@ -787,21 +806,23 @@ Tie_formatting_problem::score_ties_configuration (Ties_configuration *ties) cons last_center = center; } - ties->add_score (details_.outer_tie_length_symmetry_penalty_factor_ - * fabs (ties->at (0).attachment_x_.length () - ties->back ().attachment_x_.length ()), - "length symm"); + if (ties->size () > 1) + { + ties->add_score (details_.outer_tie_length_symmetry_penalty_factor_ + * fabs (ties->at (0).attachment_x_.length () - ties->back ().attachment_x_.length ()), + "length symm"); - ties->add_score (details_.outer_tie_vertical_distance_symmetry_penalty_factor_ - * fabs (fabs (specifications_[0].position_ * 0.5 * details_.staff_space_ - - (ties->at (0).position_ * 0.5 * details_.staff_space_ - + ties->at (0).delta_y_)) - - - fabs (specifications_.back ().position_ * 0.5 * details_.staff_space_ - - (ties->back ().position_ * 0.5 * details_.staff_space_ - + ties->back ().delta_y_))), - "pos symmetry"); + ties->add_score (details_.outer_tie_vertical_distance_symmetry_penalty_factor_ + * fabs (fabs (specifications_[0].position_ * 0.5 * details_.staff_space_ + - (ties->at (0).position_ * 0.5 * details_.staff_space_ + + ties->at (0).delta_y_)) + - + fabs (specifications_.back ().position_ * 0.5 * details_.staff_space_ + - (ties->back ().position_ * 0.5 * details_.staff_space_ + + ties->back ().delta_y_))), + "pos symmetry"); + } } - /* Generate with correct X-attachments and beziers, copying delta_y_ from TIES_CONFIG if necessary. @@ -813,8 +834,9 @@ Tie_formatting_problem::generate_ties_configuration (Ties_configuration const &t for (vsize i = 0; i < ties_config.size (); i++) { Tie_configuration * ptr = get_configuration (ties_config[i].position_, ties_config[i].dir_, - ties_config[i].column_ranks_); - if (specifications_[i].has_manual_position_) + ties_config[i].column_ranks_, + !specifications_[i].has_manual_delta_y_); + if (specifications_[i].has_manual_delta_y_) { ptr->delta_y_ = (specifications_[i].manual_position_ - ties_config[i].position_) @@ -838,8 +860,9 @@ Tie_formatting_problem::generate_base_chord_configuration () if (specifications_[i].has_manual_position_) { conf.position_ = (int) my_round (specifications_[i].manual_position_); - conf.delta_y_ = (specifications_[i].manual_position_ - conf.position_) - * 0.5 * details_.staff_space_; + if (specifications_[i].has_manual_delta_y_) + conf.delta_y_ = (specifications_[i].manual_position_ - conf.position_) + * 0.5 * details_.staff_space_; } else { @@ -862,7 +885,7 @@ Tie_formatting_problem::generate_base_chord_configuration () Ties_configuration Tie_formatting_problem::find_best_variation (Ties_configuration const &base, - vector vars) + vector const &vars) { Ties_configuration best = base; @@ -890,16 +913,24 @@ Tie_formatting_problem::find_best_variation (Ties_configuration const &base, Ties_configuration -Tie_formatting_problem::generate_optimal_chord_configuration () +Tie_formatting_problem::generate_optimal_configuration () { Ties_configuration base = generate_base_chord_configuration (); - vector vars = generate_collision_variations (base); - score_ties (&base); + + vector vars; + if (specifications_.size () > 1) + vars = generate_collision_variations (base); + else + vars = generate_single_tie_variations (base); + Ties_configuration best = find_best_variation (base, vars); - vars = generate_extremal_tie_variations (best); - best = find_best_variation (best, vars); + if (specifications_.size () > 1) + { + vars = generate_extremal_tie_variations (best); + best = find_best_variation (best, vars); + } return best; } @@ -947,7 +978,7 @@ Tie_formatting_problem::set_ties_config_standard_directions (Ties_configuration } } - for (vsize i = 1; i < tie_configs->size() - 1; i++) + for (vsize i = 1; i + 1 < tie_configs->size (); i++) { Tie_configuration &conf = tie_configs->at (i); if (conf.dir_) @@ -983,7 +1014,8 @@ Tie_formatting_problem::generate_extremal_tie_variations (Ties_configuration con var.index_ = (d == DOWN) ? 0 : ties.size () - 1; var.suggestion_ = get_configuration (boundary (ties, d, 0).position_ + d * i, d, - boundary (ties, d, 0).column_ranks_); + boundary (ties, d, 0).column_ranks_, + true); vars.push_back (var); } } @@ -992,6 +1024,41 @@ Tie_formatting_problem::generate_extremal_tie_variations (Ties_configuration con return vars; } +vector +Tie_formatting_problem::generate_single_tie_variations (Ties_configuration const &ties) const +{ + vector vars; + + int sz = details_.single_tie_region_size_; + if (specifications_[0].has_manual_position_) + sz = 1; + for (int i = 0; i < sz; i ++) + { + Direction d = LEFT; + do + { + if (i == 0 + && ties[0].dir_ == d) + continue; + + int p = ties[0].position_ + i * d; + + if (!specifications_[0].has_manual_dir_ + || d == specifications_[0].manual_dir_) + { + Tie_configuration_variation var; + var.index_ = 0; + var.suggestion_ = get_configuration (p, + d, specifications_[0].column_ranks_, + !specifications_[0].has_manual_delta_y_); + vars.push_back (var); + } + } + while (flip (&d) != LEFT); + } + return vars; +} + vector Tie_formatting_problem::generate_collision_variations (Ties_configuration const &ties) const @@ -1018,7 +1085,8 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const - ties[i].dir_, - ties[i].dir_, - ties[i].column_ranks_ + ties[i].column_ranks_, + !specifications_[i].has_manual_delta_y_ ); vars.push_back (var); @@ -1031,7 +1099,9 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const var.suggestion_ = get_configuration (specifications_[i-1].position_ - ties[i-1].dir_, - ties[i-1].dir_, - specifications_[i-1].column_ranks_); + specifications_[i-1].column_ranks_, + !specifications_[i-1].has_manual_delta_y_ + ); vars.push_back (var); } @@ -1042,7 +1112,10 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const Tie_configuration_variation var; var.index_ = i-1; var.suggestion_ = get_configuration (specifications_[i-1].position_ - 1, DOWN, - specifications_[i-1].column_ranks_); + specifications_[i-1].column_ranks_, + !specifications_[i-1].has_manual_delta_y_ + + ); vars.push_back (var); } if (i == ties.size() && !specifications_[i].has_manual_position_ @@ -1052,7 +1125,9 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const var.index_ = i; var.suggestion_ = get_configuration (specifications_[i].position_ + 1, UP, - specifications_[i].column_ranks_); + specifications_[i].column_ranks_, + !specifications_[i].has_manual_delta_y_ + ); vars.push_back (var); } } @@ -1063,7 +1138,9 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const var.index_ = i; var.suggestion_ = get_configuration (ties[i].position_ + ties[i].dir_, ties[i].dir_, - ties[i].column_ranks_); + ties[i].column_ranks_, + !specifications_[i].has_manual_delta_y_ + ); vars.push_back (var); } @@ -1092,7 +1169,9 @@ Tie_formatting_problem::set_manual_tie_configuration (SCM manual_configs) { spec.has_manual_position_ = true; spec.manual_position_ = scm_to_double (scm_car (entry)); + spec.has_manual_delta_y_ = (scm_inexact_p (scm_car (entry)) == SCM_BOOL_T); } + if (scm_is_number (scm_cdr (entry))) { spec.has_manual_dir_ = true; @@ -1103,3 +1182,20 @@ Tie_formatting_problem::set_manual_tie_configuration (SCM manual_configs) } } + +void +Tie_formatting_problem::set_debug_scoring (Ties_configuration const &base) +{ +#if DEBUG_TIE_SCORING + if (to_boolean (x_refpoint_->layout () + ->lookup_variable (ly_symbol2scm ("debug-tie-scoring")))) + { + for (vsize i = 0; i < base.size(); i++) + { + string card = base.complete_tie_card (i); + specifications_[i].tie_grob_->set_property ("quant-score", + ly_string2scm (card)); + } + } +#endif +} diff --git a/lily/tie-performer.cc b/lily/tie-performer.cc index df68a638b1..0519fcb930 100644 --- a/lily/tie-performer.cc +++ b/lily/tie-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "performer.hh" diff --git a/lily/tie-specification.cc b/lily/tie-specification.cc new file mode 100644 index 0000000000..3a7ce345cb --- /dev/null +++ b/lily/tie-specification.cc @@ -0,0 +1,47 @@ +#include "tie-formatting-problem.hh" +#include "grob.hh" +#include "tie.hh" +#include "libc-extension.hh" +#include "tie-specification.hh" + +Tie_specification::Tie_specification () +{ + tie_grob_ = 0; + has_manual_position_ = false; + has_manual_dir_ = false; + has_manual_delta_y_ = false; + position_ = 0; + manual_position_ = 0; + manual_dir_ = CENTER; + note_head_drul_[LEFT] = + note_head_drul_[RIGHT] = 0; + column_ranks_[RIGHT] = + column_ranks_[LEFT] = 0; +} + + +void +Tie_specification::from_grob (Grob *tie) +{ + tie_grob_ = tie; + if (scm_is_number (tie->get_property_data ("direction"))) + { + manual_dir_ = to_dir (tie->get_property ("direction")); + has_manual_dir_ = true; + } + + position_ = Tie::get_position (tie); + SCM pos_scm = tie->get_property ("staff-position"); + if (scm_is_number (pos_scm)) + { + has_manual_delta_y_ = (scm_inexact_p (pos_scm) == SCM_BOOL_T); + manual_position_ = scm_to_double (tie->get_property ("staff-position")); + has_manual_position_ = true; + } +} + +int +Tie_specification::column_span () const +{ + return column_ranks_[RIGHT] - column_ranks_[LEFT]; +} diff --git a/lily/tie.cc b/lily/tie.cc index 73041c6a83..1d4e7fca9a 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "tie.hh" @@ -148,20 +148,21 @@ Tie::calc_direction (SCM smob) if ((Tie_column::has_interface (yparent) || Semi_tie_column::has_interface (yparent)) && unsmob_grob_array (yparent->get_object ("ties")) - && unsmob_grob_array (yparent->get_object ("ties"))->size () > 1) + // && unsmob_grob_array (yparent->get_object ("ties"))->size () > 1 + ) { /* trigger positioning. */ (void) yparent->get_property ("positioning-done"); + + return me->get_property_data ("direction"); } else - set_grob_direction (me, Tie::get_default_dir (me)); - - return SCM_UNSPECIFIED; + return scm_from_int (Tie::get_default_dir (me)); } -void -Tie::set_default_control_points (Grob *me_grob) +SCM +Tie::get_default_control_points (Grob *me_grob) { Spanner *me = dynamic_cast (me_grob); Grob *common = me; @@ -170,21 +171,21 @@ Tie::set_default_control_points (Grob *me_grob) Tie_formatting_problem problem; problem.from_tie (me); + Tie_specification spec = problem.get_tie_specification (0); - spec.has_manual_dir_ = true; - spec.manual_dir_ = get_grob_direction (me); + if (!me->is_live ()) + return SCM_EOL; - if (me->is_live ()) - { - Tie_configuration conf - = problem.find_optimal_tie_configuration (spec); - set_control_points (me, problem.common_x_refpoint (), - conf, problem.details_); - } + Ties_configuration conf + = problem.generate_optimal_configuration (); + + return get_control_points (me, problem.common_x_refpoint (), + conf[0], problem.details_); } -void -Tie::set_control_points (Grob *me, + +SCM +Tie::get_control_points (Grob *me, Grob *common, Tie_configuration const &conf, Tie_details const &details @@ -200,38 +201,38 @@ Tie::set_control_points (Grob *me, programming_error ("Insane offset"); controls = scm_cons (ly_offset2scm (b.control_[i]), controls); } - me->set_property ("control-points", controls); + return controls; } + MAKE_SCHEME_CALLBACK(Tie, calc_control_points, 1); SCM Tie::calc_control_points (SCM smob) { Grob *me = unsmob_grob (smob); - // trigger Tie-column - (void) get_grob_direction (me); - Grob *yparent = me->get_parent (Y_AXIS); if ((Tie_column::has_interface (yparent) || Semi_tie_column::has_interface (yparent)) && unsmob_grob_array (yparent->get_object ("ties")) - && unsmob_grob_array (yparent->get_object ("ties"))->size () > 1) + // && unsmob_grob_array (yparent->get_object ("ties"))->size () > 1 + ) { /* trigger positioning. */ (void) yparent->get_property ("positioning-done"); } - if (!scm_is_pair (me->get_property_data ("control-points"))) + SCM cp = me->get_property_data ("control-points"); + if (!scm_is_pair (cp)) { - set_default_control_points (me); + cp = get_default_control_points (me); } - return SCM_UNSPECIFIED; + return cp; } /* - TODO: merge witnh Slur::print. + TODO: merge with Slur::print. */ MAKE_SCHEME_CALLBACK (Tie, print, 1); SCM @@ -280,8 +281,15 @@ Tie::print (SCM smob) Stencil tm = *unsmob_stencil (Text_interface::interpret_markup (me->layout ()->self_scm (), properties, quant_score)); - tm.translate_axis (b.control_[0][Y_AXIS]*2, Y_AXIS); - a.add_at_edge (X_AXIS, RIGHT, tm, 1.0, 0); + tm.translate (Offset (b.control_[3][X_AXIS] + 0.5, + b.control_[0][Y_AXIS] * 2)); + tm = tm.in_color (1, 0, 0); + + /* + It would be nice if we could put this in a different layer, + but alas, this must be done with a Tie override. + */ + a.add_stencil (tm); } #endif @@ -300,13 +308,16 @@ ADD_INTERFACE (Tie, "dash-period " "details " "direction " + "separation-item " "head-direction " "line-thickness " "quant-score " "staff-position " "thickness " + ); + diff --git a/lily/time-scaled-music-iterator.cc b/lily/time-scaled-music-iterator.cc index 9ab2673eeb..f5ca62dbfb 100644 --- a/lily/time-scaled-music-iterator.cc +++ b/lily/time-scaled-music-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys , + (c) 1998--2007 Han-Wen Nienhuys , Erik Sandberg */ @@ -11,14 +11,15 @@ #include "input.hh" #include "international.hh" #include "music.hh" -#include "sequential-iterator.hh" +#include "music-wrapper-iterator.hh" +#include "stream-event.hh" /* Iterates \times, by sending TupletSpanEvents at the start/end of each tuplet bracket. Extra stop/start events are sent at regular intervals if tupletSpannerDuration is set. */ -class Time_scaled_music_iterator : public Sequential_iterator +class Time_scaled_music_iterator : public Music_wrapper_iterator { public: DECLARE_SCHEME_CALLBACK (constructor, ()); @@ -26,11 +27,13 @@ public: DECLARE_CLASSNAME(Time_scaled_music_iterator); Time_scaled_music_iterator (); protected: - virtual SCM get_music_list () const; virtual void process (Moment m); virtual void construct_children (); virtual void derived_mark () const; virtual Moment pending_moment () const; + + Music *create_event (Direction d); + private: /* tupletSpannerDuration */ @@ -40,26 +43,47 @@ private: Moment next_split_mom_; /* Recycle start/stop events if tupletSpannerDuration is set. */ - Music *start_; - Music *stop_; + SCM synthesized_events_; + + Context_handle tuplet_handler_; }; +Music* +Time_scaled_music_iterator::create_event (Direction d) +{ + SCM ev_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"), + ly_symbol2scm ("TupletSpanEvent"), + scm_from_int (d)); + + Music *mus = get_music (); + + Music *ev = unsmob_music (ev_scm); + ev->set_spot (*mus->origin ()); + if (d == START) + { + ev->set_property ("numerator", mus->get_property ("numerator")); + ev->set_property ("denominator", mus->get_property ("denominator")); + ev->set_property ("tweaks", mus->get_property ("tweaks")); + ev->set_property ("length", spanner_duration_.smobbed_copy ()); + } + + synthesized_events_ = scm_cons (ev_scm, synthesized_events_); + return ev; +} + + Time_scaled_music_iterator::Time_scaled_music_iterator () { spanner_duration_ = next_split_mom_ = 0; + synthesized_events_ = SCM_EOL; } Moment Time_scaled_music_iterator::pending_moment () const { - Moment next_mom = Sequential_iterator::pending_moment (); - - if (spanner_duration_.to_bool () && - next_mom.main_part_ > next_split_mom_) - { - next_mom = next_split_mom_; - } + Moment next_mom = Music_wrapper_iterator::pending_moment (); + next_mom = min (next_mom, next_split_mom_); return next_mom; } @@ -71,73 +95,52 @@ Time_scaled_music_iterator::process (Moment m) if (spanner_duration_.to_bool () && m.main_part_ == next_split_mom_) { - report_event (stop_); - report_event (start_); + descend_to_bottom_context (); + if (tuplet_handler_.get_outlet()) + create_event (STOP)->send_to_context (tuplet_handler_.get_outlet ()); + + if (m.main_part_ < music_get_length ().main_part_) + { + tuplet_handler_.set_context (get_outlet ()); + report_event (create_event (START)); - next_split_mom_ += spanner_duration_; - /* avoid sending events twice at the end */ - if (next_split_mom_ == get_music ()->get_length ().main_part_) - next_split_mom_.set_infinite (1); + next_split_mom_ += spanner_duration_; + } + else + { + tuplet_handler_.set_context (0); + } } - Sequential_iterator::process(m); + Music_wrapper_iterator::process(m); + if (child_iter_ && child_iter_->ok ()) + descend_to_child (child_iter_->get_outlet ()); + } void Time_scaled_music_iterator::construct_children () { - /* - Inheritance trickery: - Time_scaled_music_iterator::construct_children initialises start_ - and stop_, and calls Sequential_music::construct_children, which - in turn calls Time_scaled_music_iterator::get_music which reads - start_ and stop_. - */ - - Music *mus = get_music (); - Input *origin = mus->origin (); - - SCM tuplet_symbol = ly_symbol2scm ("TupletSpanEvent"); - SCM start_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"), tuplet_symbol, scm_from_int (START)); - start_ = unsmob_music (start_scm); - start_->set_spot (*origin); - start_->set_property ("numerator", mus->get_property ("numerator")); - start_->set_property ("denominator", mus->get_property ("denominator")); - start_->set_property ("tweaks", mus->get_property ("tweaks")); - - - SCM stop_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"), tuplet_symbol, scm_from_int (STOP)); - stop_ = unsmob_music (stop_scm); - stop_->set_spot (*origin); - Moment *mp = unsmob_moment (get_outlet ()->get_property ("tupletSpannerDuration")); - if (mp) { spanner_duration_ = mp->main_part_; - next_split_mom_ = spanner_duration_; } + else + { + spanner_duration_ = music_get_length (); + } + + Music_wrapper_iterator::construct_children (); - Sequential_iterator::construct_children (); -} - -SCM -Time_scaled_music_iterator::get_music_list () const -{ - Music *mus = get_music (); - SCM child = mus->get_property ("element"); - - return scm_list_3 (start_->self_scm (), child, stop_->self_scm ()); + if (child_iter_ && child_iter_->ok ()) + descend_to_child (child_iter_->get_outlet ()); } void Time_scaled_music_iterator::derived_mark () const { - if (start_) - scm_gc_mark (start_->self_scm ()); - if (stop_) - scm_gc_mark (stop_->self_scm ()); - - Sequential_iterator::derived_mark (); + scm_gc_mark (synthesized_events_); + Music_wrapper_iterator::derived_mark (); } IMPLEMENT_CTOR_CALLBACK (Time_scaled_music_iterator); diff --git a/lily/time-signature-engraver.cc b/lily/time-signature-engraver.cc index 68a7e178b0..5e23c5e3fe 100644 --- a/lily/time-signature-engraver.cc +++ b/lily/time-signature-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "engraver-group.hh" @@ -66,9 +66,14 @@ Time_signature_engraver::process_music () int (scm_to_int (scm_car (fr))))); } - last_time_fraction_ = fr; time_signature_ = make_item ("TimeSignature", SCM_EOL); time_signature_->set_property ("fraction", fr); + + if (last_time_fraction_ == SCM_BOOL_F) + time_signature_->set_property ("break-visibility", + get_property ("implicitTimeSignatureVisibility")); + + last_time_fraction_ = fr; } } @@ -81,7 +86,13 @@ Time_signature_engraver::stop_translation_timestep () #include "translator.icc" ADD_TRANSLATOR (Time_signature_engraver, - /* doc */ "Create a TimeSignature whenever @code{timeSignatureFraction} changes", - /* create */ "TimeSignature", - /* read */ "", + /* doc */ "Create a @ref{TimeSignature} whenever @code{timeSignatureFraction} changes", + /* create */ + "TimeSignature ", + + /* read */ + "implicitTimeSignatureVisibility " + "timeSignatureFraction " + + , /* write */ ""); diff --git a/lily/time-signature-performer.cc b/lily/time-signature-performer.cc index 65c0d135c7..3e57a2c02c 100644 --- a/lily/time-signature-performer.cc +++ b/lily/time-signature-performer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include "audio-item.hh" diff --git a/lily/time-signature.cc b/lily/time-signature.cc index ced6468e8d..c4afd8caa0 100644 --- a/lily/time-signature.cc +++ b/lily/time-signature.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #include "time-signature.hh" @@ -94,9 +94,9 @@ Time_signature::numbered_time_signature (Grob *me, int num, int den) chain); SCM sn = Text_interface::interpret_markup (me->layout ()->self_scm (), chain, - scm_makfrom0str (to_string (num).c_str ())); + ly_string2scm (to_string (num))); SCM sd = Text_interface::interpret_markup (me->layout ()->self_scm (), chain, - scm_makfrom0str (to_string (den).c_str ())); + ly_string2scm (to_string (den))); Stencil n = *unsmob_stencil (sn); Stencil d = *unsmob_stencil (sd); @@ -106,8 +106,8 @@ Time_signature::numbered_time_signature (Grob *me, int num, int den) Stencil m; if (den) { - m.add_at_edge (Y_AXIS, UP, n, 0.0, 0); - m.add_at_edge (Y_AXIS, DOWN, d, 0.0, 0); + m.add_at_edge (Y_AXIS, UP, n, 0.0); + m.add_at_edge (Y_AXIS, DOWN, d, 0.0); } else { diff --git a/lily/timing-translator.cc b/lily/timing-translator.cc index 96460ec2d2..ee609a4db0 100644 --- a/lily/timing-translator.cc +++ b/lily/timing-translator.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "timing-translator.hh" diff --git a/lily/translator-ctors.cc b/lily/translator-ctors.cc index 1fe410f25d..f4eaeaf31a 100644 --- a/lily/translator-ctors.cc +++ b/lily/translator-ctors.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "translator.hh" diff --git a/lily/translator-dispatch-list.cc b/lily/translator-dispatch-list.cc index bd27091988..a4bddefca8 100644 --- a/lily/translator-dispatch-list.cc +++ b/lily/translator-dispatch-list.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "translator-dispatch-list.hh" diff --git a/lily/translator-group-ctors.cc b/lily/translator-group-ctors.cc index 83feef1634..8225f03176 100644 --- a/lily/translator-group-ctors.cc +++ b/lily/translator-group-ctors.cc @@ -3,12 +3,13 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "score-engraver.hh" #include "score-performer.hh" #include "warn.hh" +#include "international.hh" /* Quick & dirty. @@ -25,11 +26,13 @@ get_translator_group (SCM sym) else if (sym == ly_symbol2scm ("Score_performer")) return new Score_performer (); - programming_error ("Couldn't find type"); + error (_f ("fatal error. Couldn't find type: %s", + ly_symbol2string (sym).c_str ())); scm_flush (scm_current_error_port ()); scm_display (sym, scm_current_error_port ()); scm_flush (scm_current_error_port ()); - assert (0); + exit (2); + return 0; } diff --git a/lily/translator-group.cc b/lily/translator-group.cc index 0fa39c662a..83bfdfa0b7 100644 --- a/lily/translator-group.cc +++ b/lily/translator-group.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys , + (c) 1997--2007 Han-Wen Nienhuys , Erik Sandberg */ @@ -21,11 +21,6 @@ #include "scm-hash.hh" #include "warn.hh" -Translator_group * -Translator_group::get_daddy_translator () const -{ - return context ()->get_parent_context ()->implementation (); -} void translator_each (SCM list, Translator_method method) diff --git a/lily/translator-scheme.cc b/lily/translator-scheme.cc index d255386d73..3b2604fe18 100644 --- a/lily/translator-scheme.cc +++ b/lily/translator-scheme.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "context-def.hh" diff --git a/lily/translator.cc b/lily/translator.cc index b7a46d29b6..52274adc42 100644 --- a/lily/translator.cc +++ b/lily/translator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "translator.hh" @@ -199,7 +199,7 @@ Translator::static_translator_description (const char *grobs, parse_symbol_list (grobs), static_properties); static_properties = scm_acons (ly_symbol2scm ("description"), - scm_makfrom0str (desc), static_properties); + scm_from_locale_string (desc), static_properties); SCM list = SCM_EOL; for (; listener_list; listener_list = listener_list->next_) diff --git a/lily/trill-spanner-engraver.cc b/lily/trill-spanner-engraver.cc index 844af53736..072f96623f 100644 --- a/lily/trill-spanner-engraver.cc +++ b/lily/trill-spanner-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Jan Nieuwenhuizen + (c) 2000--2007 Jan Nieuwenhuizen */ /* diff --git a/lily/ttf.cc b/lily/ttf.cc index 2e5eb8865d..26deb0841b 100644 --- a/lily/ttf.cc +++ b/lily/ttf.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "freetype.hh" @@ -168,7 +168,7 @@ print_trailer (void *out, GLYPH_NAME_LEN); if (error) { - programming_error ("print_trailer(): FT_Get_Glyph_Name() returned error"); + programming_error ("FT_Get_Glyph_Name(): error."); glyph_name[0] = 0; } } @@ -231,7 +231,7 @@ LY_DEFINE (ly_ttf_ps_name, "ly:ttf-ps-name", FT_Face face = open_ft_face (file_name); char const *ps_name_str0 = FT_Get_Postscript_Name (face); - SCM ps_name = scm_makfrom0str (ps_name_str0 ? ps_name_str0 : ""); + SCM ps_name = scm_from_locale_string (ps_name_str0 ? ps_name_str0 : ""); FT_Done_Face (face); diff --git a/lily/tuplet-bracket.cc b/lily/tuplet-bracket.cc index d13cf1c613..53253f71dd 100644 --- a/lily/tuplet-bracket.cc +++ b/lily/tuplet-bracket.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen Han-Wen Nienhuys */ @@ -511,37 +511,10 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) Direction dir = get_grob_direction (me); - /* - Use outer non-rest columns to determine slope - */ - Grob *left_col = 0; - Grob *right_col = 0; - get_bounds (me, &left_col, &right_col); - if (left_col && right_col) - { - Interval rv = right_col->extent (commony, Y_AXIS); - Interval lv = left_col->extent (commony, Y_AXIS); - rv.unite (staff); - lv.unite (staff); - Real graphical_dy = rv[dir] - lv[dir]; - - Slice ls = Note_column::head_positions_interval (left_col); - Slice rs = Note_column::head_positions_interval (right_col); - - Interval musical_dy; - musical_dy[UP] = rs[UP] - ls[UP]; - musical_dy[DOWN] = rs[DOWN] - ls[DOWN]; - if (sign (musical_dy[UP]) != sign (musical_dy[DOWN])) - *dy = 0.0; - else if (sign (graphical_dy) != sign (musical_dy[DOWN])) - *dy = 0.0; - else - *dy = graphical_dy; - } - else - *dy = 0; + bool equally_long = false; + Grob *par_beam = parallel_beam (me, columns, &equally_long); + - *offset = -dir * infinity_f; Item *lgr = get_x_bound_item (me, LEFT, dir); Item *rgr = get_x_bound_item (me, RIGHT, dir); @@ -549,18 +522,82 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) Real x1 = robust_relative_extent (rgr, commonx, X_AXIS)[RIGHT]; vector points; - points.push_back (Offset (x0 - x0, staff[dir])); - points.push_back (Offset (x1 - x0, staff[dir])); - for (vsize i = 0; i < columns.size (); i++) + if (columns.size () + && par_beam + && get_grob_direction (par_beam) == dir + && Note_column::get_stem (columns[0]) + && Note_column::get_stem (columns.back ())) + { + /* + trigger set_stem_ends + */ + (void) par_beam->get_property ("quantized-positions"); + + + Drul_array stems (Note_column::get_stem (columns[0]), + Note_column::get_stem (columns.back ())); + + + + + Real ss = 0.5 * Staff_symbol_referencer::staff_space (me); + Real lp = ss * robust_scm2double (stems[LEFT]->get_property ("stem-end-position"), 0.0); + Real rp = ss * robust_scm2double (stems[RIGHT]->get_property ("stem-end-position"), 0.0); + + *dy = rp - lp; + points.push_back (Offset (stems[LEFT]->relative_coordinate (commonx, X_AXIS) - x0, lp)); + points.push_back (Offset (stems[RIGHT]->relative_coordinate (commonx, X_AXIS) - x0, rp)); + } + else { - Interval note_ext = columns[i]->extent (commony, Y_AXIS); - Real notey = note_ext[dir] - me->relative_coordinate (commony, Y_AXIS); + /* + Use outer non-rest columns to determine slope + */ + Grob *left_col = 0; + Grob *right_col = 0; + get_bounds (me, &left_col, &right_col); + if (left_col && right_col) + { + Interval rv = right_col->extent (commony, Y_AXIS); + Interval lv = left_col->extent (commony, Y_AXIS); + rv.unite (staff); + lv.unite (staff); + Real graphical_dy = rv[dir] - lv[dir]; + + Slice ls = Note_column::head_positions_interval (left_col); + Slice rs = Note_column::head_positions_interval (right_col); + + Interval musical_dy; + musical_dy[UP] = rs[UP] - ls[UP]; + musical_dy[DOWN] = rs[DOWN] - ls[DOWN]; + if (sign (musical_dy[UP]) != sign (musical_dy[DOWN])) + *dy = 0.0; + else if (sign (graphical_dy) != sign (musical_dy[DOWN])) + *dy = 0.0; + else + *dy = graphical_dy; + } + else + *dy = 0; - Real x = columns[i]->relative_coordinate (commonx, X_AXIS) - x0; - points.push_back (Offset (x, notey)); + *offset = -dir * infinity_f; + for (vsize i = 0; i < columns.size (); i++) + { + Interval note_ext = columns[i]->extent (commony, Y_AXIS); + Real notey = note_ext[dir] - me->relative_coordinate (commony, Y_AXIS); + + Real x = columns[i]->relative_coordinate (commonx, X_AXIS) - x0; + points.push_back (Offset (x, notey)); + } } + if (!(par_beam && get_grob_direction (par_beam) == dir)) + { + points.push_back (Offset (x0 - x0, staff[dir])); + points.push_back (Offset (x1 - x0, staff[dir])); + } + /* This is a slight hack. We compute two encompass points from the bbox of the smaller tuplets. @@ -647,7 +684,6 @@ SCM Tuplet_bracket::calc_positions (SCM smob) { Spanner *me = unsmob_spanner (smob); - extract_grob_set (me, "note-columns", columns); /* Don't print if it doesn't span time. @@ -659,44 +695,9 @@ Tuplet_bracket::calc_positions (SCM smob) return SCM_EOL; } - - Direction dir = get_grob_direction (me); - bool equally_long = false; - Grob *par_beam = parallel_beam (me, columns, &equally_long); - - /* - We follow the beam only if there is one, and we are next to it. - */ Real dy = 0.0; Real offset = 0.0; - if (!par_beam - || get_grob_direction (par_beam) != dir) - calc_position_and_height (me, &offset, &dy); - else if (columns.size () - && Note_column::get_stem (columns[0]) - && Note_column::get_stem (columns.back ())) - { - /* - trigger set_stem_ends - */ - (void) par_beam->get_property ("quantized-positions"); - - - Drul_array stems (Note_column::get_stem (columns[0]), - Note_column::get_stem (columns.back ())); - - - - - Real ss = 0.5 * Staff_symbol_referencer::staff_space (me); - Real lp = ss * robust_scm2double (stems[LEFT]->get_property ("stem-end-position"), 0.0); - Real rp = ss * robust_scm2double (stems[RIGHT]->get_property ("stem-end-position"), 0.0); - - - offset = lp + dir * (0.5 + scm_to_double (me->get_property ("padding"))); - dy = (rp - lp); - } - + calc_position_and_height (me, &offset, &dy); SCM x = scm_cons (scm_from_double (offset), scm_from_double (offset + dy)); diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index 66930ce6bd..c25d2a9a4e 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2006 Han-Wen Nienhuys + (c) 1998--2007 Han-Wen Nienhuys */ #include "beam.hh" @@ -15,6 +15,7 @@ #include "tuplet-bracket.hh" #include "warn.hh" #include "item.hh" +#include "moment.hh" #include "translator.icc" @@ -26,6 +27,9 @@ struct Tuplet_description bool full_length_; bool full_length_note_; + Moment stop_moment_; + Moment start_moment_; + Moment length_; Tuplet_description () { @@ -64,24 +68,58 @@ Tuplet_engraver::listen_tuplet_span (Stream_event *ev) { Tuplet_description d; d.event_ = ev; + + d.length_ = robust_scm2moment (d.event_->get_property ("length"), + Moment (0)); + d.start_moment_ = now_mom (); + d.stop_moment_ = now_mom () + d.length_; + + for (vsize i=0; i < new_tuplets_.size (); i++) + { + /* + discard duplicates. + */ + if (new_tuplets_[i].stop_moment_ == d.stop_moment_) + return; + } + new_tuplets_.push_back (d); } - else if (dir == STOP && tuplets_.size ()) + else if (dir == STOP) + { + if (tuplets_.size ()) { stopped_tuplets_.push_back (tuplets_.back ()); tuplets_.pop_back (); } + else + ev->origin ()->warning (_f ("No tuplet to end")); + } else - programming_error (_f ("direction of %s invalid: %d", - "tuplet-span-event", int (dir))); + ev->origin ()->programming_error ("direction tuplet-span-event_ invalid."); } void Tuplet_engraver::process_music () { + /* + This may happen if the end of a tuplet is part of a quoted voice. + */ + Moment now = now_mom(); + for (vsize i = tuplets_.size (); i --; ) + { + if (tuplets_[i].stop_moment_ == now) + { + stopped_tuplets_.push_back (tuplets_[i]); + tuplets_.erase (tuplets_.begin () + i); + } + } + for (vsize i = 0; i < stopped_tuplets_.size (); i++) { - if (stopped_tuplets_[i].bracket_) + Spanner *bracket = stopped_tuplets_[i].bracket_; + Spanner *number = stopped_tuplets_[i].number_; + if (bracket) { if (stopped_tuplets_[i].full_length_) { @@ -90,20 +128,21 @@ Tuplet_engraver::process_music () ? get_property ("currentMusicalColumn") : get_property ("currentCommandColumn")); - stopped_tuplets_[i].bracket_->set_bound (RIGHT, col); - stopped_tuplets_[i].number_->set_bound (RIGHT, col); + bracket->set_bound (RIGHT, col); + number->set_bound (RIGHT, col); } - else if (!stopped_tuplets_[i].bracket_->get_bound (RIGHT)) + else if (!bracket->get_bound (RIGHT)) { - stopped_tuplets_[i].bracket_->set_bound (RIGHT, - stopped_tuplets_[i].bracket_->get_bound (LEFT)); - stopped_tuplets_[i].number_->set_bound (RIGHT, - stopped_tuplets_[i].bracket_->get_bound (LEFT)); + bracket->set_bound (RIGHT, + bracket->get_bound (LEFT)); + number->set_bound (RIGHT, + stopped_tuplets_[i].bracket_->get_bound (LEFT)); } + // todo: scrap last_tuplets_, use stopped_tuplets_ only. // clear stopped_tuplets_ at start_translation_timestep - last_tuplets_.push_back (tuplets_[i].bracket_); - last_tuplets_.push_back (tuplets_[i].number_); + last_tuplets_.push_back (bracket); + last_tuplets_.push_back (number); } } stopped_tuplets_.clear (); @@ -129,8 +168,10 @@ Tuplet_engraver::process_music () tuplets_[i].event_->self_scm ()); tuplets_[i].number_->set_object ("bracket", tuplets_[i].bracket_->self_scm ()); tuplets_[i].bracket_->set_object ("tuplet-number", tuplets_[i].number_->self_scm ()); + tuplets_[i].stop_moment_.grace_part_ = 0; + - if (i < tuplets_.size () - 1 && tuplets_[i + 1].bracket_) + if (i + 1 < tuplets_.size () && tuplets_[i + 1].bracket_) Tuplet_bracket::add_tuplet_bracket (tuplets_[i].bracket_, tuplets_[i + 1].bracket_); if (i > 0 && tuplets_[i - 1].bracket_) diff --git a/lily/tuplet-number.cc b/lily/tuplet-number.cc index 31bcbbfa57..b29ab39aaa 100644 --- a/lily/tuplet-number.cc +++ b/lily/tuplet-number.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/tweak-engraver.cc b/lily/tweak-engraver.cc index 81f86adea1..c87902f9ba 100644 --- a/lily/tweak-engraver.cc +++ b/lily/tweak-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ diff --git a/lily/tweak-registration-scheme.cc b/lily/tweak-registration-scheme.cc deleted file mode 100644 index fb81a9cbd6..0000000000 --- a/lily/tweak-registration-scheme.cc +++ /dev/null @@ -1,73 +0,0 @@ -/* - tweak-registration-scheme.cc -- implement Tweak_registry bindings - - source file of the GNU LilyPond music typesetter - - (c) 2004--2006 Han-Wen Nienhuys -*/ - -#include "tweak-registration.hh" -#include "grob.hh" -#include "object-key-undumper.hh" - -LY_DEFINE (ly_clear_tweak_registry, "ly:tweak-clear-registry", - 0, 0, 0, (), - "Clear global tweak registry") -{ - global_registry_->clear (); - return SCM_UNSPECIFIED; -} - -LY_DEFINE (ly_grob_insert_tweak, "ly:grob-insert-tweak", - 2, 0, 0, - (SCM grob, SCM tweak), - "add new tweak for grob.") -{ - Grob *gr = unsmob_grob (grob); - SCM_ASSERT_TYPE (gr, grob, SCM_ARG1, __FUNCTION__, "Grob"); - SCM_ASSERT_TYPE (scm_list_p (tweak) == SCM_BOOL_T - && ly_is_procedure (scm_car (tweak)), - tweak, SCM_ARG2, __FUNCTION__, "Tweak"); - - global_registry_->insert_grob_tweak (gr, tweak); - return SCM_UNSPECIFIED; -} - -LY_DEFINE (ly_grob_replace_tweak, "ly:grob-replace-tweak", - 2, 0, 0, - (SCM grob, SCM tweak), - "Replace tweak for grob.") -{ - Grob *gr = unsmob_grob (grob); - SCM_ASSERT_TYPE (gr, grob, SCM_ARG1, __FUNCTION__, "Grob"); - SCM_ASSERT_TYPE (scm_list_p (tweak) == SCM_BOOL_T - && ly_is_procedure (scm_car (tweak)), - tweak, SCM_ARG2, __FUNCTION__, "Tweak"); - - global_registry_->replace_grob_tweak (gr, tweak); - return SCM_UNSPECIFIED; -} - -LY_DEFINE (ly_tweak_read_keys, "ly:tweak-define-keys", - 1, 0, 0, (SCM keys), - "Read keys") -{ - global_registry_->undumper ()->parse_contents (keys); - return SCM_UNSPECIFIED; -} - -LY_DEFINE (ly_all_tweaks, "ly:all-tweaks", - 0, 0, 0, (), - "all tweaks") -{ - return global_registry_->list_tweaks (); -} - -LY_DEFINE (ly_tweak_read_tweaks, "ly:tweak-define-tweaks", - 1, 0, 0, (SCM tweaks), - "Read tweaks") -{ - for (SCM s = tweaks; scm_is_pair (s); s = scm_cdr (s)) - global_registry_->insert_tweak_from_file (scm_car (s)); - return SCM_UNSPECIFIED; -} diff --git a/lily/tweak-registration.cc b/lily/tweak-registration.cc deleted file mode 100644 index 95ff32d06a..0000000000 --- a/lily/tweak-registration.cc +++ /dev/null @@ -1,138 +0,0 @@ -/* - tweak-registration.cc -- implement Tweak_registry - - source file of the GNU LilyPond music typesetter - - (c) 2004--2006 Han-Wen Nienhuys -*/ - -#include "tweak-registration.hh" - -#include "object-key-undumper.hh" -#include "grob.hh" - -#include "ly-smobs.icc" - -Tweak_registry::Tweak_registry () -{ - undumper_ = 0; - smobify_self (); - undumper_ = new Object_key_undumper (); - undumper_->unprotect (); -} - -Tweak_registry::~Tweak_registry () -{ -} - -void -Tweak_registry::clear () -{ - tweaks_.clear (); - undumper_ = new Object_key_undumper (); - undumper_->unprotect (); -} - -void -Tweak_registry::insert_tweak_from_file (SCM tweak) -{ - SCM skey = scm_car (tweak); - - assert (scm_is_pair (skey) - && scm_car (skey) == ly_symbol2scm ("key")); - - Object_key const *key = undumper_->get_key (scm_to_int (scm_cadr (skey))); - - SCM existing = SCM_EOL; - Tweak_map::const_iterator prev = tweaks_.find (key); - if (prev != tweaks_.end ()) - existing = (*prev).second; - - tweaks_[key] = scm_cons (scm_cdr (tweak), existing); -} - -void -Tweak_registry::insert_grob_tweak (Grob *g, SCM tweak) -{ - Object_key const *key = g->key (); - if (tweaks_.find (key) == tweaks_.end ()) - tweaks_[key] = SCM_EOL; - - tweaks_[key] = scm_cons (tweak, tweaks_[key]); -} - -void -Tweak_registry::replace_grob_tweak (Grob *g, SCM tweak) -{ - Object_key const *key = g->key (); - tweaks_[key] = scm_cons (tweak, SCM_EOL); -} - -SCM -Tweak_registry::get_tweaks (Grob *g) -{ - Object_key const *key = g->key (); - if (tweaks_.find (key) == tweaks_.end ()) - return SCM_EOL; - return tweaks_[key]; -} - -SCM -Tweak_registry::list_tweaks () -{ - SCM retval = SCM_EOL; - for (Tweak_map::const_iterator i (tweaks_.begin ()); - i != tweaks_.end (); - i++) - { - Object_key const *key = (*i).first; - for (SCM t = (*i).second; scm_is_pair (t); t = scm_cdr (t)) - retval = scm_cons (scm_cons (key->self_scm (), scm_car (t)), retval); - } - - return retval; -} - -SCM -Tweak_registry::mark_smob (SCM smob) -{ - Tweak_registry *me = (Tweak_registry *) SCM_CELL_WORD_1 (smob); - - for (Tweak_map::const_iterator i (me->tweaks_.begin ()); - i != me->tweaks_.end (); - i++) - { - scm_gc_mark ((*i).first->self_scm ()); - scm_gc_mark ((*i).second); - } - - if (me->undumper_) - scm_gc_mark (me->undumper_->self_scm ()); - - return SCM_EOL; -} - -int -Tweak_registry::print_smob (SCM smob, SCM port, scm_print_state*) -{ - (void) smob; // smother warning. - scm_puts ("#", port); - return 1; -} - -Object_key_undumper * -Tweak_registry::undumper () const -{ - return undumper_; -} - -IMPLEMENT_DEFAULT_EQUAL_P (Tweak_registry); -IMPLEMENT_SMOBS (Tweak_registry); - -Tweak_registry *global_registry_; - -void -init_global_tweak_registry () -{ - global_registry_ = new Tweak_registry (); -} diff --git a/lily/type-swallow-translator.cc b/lily/type-swallow-translator.cc index d69037c7b2..87510de0d4 100644 --- a/lily/type-swallow-translator.cc +++ b/lily/type-swallow-translator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "translator.hh" diff --git a/lily/unfolded-repeat-iterator.cc b/lily/unfolded-repeat-iterator.cc index 8516368f0a..46a8bfd047 100644 --- a/lily/unfolded-repeat-iterator.cc +++ b/lily/unfolded-repeat-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "music.hh" diff --git a/lily/vaticana-ligature-engraver.cc b/lily/vaticana-ligature-engraver.cc index 608cb16c66..5618465120 100644 --- a/lily/vaticana-ligature-engraver.cc +++ b/lily/vaticana-ligature-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Juergen Reuter + (c) 2003--2007 Juergen Reuter */ #include "gregorian-ligature-engraver.hh" @@ -681,7 +681,7 @@ Vaticana_ligature_engraver::transform_heads (Spanner *ligature, if (prev_primitive) prev_primitive->set_property ("glyph-name", - scm_makfrom0str (prev_glyph_name.c_str ())); + ly_string2scm (prev_glyph_name)); /* * In the backend, flexa shapes and joins need to know about line @@ -699,7 +699,7 @@ Vaticana_ligature_engraver::transform_heads (Spanner *ligature, } prev_primitive->set_property ("glyph-name", - scm_makfrom0str (prev_glyph_name.c_str ())); + ly_string2scm (prev_glyph_name)); align_heads (primitives, flexa_width, thickness); diff --git a/lily/vaticana-ligature.cc b/lily/vaticana-ligature.cc index 9e97482d02..58978a0839 100644 --- a/lily/vaticana-ligature.cc +++ b/lily/vaticana-ligature.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2003--2006 Juergen Reuter + (c) 2003--2007 Juergen Reuter */ #include "vaticana-ligature.hh" diff --git a/lily/vertical-align-engraver.cc b/lily/vertical-align-engraver.cc index 830aa78fd7..64e7333f13 100644 --- a/lily/vertical-align-engraver.cc +++ b/lily/vertical-align-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "context.hh" @@ -102,7 +102,7 @@ Vertical_align_engraver::acknowledge_axis_group (Grob_info i) { string id = i.context ()->id_string (); - scm_hash_set_x (id_to_group_hashtab_, scm_makfrom0str (id.c_str ()), + scm_hash_set_x (id_to_group_hashtab_, ly_string2scm (id), i.grob ()->self_scm ()); SCM before_id = i.context ()->get_property ("alignAboveContext"); diff --git a/lily/vertically-spaced-context-engraver.cc b/lily/vertically-spaced-context-engraver.cc index aa29003d87..2912c0a479 100644 --- a/lily/vertically-spaced-context-engraver.cc +++ b/lily/vertically-spaced-context-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/volta-bracket.cc b/lily/volta-bracket.cc index 9c2e4ea669..49018d8adb 100644 --- a/lily/volta-bracket.cc +++ b/lily/volta-bracket.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2007 Jan Nieuwenhuizen */ #include @@ -99,7 +99,7 @@ Volta_bracket_interface::print (SCM smob) num.align_to (Y_AXIS, UP); num.translate_axis (-0.5, Y_AXIS); total.add_at_edge (X_AXIS, LEFT, num, - num.extent (X_AXIS).length () - - 1.0, 0); + - 1.0); } total.translate_axis (left, X_AXIS); diff --git a/lily/volta-engraver.cc b/lily/volta-engraver.cc index 532ac965e6..604c53c573 100644 --- a/lily/volta-engraver.cc +++ b/lily/volta-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2007 Han-Wen Nienhuys */ #include "engraver.hh" diff --git a/lily/volta-repeat-iterator.cc b/lily/volta-repeat-iterator.cc index 1828dfdbca..23f8edd9c5 100644 --- a/lily/volta-repeat-iterator.cc +++ b/lily/volta-repeat-iterator.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "music.hh" @@ -98,7 +98,7 @@ Volta_repeat_iterator::next_element (bool side_effect) if (done_count_ <= alt_count_) add_repeat_command (scm_list_n (ly_symbol2scm ("volta"), - scm_makfrom0str (repstr.c_str ()), SCM_UNDEFINED)); + ly_string2scm (repstr), SCM_UNDEFINED)); } else add_repeat_command (ly_symbol2scm ("end-repeat")); diff --git a/ly/declarations-init.ly b/ly/declarations-init.ly index 210b81daf3..17329521a0 100644 --- a/ly/declarations-init.ly +++ b/ly/declarations-init.ly @@ -8,6 +8,7 @@ breve = #(ly:make-duration -1 0) longa = #(ly:make-duration -2 0) maxima = #(ly:make-duration -3 0) +\include "markup-init.ly" \include "music-functions-init.ly" %% default note names are dutch diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index fc0b867e82..ea7d9c5db0 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -206,7 +206,8 @@ contained staves are not connected vertically." \consists "Note_heads_engraver" \consists "Dots_engraver" \consists "Rest_engraver" - + \consists "Tweak_engraver" + %% switch on to make stem directions interpolate for the %% center line. % \consists "Melody_engraver" @@ -227,12 +228,13 @@ contained staves are not connected vertically." \consists "Text_engraver" \consists "Dynamic_engraver" \consists "Fingering_engraver" - \consists "Bend_after_engraver" + \consists "Bend_engraver" \consists "Script_engraver" \consists "Script_column_engraver" \consists "Rhythmic_column_engraver" \consists "Note_spacing_engraver" + \consists "Spanner_break_forbid_engraver" \consists "Phrasing_slur_engraver" \consists "Cluster_spanner_engraver" \consists "Slur_engraver" @@ -363,7 +365,10 @@ staffs, with a bracket in front and spanning bar lines. " \description " Corresponds to a voice with lyrics. Handles the printing of a single line of lyrics. " - \name "Lyrics" + \name "Lyrics" + instrumentName = #'() + shortInstrumentName = #'() + \consists "Lyric_engraver" \consists "Extender_engraver" \consists "Hyphen_engraver" @@ -372,6 +377,7 @@ printing of a single line of lyrics. " \consists "Skip_event_swallow_translator" \consists "Font_size_engraver" \consists "Hara_kiri_engraver" + \override VerticalAxisGroup #'remove-first = ##t \override VerticalAxisGroup #'remove-empty = ##t \override SeparationItem #'padding = #0.2 @@ -475,7 +481,6 @@ AncientRemoveEmptyStaffContext = \context { \consists "Vertical_align_engraver" \consists "Stanza_number_align_engraver" \consists "Bar_number_engraver" - \consists "Tweak_engraver" \consists "Parenthesis_engraver" \defaultchild "Staff" @@ -521,6 +526,8 @@ AncientRemoveEmptyStaffContext = \context { explicitClefVisibility = #all-visible explicitKeySignatureVisibility = #all-visible + implicitTimeSignatureVisibility = #end-of-line-invisible + autoBeamSettings = #default-auto-beam-settings autoBeaming = ##t autoBeamCheck = #default-auto-beam-check @@ -604,6 +611,9 @@ AncientRemoveEmptyStaffContext = \context { keepAliveInterfaces = #'( rhythmic-grob-interface lyric-interface + + ;; need this, as stanza numbers are items, and appear only once. + stanza-number-interface percent-repeat-interface) quotedEventTypes = #'( note-event @@ -782,7 +792,7 @@ AncientRemoveEmptyStaffContext = \context { %% Select vaticana style font. \override KeySignature #'style = #'vaticana - \override Accidental #'style = #'vaticana + \override Accidental #'glyph-name-alist = #alteration-vaticana-glyph-name-alist \override Custos #'style = #'vaticana \override Custos #'neutral-position = #3 \override Custos #'neutral-direction = #DOWN @@ -793,7 +803,7 @@ AncientRemoveEmptyStaffContext = \context { \Voice \name "GregorianTranscriptionVoice" \alias "Voice" - + %% Removing ligature bracket engraver without replacing it by some %% other ligature engraver would cause a "Junking event: `LigatureEvent'" %% warning for every "\[" and "\]". Therefore, we make the grob @@ -885,7 +895,7 @@ AncientRemoveEmptyStaffContext = \context { %% Select mensural style font. \override TimeSignature #'style = #'mensural \override KeySignature #'style = #'mensural - \override Accidental #'style = #'mensural + \override Accidental #'glyph-name-alist = #alteration-mensural-glyph-name-alist \override Custos #'style = #'mensural \override Custos #'neutral-position = #3 \override Custos #'neutral-direction = #DOWN diff --git a/ly/init.ly b/ly/init.ly index eab90ef3d5..c3db3b3717 100644 --- a/ly/init.ly +++ b/ly/init.ly @@ -4,11 +4,6 @@ #(if (and #t (defined? 'set-debug-cell-accesses!)) (set-debug-cell-accesses! 5000)) -#(define-public midi-debug #f) - - - - \version "2.10.0" \include "declarations-init.ly" @@ -19,7 +14,8 @@ #(define output-count 0) #(define $defaultheader #f) #(define version-seen #f) - +#(define expect-error #f) +#(define output-empty-score-list #f) #(use-modules (scm clip-region)) \maininput @@ -38,7 +34,15 @@ (defined? 'input-file-name)) (version-not-seen-message input-file-name)) -#(if (pair? toplevel-scores) - (toplevel-book-handler +#(if (or (pair? toplevel-scores) output-empty-score-list) + ((if (defined? 'default-toplevel-book-handler) + default-toplevel-book-handler + toplevel-book-handler) parser (apply ly:make-book $defaultpaper $defaultheader toplevel-scores))) + + +#(if (eq? expect-error (ly:parser-has-error? parser)) + (ly:parser-clear-error parser) + (if expect-error + (ly:parser-error parser (_ "expected error, but none found")))) diff --git a/ly/lilypond-book-preamble.ly b/ly/lilypond-book-preamble.ly index aa82b7330c..a7bea92f15 100644 --- a/ly/lilypond-book-preamble.ly +++ b/ly/lilypond-book-preamble.ly @@ -1,12 +1,30 @@ \version "2.10.0" -#(set! toplevel-score-handler print-score-with-defaults) -#(set! toplevel-music-handler - (lambda (p m) - (if (not (eq? (ly:music-property m 'void) #t)) - (print-score-with-defaults - p (scorify-music m p))))) +%% toplevel \book gets output per page, +%% everything else gets output per system/title +#(define default-toplevel-book-handler + print-book-with-defaults-as-systems ) + +#(define toplevel-book-handler + (lambda ( . rest) + (set! output-empty-score-list #f) + (apply print-book-with-defaults rest))) + +#(define toplevel-music-handler + (lambda ( . rest) + (apply collect-music-for-book rest))) + +#(define toplevel-score-handler + (lambda ( . rest) + (apply collect-scores-for-book rest))) + +#(define toplevel-text-handler + (lambda ( . rest) + (apply collect-scores-for-book rest))) + +#(set! output-empty-score-list #t) + #(ly:set-option (quote no-point-and-click)) #(define inside-lilypond-book #t) diff --git a/ly/markup-init.ly b/ly/markup-init.ly new file mode 100644 index 0000000000..c40bd88ad4 --- /dev/null +++ b/ly/markup-init.ly @@ -0,0 +1,87 @@ +%% -*- Mode: Scheme -*- + +\version "2.11.9" + +%%;; to be define later, in a closure +#(define-public toplevel-module-define-public! #f) +#(define-public toplevel-module-ref #f) +#(let ((toplevel-module (current-module))) + (set! toplevel-module-define-public! + (lambda (symbol value) + (module-define! toplevel-module symbol value) + (module-export! toplevel-module (list symbol)))) + (set! toplevel-module-ref + (lambda (symbol) + (module-ref toplevel-module symbol)))) + +#(defmacro-public define-public-toplevel + (first-arg . rest) + "Define a public variable or function in the toplevel module: + (define-public-toplevel variable-name value) +or: + (define-public-toplevel (function-name . args) + ..body..)" + (if (symbol? first-arg) + ;; (define-public-toplevel symbol value) + (let ((symbol first-arg) + (value (car rest))) + `(toplevel-module-define-public! ',symbol ,value)) + ;; (define-public-toplevel (function-name . args) . body) + (let ((function-name (car first-arg)) + (arg-list (cdr first-arg)) + (body rest)) + `(toplevel-module-define-public! + ',function-name + (let ((proc (lambda ,arg-list + ,@body))) + (set-procedure-property! proc + 'name + ',function-name) + proc))))) + +#(defmacro-public define-markup-command (command-and-args signature . body) + " +* Define a COMMAND-markup function after command-and-args and body, +register COMMAND-markup and its signature, + +* add COMMAND-markup to markup-function-list, + +* sets COMMAND-markup markup-signature and markup-keyword object properties, + +* define a make-COMMAND-markup function. + +Syntax: + (define-markup-command (COMMAND layout props arg1 arg2 ...) + (arg1-type? arg2-type? ...) + \"documentation string\" + ...command body...) +or: + (define-markup-command COMMAND (arg1-type? arg2-type? ...) function) +" + (let* ((command (if (pair? command-and-args) + (car command-and-args) + command-and-args)) + (command-name (string->symbol (format #f "~a-markup" command))) + (make-markup-name (string->symbol (format #f "make-~a-markup" command)))) + `(begin + ;; define the COMMAND-markup procedure in toplevel module + ,(if (pair? command-and-args) + ;; 1/ (define (COMMAND-markup layout props arg1 arg2 ...) + ;; ..command body)) + `(define-public-toplevel (,command-name ,@(cdr command-and-args)) + ,@body) + ;; 2/ (define (COMMAND-markup . args) (apply function args)) + (let ((args (gensym "args")) + (command (car body))) + `(define-public-toplevel (,command-name . ,args) + (apply ,command ,args)))) + (let ((command-proc (toplevel-module-ref ',command-name))) + ;; register its command signature + (set! (markup-command-signature command-proc) + (list ,@signature)) + ;; define the make-COMMAND-markup procedure in the toplevel module + (define-public-toplevel (,make-markup-name . args) + (make-markup command-proc + ,(symbol->string make-markup-name) + (list ,@signature) + args)))))) diff --git a/ly/music-functions-init.ly b/ly/music-functions-init.ly index 05ed471320..2a8af551e9 100644 --- a/ly/music-functions-init.ly +++ b/ly/music-functions-init.ly @@ -14,13 +14,12 @@ acciaccatura = #(def-grace-function startAcciaccaturaMusic stopAcciaccaturaMusic) -addquote = +addQuote = #(define-music-function (parser location name music) (string? ly:music?) - "Add a piece of music to be quoted " + (_i "Add a piece of music to be quoted ") (add-quotable parser name music) (make-music 'SequentialMusic 'void #t)) - afterGraceFraction = #(cons 6 8) @@ -153,8 +152,7 @@ bendAfter = clef = #(define-music-function (parser location type) (string?) - - "Set the current clef." + (_i "Set the current clef.") (make-clef-set type)) @@ -177,9 +175,6 @@ cueDuring = 'quoted-voice-direction dir 'origin location)) -%% The following causes an error with guile 1.6.8 (guile 1.6.7 and 1.8.x are fine) -#(use-modules (scm display-lily)) - displayLilyMusic = #(define-music-function (parser location music) (ly:music?) (newline) @@ -194,9 +189,8 @@ displayMusic = featherDurations= #(define-music-function (parser location factor argument) (ly:moment? ly:music?) - - "Rearrange durations in ARGUMENT so there is an -acceleration/deceleration. " + (_i "Rearrange durations in ARGUMENT so there is an +acceleration/deceleration. ") (let* ((orig-duration (ly:music-length argument)) @@ -304,9 +298,9 @@ overrideProperty = (string? symbol? scheme?) - "Set @var{property} to @var{value} in all grobs named @var{name}. + (_i "Set @var{property} to @var{value} in all grobs named @var{name}. The @var{name} argument is a string of the form @code{\"Context.GrobName\"} -or @code{\"GrobName\"}" +or @code{\"GrobName\"}") (let* ((name-components (string-split name #\.)) @@ -346,7 +340,7 @@ removeWithTag = octave = #(define-music-function (parser location pitch-note) (ly:music?) - "octave check" + (_i "octave check") (make-music 'RelativeOctaveCheck 'origin location @@ -387,7 +381,7 @@ pitchedTrill = parenthesize = #(define-music-function (parser loc arg) (ly:music?) - "Tag @var{arg} to be parenthesized." + (_i "Tag @var{arg} to be parenthesized.") (set! (ly:music-property arg 'parenthesize) #t) arg) @@ -397,7 +391,7 @@ parenthesize = parallelMusic = #(define-music-function (parser location voice-ids music) (list? ly:music?) - "Define parallel music sequences, separated by '|' (bar check signs), + (_i "Define parallel music sequences, separated by '|' (bar check signs), and assign them to the identifiers provided in @var{voice-ids}. @var{voice-ids}: a list of music identifiers (symbols containing only letters) @@ -416,7 +410,7 @@ Example: B = { d d | e e | } C = { e e | f f | } @end verbatim -" +") (let* ((voices (apply circular-list (make-list (length voice-ids) (list)))) (current-voices voices) (current-sequence (list))) @@ -503,7 +497,7 @@ resetRelativeOctave = #(define-music-function (parser location reference-note) (ly:music?) - "Set the octave inside a \\relative section." + (_i "Set the octave inside a \\relative section.") (let* ((notes (ly:music-property reference-note 'elements)) @@ -521,8 +515,7 @@ resetRelativeOctave = shiftDurations = #(define-music-function (parser location dur dots arg) (integer? integer? ly:music?) - "" - + (_i "") (music-map (lambda (x) @@ -530,12 +523,13 @@ shiftDurations = spacingTweaks = #(define-music-function (parser location parameters) (list?) - "Set the system stretch, by reading the 'system-stretch property of - the `parameters' assoc list." + (_i "Set the system stretch, by reading the 'system-stretch property of +the `parameters' assoc list.") #{ \overrideProperty #"Score.NonMusicalPaperColumn" #'line-break-system-details - #$(list (cons 'alignment-extra-space (cdr (assoc 'system-stretch parameters)))) + #$(list (cons 'alignment-extra-space (cdr (assoc 'system-stretch parameters))) + (cons 'system-Y-extent (cdr (assoc 'system-Y-extent parameters)))) #}) %% Parser used to read page-layout file, and then retreive score tweaks. @@ -543,8 +537,8 @@ spacingTweaks = includePageLayoutFile = #(define-music-function (parser location) () - "If page breaks and tweak dump is not asked, and the file - -page-layout.ly exists, include it." + (_i "If page breaks and tweak dump is not asked, and the file +-page-layout.ly exists, include it.") (if (not (ly:get-option 'dump-tweaks)) (let ((tweak-filename (format #f "~a-page-layout.ly" (ly:parser-output-name parser)))) @@ -560,7 +554,7 @@ includePageLayoutFile = rightHandFinger = #(define-music-function (parser location finger) (number-or-string?) - "Define a StrokeFingerEvent" + (_i "Define a StrokeFingerEvent") (apply make-music (append @@ -573,7 +567,7 @@ rightHandFinger = scoreTweak = #(define-music-function (parser location name) (string?) - "Include the score tweak, if exists." + (_i "Include the score tweak, if exists.") (if (and page-layout-parser (not (ly:get-option 'dump-tweaks))) (let ((tweak-music (ly:parser-lookup page-layout-parser (string->symbol name)))) @@ -587,11 +581,11 @@ transposedCueDuring = (parser location what dir pitch-note main-music) (string? ly:dir? ly:music? ly:music?) - "Insert notes from the part @var{what} into a voice called @code{cue}, + (_i "Insert notes from the part @var{what} into a voice called @code{cue}, using the transposition defined by @var{pitch-note}. This happens simultaneously with @var{main-music}, which is usually a rest. The argument @var{dir} determines whether the cue notes should be notated -as a first or second voice." +as a first or second voice.") (make-music 'QuoteMusic 'element main-music @@ -606,7 +600,7 @@ as a first or second voice." transposition = #(define-music-function (parser location pitch-note) (ly:music?) - "Set instrument transposition" + (_i "Set instrument transposition") (context-spec-music (make-property-set 'instrumentTransposition @@ -616,8 +610,7 @@ transposition = tweak = #(define-music-function (parser location sym val arg) (symbol? scheme? ly:music?) - "Add @code{sym . val} to the @code{tweaks} property of @var{arg}." - + (_i "Add @code{sym . val} to the @code{tweaks} property of @var{arg}.") (set! (ly:music-property arg 'tweaks) @@ -628,7 +621,7 @@ tweak = #(define-music-function (parser location sym val arg) tag = #(define-music-function (parser location tag arg) (symbol? ly:music?) - "Add @var{tag} to the @code{tags} property of @var{arg}." + (_i "Add @var{tag} to the @code{tags} property of @var{arg}.") (set! (ly:music-property arg 'tags) @@ -645,7 +638,7 @@ unfoldRepeats = withMusicProperty = #(define-music-function (parser location sym val music) (symbol? scheme? ly:music?) - "Set @var{sym} to @var{val} in @var{music}." + (_i "Set @var{sym} to @var{val} in @var{music}.") (set! (ly:music-property music sym) val) music) diff --git a/ly/paper-defaults.ly b/ly/paper-defaults.ly index 65303f9f1c..8ea1159204 100644 --- a/ly/paper-defaults.ly +++ b/ly/paper-defaults.ly @@ -1,4 +1,4 @@ -\version "2.10.0" +\version "2.11.11" #(use-modules (scm layout-page-layout)) \paper { @@ -33,7 +33,7 @@ %% ugh. hard coded? %% - #(layout-set-staff-size (* 20.0 pt)) + #(layout-set-absolute-staff-size (* 20.0 pt)) #(define-public score-title-properties diff --git a/ly/performer-init.ly b/ly/performer-init.ly index 24f0da2b81..b48bd5454d 100644 --- a/ly/performer-init.ly +++ b/ly/performer-init.ly @@ -30,9 +30,7 @@ \context { \type "Performer_group" \name Voice - % The order of the dynamic performers is significant: absolute dynamic events must override crescendo events in midi. - \consists "Span_dynamic_performer" - \consists "Dynamic_performer" + \consists "Dynamic_performer" \consists "Tie_performer" \consists "Piano_pedal_performer" \consists "Note_performer" diff --git a/make/doclang-targets.make b/make/doclang-targets.make index 6d46749eef..1411b8c5f7 100644 --- a/make/doclang-targets.make +++ b/make/doclang-targets.make @@ -20,28 +20,11 @@ $(outdir)/lilypond/index.html: $(outdir)/lilypond.nexi doc-po $(outdir)/lilypond.html: $(outdir)/lilypond.nexi -$(MAKEINFO) -I$(outdir) --output=$@ --css-include=$(top-src-dir)/Documentation/texinfo.css --html --no-split --no-headers $< -local-WWW: png-ln $(outdir)/lilypond.html $(outdir)/lilypond/index.html deep-ln lang-merge +local-WWW: $(outdir)/lilypond.html $(outdir)/lilypond/index.html lang-merge lang-merge: $(foreach i, $(shell find $(outdir) -name '*.html' | xargs grep -L --label="" 'UNTRANSLATED NODE: IGNORE ME'), ln -f $(i) $(i:$(outdir)/%.html=$(depth)/Documentation/user/$(outdir)/%.$(ISOLANG).html) &&) true -png-ln: - mkdir -p $(outdir)/lilypond - # makeinfo is broken, it MUST have PNGs in output dir - # symlinking PNGs... - $(foreach i, $(shell find $(depth)/Documentation/user/$(outdir) -maxdepth 1 -name '*.png'), ln -sf ../$(i) $(i:$(depth)/Documentation/user/$(outdir)/%.png=$(outdir)/%.png) &&) true - $(foreach i, $(shell find $(depth)/Documentation/user/$(outdir)/lilypond -name '*.png'), ln -sf ../../$(i) $(i:$(depth)/Documentation/user/$(outdir)/%.png=$(outdir)/%.png) &&) true - -# Links referred to by Documentation index -# BROKEN: the following makes broken symlinks -#LILYPOND_LINKS = Reference-Manual.html Tutorial.html Ly2dvi.html Midi2ly.html - - -deep-ln: - mkdir -p $(outdir)/lilypond - cd $(outdir)/lilypond && $(foreach i, $(LILYPOND_LINKS),\ - rm -f $(i) && ln -s lilypond.html $(i) &&) true - local-WWW-clean: deep-WWW-clean deep-WWW-clean: diff --git a/make/lilypond-vars.make b/make/lilypond-vars.make index 1e60313993..6c15832981 100644 --- a/make/lilypond-vars.make +++ b/make/lilypond-vars.make @@ -22,14 +22,14 @@ the-script-dir=$(wildcard $(script-dir)) ABC2LY = $(script-dir)/abc2ly.py CONVERT_LY = $(script-dir)/convert-ly.py LILYPOND_BOOK = $(script-dir)/lilypond-book.py -LILYPOND_BOOK_INCLUDES = -I $(src-dir)/ -I $(outdir) -I $(input-dir) -I $(input-dir)/regression/ -I $(input-dir)/manual/ -I $(input-dir)/tutorial/ -I $(top-build-dir)/mf/$(outconfbase)/ -I $(top-build-dir)/mf/out/ +LILYPOND_BOOK_INCLUDES = -I $(src-dir)/ -I $(outdir) -I $(input-dir) -I $(input-dir)/regression/ -I $(input-dir)/manual/ -I $(input-dir)/tutorial/ -I $(top-build-dir)/mf/$(outconfbase)/ -I $(top-build-dir)/mf/out/ -I $(input-dir)/test/ ## override from cmd line to speed up. ANTI_ALIAS_FACTOR=2 LILYPOND_JOBS=$(if $(CPU_COUNT),-djob-count=$(CPU_COUNT),) LILYPOND_BOOK_LILYPOND_FLAGS=--backend=eps --formats=ps,png,pdf $(LILYPOND_JOBS) -dinclude-eps-fonts -dgs-load-fonts --header=texidoc -I $(top-src-dir)/input/manual -dcheck-internal-types -ddump-signatures -danti-alias-factor=$(ANTI_ALIAS_FACTOR) LILYPOND_BOOK_VERBOSE = --verbose -LILYPOND_BOOK_FLAGS = --process="$(LILYPOND_BINARY) $(LILYPOND_BOOK_LILYPOND_FLAGS)" $(LILYPOND_BOOK_VERBOSE) +LILYPOND_BOOK_FLAGS = --process="$(LILYPOND_BINARY) $(LILYPOND_BOOK_LILYPOND_FLAGS)" $(LILYPOND_BOOK_VERBOSE) TEXINPUTS=$(top-src-dir)/tex/:: export TEXINPUTS diff --git a/make/ly-rules.make b/make/ly-rules.make index 8b59dc9619..2e9e5ff022 100644 --- a/make/ly-rules.make +++ b/make/ly-rules.make @@ -7,12 +7,10 @@ $(outdir)/%.latex: %.doc # don't do ``cd $(outdir)'', and assume that $(outdir)/.. is the src dir. # it is not, for --srcdir builds $(outdir)/%.texi: %.tely - rm -f $$(grep -LF '% eof' $(outdir)/lily-*systems.*tex 2>/dev/null) $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BINARY) $(LILYPOND_BOOK_INCLUDES)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) $(LILYPOND_BOOK_FLAGS) $< $(outdir)/%.texi: $(outdir)/%.tely - rm -f $$(grep -LF '% eof' $(outdir)/lily-*systems.*tex 2>/dev/null) $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BINARY) $(LILYPOND_BOOK_INCLUDES)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) $(LILYPOND_BOOK_FLAGS) $< # # DON'T REMOVE SOURCE FILES, otherwise the .TEXI ALWAYS OUT OF DATE. diff --git a/make/ly-targets.make b/make/ly-targets.make index d01701d859..a2d621b154 100644 --- a/make/ly-targets.make +++ b/make/ly-targets.make @@ -6,9 +6,3 @@ local-convert-ly: local-help: local-ly-help -local-ly-help: - @echo -e "\ - convert-ly convert all LilyPond sources\n\ -"\ -# - diff --git a/make/lysdoc-targets.make b/make/lysdoc-targets.make index 2de20828a9..cf5a9d2e67 100644 --- a/make/lysdoc-targets.make +++ b/make/lysdoc-targets.make @@ -3,3 +3,4 @@ local-WWW: $(outdir)/collated-files.html $(outdir)/collated-files.pdf #.PRECIOUS: $(outdir)/$(NAME).texi + diff --git a/make/mutopia-rules.make b/make/mutopia-rules.make index 4d0ae69548..de5152e7d2 100644 --- a/make/mutopia-rules.make +++ b/make/mutopia-rules.make @@ -10,6 +10,6 @@ $(outdir)/%.ly: %.abc # hmm. notdir builds src-dir builds? $(outdir)/%.png $(outdir)/%.pdf $(outdir)/%.ly $(outdir)/%.ps: $(outdir)/%.ly - cd $(outdir); $(LILYPOND_BINARY) --pdf --png -ddump-signatures -danti-alias-factor=2 -ddelete-intermediate-files -dno-point-and-click -I $(call absdir,$(src-dir))/ $(notdir $<) + cd $(outdir); $(LILYPOND_BINARY) --pdf --png -dlog-file="'$(basename $(notdir $<)).log" -ddump-signatures -danti-alias-factor=2 -ddelete-intermediate-files -dno-point-and-click -I $(call absdir,$(src-dir))/ $(notdir $<) touch $(outdir)/$(basename $(notdir $<)).png diff --git a/mf/GNUmakefile b/mf/GNUmakefile index 866bfbbad9..1492d1790b 100644 --- a/mf/GNUmakefile +++ b/mf/GNUmakefile @@ -6,10 +6,9 @@ LOCALSTEPMAKE_TEMPLATES=lilypond include $(depth)/make/stepmake.make -# hangs on feta23 MFTRACE_FLAGS= --simplify -EXTRA_DIST_FILES += README feta.tex +EXTRA_DIST_FILES += README # We don't use $(MF_FILES), because there's more .mf cruft here FETA_MF_FILES = $(call src-wildcard,feta[0-9]*.mf)\ @@ -36,11 +35,8 @@ NCSB_INSTALL_DIR=$(local_lilypond_datadir)/fonts/otf LOG_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.log) LISP_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.lisp) -TEXTABLES = $(FETA_MF_FILES:%.mf=$(outdir)/%.tex) -ENC_FILES = $(TEXTABLES:.tex=.enc) -TFM_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.tfm)\ - $(SAUTER_FONTS:%=$(outdir)/%.tfm) - +ENC_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.enc) +TFM_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.tfm) ENCODING_FILE=$(findstring $( % +% +% also show in other configuration wrt staff lines. +% +def draw_shifted_too = +if test > 0: + fet_beginchar ("shifted too", ""); + set_char_box (0, 0,0,0); + currentpicture := remember_pic; + + draw_staff (-2, 2, 0.5); + fet_endchar; +fi; +enddef; + + + % % Accidentals from various sources, notably % @@ -15,12 +29,27 @@ % +% +% Naming for microtonal +% +% BASES SLASHES STEMS +% +% mirroredflat.flat.slashslash +% + +% standard sharp: +% sharp.slashslash.stemstem +% sharp.slashslash.stem + + fet_begingroup ("accidentals"); save remember_pic; picture remember_pic; +save sharp_beamheight; +sharp_beamheight# := 0.3 staff_space# + stafflinethickness#; % % The beams of most sharps have horizontal endings (as if drawn with @@ -29,28 +58,27 @@ picture remember_pic; % def draw_meta_sharp (expr width, offset) = - save beamheight, beamwidth, beamslope; + save beamwidth, beamslope; save ne, nw_dist; pair ne, nw_dist; beamwidth := width; - beamheight# := 0.3 staff_space# + stafflinethickness#; - define_whole_vertical_blacker_pixels (beamheight); + define_whole_vertical_blacker_pixels (sharp_beamheight); clearxy; - beamslope = beamheight / beamwidth; + beamslope = sharp_beamheight / beamwidth; pickup pencircle scaled 2 blot_diameter; rt x2 - lft x1 = beamwidth; - y2 - y1 = beamheight; + y2 - y1 = sharp_beamheight; .5 [z1, z3] = (.5 w, offset); x3 = x2; - top y2 - bot y3 = beamheight; + top y2 - bot y3 = sharp_beamheight; x4 = x1; - top y1 - bot y4 = beamheight; + top y1 - bot y4 = sharp_beamheight; ne = unitvector (z2 - z1); nw_dist = (ne rotated 90) * blot_diameter; @@ -69,7 +97,7 @@ def draw_meta_sharp (expr width, offset) = enddef; -fet_beginchar ("Sharp", "2"); +fet_beginchar ("Sharp", "sharp"); save stem, stemx, stemwidth; save outer_space, interbeam; @@ -110,21 +138,9 @@ fet_beginchar ("Sharp", "2"); draw_staff (-2, 2, 0); fet_endchar; +draw_shifted_too; -if test > 0: - fet_beginchar ("Sharp", "2"); - - set_char_box (0, 1.1 staff_space#, - 1.5 staff_space#, 1.5 staff_space#); - - currentpicture := remember_pic; - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - -fet_beginchar ("1/2 Sharp", "1"); +fet_beginchar ("1/2 Sharp", "sharp.slashslash.stem"); save stem, stemwidth; save outer_space, interbeam; @@ -160,21 +176,100 @@ fet_beginchar ("1/2 Sharp", "1"); draw_staff (-2, 2, 0); fet_endchar; +draw_shifted_too; -if test > 0: - fet_beginchar ("1/2 Sharp", "1"); +fet_beginchar ("Sharp (3 beams)", "sharp.slashslashslash.stemstem"); + save stem, stemx, stemwidth; + save outer_space, interbeam; + save sharp_beamheight; - set_char_box (0, 0.7 staff_space#, - 1.5 staff_space#, 1.5 staff_space#); + sharp_beamheight# := 0.22 staff_space# + stafflinethickness#; - currentpicture := remember_pic; - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; + stemwidth# := stafflinethickness# + .05 staff_space#; + define_whole_blacker_pixels (stemwidth); + interbeam := 1.2 staff_space_rounded; + + set_char_box (0, 1.1 staff_space#, + 1.5 staff_space#, 1.5 staff_space#); -fet_beginchar ("3/4 Sharp", "3"); + stem := 7 / 16 * w; + stemx := hround stem; + outer_space := hround ((w - stemx - stemwidth) / 2); + + w := 2 outer_space + stemx + stemwidth; + d := d - feta_space_shift; + + draw_meta_sharp (.88 w, -.5 interbeam); + draw_meta_sharp (w, 0); + draw_meta_sharp (.88 w, -.5 interbeam + vround interbeam); + + pickup pencircle scaled stemwidth; + + lft x5 = lft x6 = outer_space; + lft x7 = lft x8 = outer_space + stemx; + bot y5 = -d; + top y6 = vround (1.5 staff_space - stem * beamslope); + bot y7 = -top y6 + feta_space_shift; + top y8 = h; + + labels (5, 6, 7, 8); + + draw_gridline (z5, z6, stemwidth); + draw_gridline (z7, z8, stemwidth); + + remember_pic := currentpicture; + + draw_staff (-2, 2, 0); +fet_endchar; + +draw_shifted_too; + +fet_beginchar ("1/2 Sharp (3 beams)", "sharp.slashslashslash.stem"); + save stem, stemx, stemwidth; + save outer_space, interbeam; + save sharp_beamheight; + + sharp_beamheight# := 0.22 staff_space# + stafflinethickness#; + + stemwidth# := stafflinethickness# + .05 staff_space#; + define_whole_blacker_pixels (stemwidth); + + interbeam := 1.2 staff_space_rounded; + + set_char_box (0, 0.95 staff_space#, + 1.3 staff_space#, 1.3 staff_space#); + + stem := 7 / 16 * w; + outer_space := hround ((w - stemwidth) / 2); + w := 2 outer_space + stemwidth; + d := d - feta_space_shift; + + draw_meta_sharp (.8 w, -.5 interbeam); + draw_meta_sharp (w, 0); + draw_meta_sharp (.8 w, -.5 interbeam + vround interbeam); + + pickup pencircle scaled stemwidth; + + lft x5 = lft x6 = outer_space; + top y6 = vround (1.5 staff_space - .5 stem); + bot y5 = -top y6 + feta_space_shift; + labels (5, 6); + + + draw_gridline (z5, z6, stemwidth); + + + remember_pic := currentpicture; + + draw_staff (-2, 2, 0); +fet_endchar; + +draw_shifted_too; + + +fet_beginchar ("3/4 Sharp", "sharp.slashslash.stemstemstem"); save stem, stemx, stemwidth; save outer_space, interbeam; @@ -219,25 +314,15 @@ fet_beginchar ("3/4 Sharp", "3"); draw_staff (-2, 2, 0); fet_endchar; +draw_shifted_too; -if test > 0: - fet_beginchar ("3/4 Sharp", "3"); - - set_char_box (0, 1.6 staff_space#, - 1.5 staff_space#, 1.5 staff_space#); - - currentpicture := remember_pic; - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; % % The stems of the natural are brushed (at least, in Barenreiter SCS) % -fet_beginchar ("Natural", "0"); +fet_beginchar ("Natural", "natural"); save stemwidth, top_stem_thick; save ne, pat_top, pat_bottom; pair ne; @@ -324,17 +409,7 @@ fet_beginchar ("Natural", "0"); draw_staff (-2, 2, 0); fet_endchar; - -if test > 0: - fet_beginchar ("Natural", "0"); - set_char_box (0, 2/3 staff_space#, - 1.5 staff_space#, 1.5 staff_space#); - - currentpicture := remember_pic; - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; +draw_shifted_too; % @@ -455,7 +530,7 @@ enddef; % unfortunately, 600dpi is not enough to show the brush of the stem. % -fet_beginchar ("Flat", "-2"); +fet_beginchar ("Flat", "flat"); set_char_box (1.2 stafflinethickness#, .8 staff_space#, 0.6 staff_space#, 1.9 staff_space#); @@ -467,20 +542,74 @@ fet_beginchar ("Flat", "-2"); draw_staff (-2, 2, 0); fet_endchar; +draw_shifted_too; -if test > 0: - fet_beginchar ("Flat", "-2"); - set_char_box (1.2 stafflinethickness#, .8 staff_space#, - 0.6 staff_space#, 1.9 staff_space#); +fet_beginchar ("Flat (slashed)", "flat.slash"); + set_char_box (1.2 stafflinethickness#, .8 staff_space#, + 0.6 staff_space#, 1.9 staff_space#); - currentpicture := remember_pic; + draw_meta_flat (0, w, 0.31 staff_space); + clearxy; + save slope, slash_width; + slope = 0.5; + slash_width = w; + z1 = (0, h / 2); + z2 = z1 - (slash_width, slash_width * slope)/2; + z3 = z1 + (slash_width, slash_width * slope)/2; + + pickup pencircle scaled 1.5 stafflinethickness; + draw z2 .. z3; + labels (1, 2, 3); + remember_pic := currentpicture; - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; + draw_staff (-2, 2, 0); +fet_endchar; + +fet_beginchar ("Flat (slashed twice)", "flat.slashslash"); + set_char_box (1.2 stafflinethickness#, .8 staff_space#, + 0.6 staff_space#, 1.9 staff_space#); + + draw_meta_flat (0, w, 0.31 staff_space); + clearxy; + save slope, slash_width; + + slope = 0.5; + slash_width = w; + pickup pencircle scaled 1.5 stafflinethickness; + + z1 = (0, 5/12 h); + z2 = (0, 2/3 h); + draw z1 - (slash_width, slash_width * slope)/2 + .. z1 + (slash_width, slash_width * slope)/2; + draw z2 - (slash_width, slash_width * slope)/2 + .. z2 + (slash_width, slash_width * slope)/2; + labels (1, 2); + remember_pic := currentpicture; + + draw_staff (-2, 2, 0); +fet_endchar; + +fet_beginchar ("Flatflat (mirrored)", "mirroredflat.flat"); + set_char_box (0, 1.6 staff_space#, + 0.6 staff_space#, 1.9 staff_space#); + draw_meta_flat (0, w/2, 0.31 staff_space); + currentpicture := currentpicture xscaled -1; + draw_meta_flat (0, w/2, 0.31 staff_space); + + currentpicture := currentpicture shifted (w/2,0); + penlabels (range 0 thru 11); -fet_beginchar ("Semi flat", "-1"); + remember_pic := currentpicture; + + draw_staff (-2, 2, 0); +fet_endchar; + +draw_shifted_too; + + + +fet_beginchar ("Semi flat", "mirroredflat"); set_char_box (1.2 stafflinethickness#, .8 staff_space#, 0.6 staff_space#, 1.9 staff_space#); @@ -489,7 +618,7 @@ fet_beginchar ("Semi flat", "-1"); fet_endchar; -fet_beginchar ("Double Flat", "-4"); +fet_beginchar ("Double Flat", "flatflat"); save left_wid, overlap, right_wid; left_wid = .7; @@ -505,7 +634,7 @@ fet_beginchar ("Double Flat", "-4"); fet_endchar; -fet_beginchar ("3/4 Flat", "-3"); +fet_beginchar ("3/4 Flat", "flatflat.slash"); save left_wid, overlap, right_wid; left_wid = .7; @@ -549,27 +678,9 @@ fet_beginchar ("3/4 Flat", "-3"); draw_staff (-2, 2, 0); fet_endchar; +draw_shifted_too; -if test > 0: - fet_beginchar ("3/4 Flat", "-3"); - save left_wid, overlap, right_wid; - - left_wid = .7; - right_wid = .8; - overlap = .05; - - set_char_box (1.2 stafflinethickness#, - (left_wid + right_wid - overlap) * staff_space#, - .6 staff_space#, 1.9 staff_space#); - - currentpicture := remember_pic; - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - -fet_beginchar ("Double Sharp", "4"); +fet_beginchar ("Double Sharp", "doublesharp"); save klaverblad, klaversteel; save pat; path pat; @@ -622,18 +733,7 @@ fet_beginchar ("Double Sharp", "4"); draw_staff (-2, 2, 0); fet_endchar; - -if test > 0: - fet_beginchar ("Double Sharp", "4"); - set_char_box (0, staff_space#, - .5 staff_space#, .5 staff_space#); - - currentpicture := remember_pic; - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - +draw_shifted_too; def draw_paren = save leftindent; @@ -671,17 +771,7 @@ fet_beginchar ("Right Parenthesis", "rightparen"); draw_staff (-2, 2, 0); fet_endchar; - -if test > 0: - fet_beginchar ("Right Parenthesis", "rightparen"); - draw_paren; - penlabels (1, 2, 3); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; +draw_shifted_too; fet_beginchar ("Left Parenthesis", "leftparen"); @@ -692,5 +782,4 @@ fet_beginchar ("Left Parenthesis", "leftparen"); set_char_box (charwd, charbp, chardp, charht); fet_endchar; - fet_endgroup ("accidentals"); diff --git a/mf/feta.tex b/mf/feta.tex deleted file mode 100644 index bd47bfddd4..0000000000 --- a/mf/feta.tex +++ /dev/null @@ -1,70 +0,0 @@ -% display all feta chars in a pretty picture -% GNU LilyPond -% (c) 1998--2006 Jan Nieuwenhuizen -% -% urg: fool ls-latex -\def\urg{ -\title{The Feta font} -\author{JCN} -\begin{document} -} - - -\parindent0pt -\nopagenumbers -\newcount\n -\newcount\i - -\font\fetatwenty = feta20 -\font\fetanumber = feta-nummer12 -\font\fetafinger = feta-nummer5 -\font\fetadyn = feta-din10 scaled \magstep 2 -\font\titlefont = cmbx12 scaled \magstep 4 -\font\subtitle = cmr9 - -\def\lilyfooter{Lily was here} -\def\setchar#1#2{\hbox to\charwidth{\hss{#1\char#2}\hss}} - -\def\charsperline{6} -\def\charheight{55pt} -\def\charwidth{60pt} - -\def\listfont#1#2#3{ - \n=#2 - \advance\n by-1 - \advance\n by-\charsperline - \loop\ifnum\n<#3 - \advance\n by\charsperline - \i=0 - {\vbox to\charheight{\vss\centerline{ - {\loop\ifnum\i<\charsperline - \advance\i by1 - \advance\n by1 - {\setchar{#1}{\number\n}} - \repeat}}}}\repeat} - -\def\title#1{\centerline{\titlefont #1}} -\def\author#1{\centerline{#1}} - -\title{FETA} - -\centerline{\subtitle (definitely not an abbreviation for Font-En-Tja)} - -\author{Han-Wen Nienhuys and Jan Nieuwenhuizen} - - -\vskip5mm - -\listfont{\fetatwenty}{0}{105} -% urg -\vskip-\charheight -\listfont{\fetanumber}{48}{58} -\vskip-\charheight -\listfont{\fetafinger}{48}{58} -\vskip-\charheight -\listfont{\fetadyn}{0}{6} -\vskip-\charheight - -\lilyfooter - -\bye diff --git a/mf/parmesan-accidentals.mf b/mf/parmesan-accidentals.mf index c9f8fba0d9..c09ae5ae5f 100644 --- a/mf/parmesan-accidentals.mf +++ b/mf/parmesan-accidentals.mf @@ -1,4 +1,4 @@ -% -*-Fundamental-*- +% -%-Fundamental-%- -*-Metafont-*- % parmesan-accidentals.mf -- implement ancient accidentals % % source file of LilyPond's pretty-but-neat music font diff --git a/mf/parmesan-flags.mf b/mf/parmesan-flags.mf index 1202080108..2ee63a0e93 100644 --- a/mf/parmesan-flags.mf +++ b/mf/parmesan-flags.mf @@ -1,4 +1,4 @@ -% -*-Fundamental-*- +% -%-Fundamental-%- -*-Metafont-*- % parmesan-flags.mf -- implement ancient flags % % source file of LilyPond's pretty-but-neat music font diff --git a/mf/parmesan-generic.mf b/mf/parmesan-generic.mf index 0ed8a62016..7114bc6837 100644 --- a/mf/parmesan-generic.mf +++ b/mf/parmesan-generic.mf @@ -1,5 +1,4 @@ - -% -*-Fundamental-*- +% -%-Fundamental-%- -*-Metafont-*- % parmesan-generic.mf -- implement generic stuff: include lots of files, % but don't set dims. % diff --git a/mf/parmesan-timesig.mf b/mf/parmesan-timesig.mf index 6aa68ab580..d02840b57f 100644 --- a/mf/parmesan-timesig.mf +++ b/mf/parmesan-timesig.mf @@ -1,4 +1,4 @@ -% -*-Fundamental-*- +% -%-Fundamental-%- -*-Metafont-*- % parmesan-timesig.mf -- implement ancient time signatures % % source file of LilyPond's pretty-but-neat music font diff --git a/po/es.po b/po/es.po index f3ef51bf81..d32790e9d2 100644 --- a/po/es.po +++ b/po/es.po @@ -1,64 +1,67 @@ +# translation of es.po to Spanish # Spanish translation of GNU LilyPond - http://lilypond.org -# Copyright (C) 2002 Free Software Foundation, Inc. -# Quique , 2002. +# Copyright (C) 2002, 2007 Free Software Foundation, Inc. # +# Quique , 2002. +# Daniel Tonda Castillo , 2007. msgid "" msgstr "" -"Project-Id-Version: lilypond 1.4.13\n" +"Project-Id-Version: lilypond 2.11.11\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2006-12-24 10:40+0100\n" -"PO-Revision-Date: 2006-12-23 16:15+0100\n" -"Last-Translator: Quique \n" +"PO-Revision-Date: 2007-01-14 00:01+0100\n" +"Last-Translator: Daniel Tonda Castillo \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" #: convertrules.py:12 #, python-format msgid "Not smart enough to convert %s" -msgstr "" +msgstr "No soy capaz de convertir: %s" #: convertrules.py:13 msgid "Please refer to the manual for details, and update manually." -msgstr "" +msgstr "Por favor dirígase al manual para más detalles y actualice manualmente." #: convertrules.py:14 #, python-format msgid "%s has been replaced by %s" -msgstr "" +msgstr "%s se reemplazado por %s" #: convertrules.py:2398 msgid "LilyPond source must be UTF-8" -msgstr "" +msgstr "La fuente LilyPond debe ser UTF-8" #: convertrules.py:2401 msgid "Try the texstrings backend" -msgstr "" +msgstr "Intente el procesador texstrings" #: convertrules.py:2404 #, python-format msgid "Do something like: %s" -msgstr "" +msgstr "Haga algo cómo: %s" #: convertrules.py:2407 msgid "Or save as UTF-8 in your editor" -msgstr "" +msgstr "O guárdelo como UTF-8 en su editor." #: fontextract.py:26 -#, fuzzy, python-format +#, python-format msgid "Scanning %s" -msgstr "advertencia: " +msgstr "Analizando %s" #: fontextract.py:71 #, python-format msgid "Extracted %s" -msgstr "" +msgstr "Se ha extraído: %s" #: fontextract.py:86 -#, fuzzy, python-format +#, python-format msgid "Writing fonts to %s" -msgstr "no se puede crear el directorio: `%s'" +msgstr "Escribiendo fuentes a %s" #: lilylib.py:85 lilylib.py:136 #, python-format @@ -71,14 +74,14 @@ msgid "Running %s..." msgstr "Ejecutando %s..." #: lilylib.py:203 -#, fuzzy, python-format +#, python-format msgid "Usage: %s" -msgstr "advertencia: " +msgstr "Uso: %s" #: abc2ly.py:1349 convert-ly.py:80 lilypond-book.py:125 midi2ly.py:869 -#, fuzzy, python-format +#, python-format msgid "%s [OPTION]... FILE" -msgstr "Sintaxis: %s [OPTIONS]... FICHERO" +msgstr "Sintaxis: %s [OPCION]... FICHERO" #: abc2ly.py:1351 #, python-format @@ -86,91 +89,94 @@ msgid "" "abc2ly converts ABC music files (see\n" "%s) to LilyPond input." msgstr "" +"abc2ly convierte archivos de música ABC (vea\n" +"%s) a código LilyPond." #: abc2ly.py:1355 etf2ly.py:1200 midi2ly.py:885 msgid "write output to FILE" -msgstr "escribir la salida en el FICHERO" +msgstr "escribir la salida a FICHERO" #: abc2ly.py:1357 msgid "be strict about succes" -msgstr "" +msgstr "Sea estricto sobre el éxito" #: abc2ly.py:1359 msgid "preserve ABC's notion of beams" -msgstr "" +msgstr "preservar la idea de ABC sobre las barras" #: abc2ly.py:1361 convert-ly.py:112 etf2ly.py:1208 lilypond-book.py:168 #: midi2ly.py:911 musicxml2ly.py:505 -#, fuzzy msgid "Report bugs via" -msgstr "Informar de gazapos a %s." +msgstr "Reporte errores por medio de" #: convert-ly.py:41 msgid "" "Update LilyPond input to newer version. By default, update from the\n" "version taken from the \\version command, to the current LilyPond version." msgstr "" +"Actualice el código LilyPond a una versión más reciente. Por defecto, actualice desde la \n" +"versión tomada del comando \\version, a la versión actual de LilyPond." #: convert-ly.py:43 lilypond-book.py:73 msgid "Examples:" -msgstr "" +msgstr "Ejemplos:" #: convert-ly.py:56 lilypond-book.py:98 warn.cc:48 input.cc:90 -#, fuzzy, c-format, python-format +#, c-format, python-format msgid "warning: %s" -msgstr "advertencia: " +msgstr "advertencia: %s" #: convert-ly.py:59 lilypond-book.py:101 warn.cc:54 input.cc:96 input.cc:104 -#, fuzzy, c-format, python-format +#, c-format, python-format msgid "error: %s" -msgstr "error: " +msgstr "error: %s" #: convert-ly.py:75 etf2ly.py:1190 lilypond-book.py:121 midi2ly.py:98 msgid "Distributed under terms of the GNU General Public License." -msgstr "" +msgstr "Distribuido bajo los términos de la GNU General Public License." #: convert-ly.py:76 etf2ly.py:1191 lilypond-book.py:122 midi2ly.py:99 msgid "It comes with NO WARRANTY." -msgstr "" +msgstr "No se entrega con GARANTIA." #: convert-ly.py:86 convert-ly.py:106 msgid "VERSION" -msgstr "" +msgstr "VERSIÓN" #: convert-ly.py:88 msgid "start from VERSION [default: \\version found in file]" -msgstr "" +msgstr "iniciando desde VERSIÓN [por defecto \\version encontrada en archivo]" #: convert-ly.py:91 msgid "edit in place" -msgstr "" +msgstr "editar en sitio" #: convert-ly.py:94 msgid "do not add \\version command if missing" -msgstr "" +msgstr "no añadir comando \\version si es que falta" #: convert-ly.py:100 msgid "show rules [default: --from=0, --to=@TOPLEVEL_VERSION@]" -msgstr "" +msgstr "mostrar reglas [por defecto: --from=0, --to=@TOPLEVEL_VERSION@]" #: convert-ly.py:105 msgid "convert to VERSION [default: @TOPLEVEL_VERSION@]" -msgstr "" +msgstr "convertir a VERSION [default: @TOPLEVEL_VERSION@]" #: convert-ly.py:153 msgid "Applying conversion: " -msgstr "" +msgstr "Aplicando conversión:" #: convert-ly.py:166 msgid "Error while converting" -msgstr "" +msgstr "Error al hacer la conversión" #: convert-ly.py:168 msgid "Stopping at last succesful rule" -msgstr "" +msgstr "Deteniéndose en la última regla exitosa" #: convert-ly.py:190 -#, fuzzy, python-format +#, python-format msgid "Processing `%s'... " msgstr "Procesando `%s'..." @@ -180,21 +186,21 @@ msgid "cannot open file: `%s'" msgstr "no se puede abrir el fichero: `%s'" #: convert-ly.py:284 -#, fuzzy, python-format +#, python-format msgid "cannot determine version for `%s'. Skipping" -msgstr "no puedo encontrar la fuente por defecto: `%s'" +msgstr "no se puede determinar la versión para `%s'. Saltando" #: etf2ly.py:1196 -#, fuzzy, python-format +#, python-format msgid "%s [OPTION]... ETF-FILE" -msgstr "Sintaxis: %s [OPTIONS]... FICHERO" +msgstr "%s [OPTIONS]... FICHERO ETF" #: etf2ly.py:1198 msgid "" "Enigma Transport Format is a format used by Coda Music Technology's\n" "Finale product. etf2ly converts a subset of ETF to a ready-to-use LilyPond " "file." -msgstr "" +msgstr "Enigma Transport Format es un formato usado por el producto Finale de Coda Music. etf2ly convierte un subconjunto de ETF a un código LilyPond listo para usarse." #: etf2ly.py:1201 midi2ly.py:886 musicxml2ly.py:498 main.cc:172 main.cc:178 msgid "FILE" @@ -202,21 +208,22 @@ msgstr "FICHERO" #: etf2ly.py:1203 lilypond-book.py:165 midi2ly.py:899 main.cc:185 msgid "show warranty and copyright" -msgstr "mostrar los avisos de garantía y de copyright" +msgstr "" +"mostrar los avisos de garantía y de\n" +"copyright" #: lilypond-book.py:71 -msgid "" -"Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document." -msgstr "" +msgid "Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document." +msgstr "Procesar fragmentos LilyPond en híbridos de HTML, LaTeX, texinfo o documentos DocBook." #: lilypond-book.py:78 msgid "BOOK" -msgstr "" +msgstr "BOOK" #: lilypond-book.py:87 -#, fuzzy, python-format +#, python-format msgid "Exiting (%d)..." -msgstr "Saliendo..." +msgstr "Saliendo (%d)..." #: lilypond-book.py:119 #, python-format @@ -224,51 +231,48 @@ msgid "Copyright (c) %s by" msgstr "Copyright (c) %s " #: lilypond-book.py:129 -#, fuzzy msgid "FILTER" -msgstr "FICHERO" +msgstr "FILTRO" #: lilypond-book.py:132 msgid "pipe snippets through FILTER [convert-ly -n -]" -msgstr "" +msgstr "redirigir fragmentos a través del FILTRO [convert-ly -n -]" #: lilypond-book.py:135 -#, fuzzy -msgid "" -"use output format FORMAT (texi [default], texi-html, latex, html, docbook)" -msgstr "utilizar el formato de salida EXT (scm, ps, tex o as) " +msgid "use output format FORMAT (texi [default], texi-html, latex, html, docbook)" +msgstr "use formato de salida FORMATO (texi [default], texi-html, latex, html, docbook)" #: lilypond-book.py:138 -#, fuzzy msgid "add DIR to include path" -msgstr "añadir DIR a la ruta de búsqueda" +msgstr "añadir DIR a la ruta de búsqueda" #: lilypond-book.py:139 lilypond-book.py:144 main.cc:171 msgid "DIR" msgstr "DIR" #: lilypond-book.py:143 -#, fuzzy msgid "write output to DIR" -msgstr "escribir la salida en el FICHERO" +msgstr "escribir la salida en el DIRECTORIO" #: lilypond-book.py:147 msgid "COMMAND" -msgstr "" +msgstr "COMANDO" #: lilypond-book.py:148 msgid "process ly_files using COMMAND FILE..." -msgstr "" +msgstr "procesar archivos_ly usando COMMANDO FICHERO" #: lilypond-book.py:154 msgid "Create PDF files for use with PDFTeX" -msgstr "" +msgstr "Crear archivos PDF para usarse con PDFTeX" #: lilypond-book.py:157 msgid "" "extract all PostScript fonts into INPUT.psfonts for LaTeX\n" "must use this with dvips -h INPUT.psfonts" msgstr "" +"extraer todas las fuentes POSTCRIPT en INPUT.psfonts, para LaTeX\n" +"debe usar esto para dvips -h INPUT.psfonts " #: lilypond-book.py:160 midi2ly.py:896 musicxml2ly.py:489 main.cc:184 msgid "be verbose" @@ -277,75 +281,72 @@ msgstr "ser prolijo" #: lilypond-book.py:773 #, python-format msgid "file not found: %s" -msgstr "" +msgstr "archivo no encontrado: %s" #: lilypond-book.py:1004 #, python-format msgid "deprecated ly-option used: %s=%s" -msgstr "" +msgstr "opción ly en desuso: %s=%s" #: lilypond-book.py:1007 #, python-format msgid "compatibility mode translation: %s=%s" -msgstr "" +msgstr "modo de traducción de compatibilidad: %s=%s" #: lilypond-book.py:1011 #, python-format msgid "deprecated ly-option used: %s" -msgstr "" +msgstr "opción ly en desuso: %s" #: lilypond-book.py:1014 #, python-format msgid "compatibility mode translation: %s" -msgstr "" +msgstr "modo de traducción de compatibilidad: %s" #: lilypond-book.py:1033 #, python-format msgid "ignoring unknown ly option: %s" -msgstr "" +msgstr "ignorando opicón ly desconocida: %s" #: lilypond-book.py:1388 -#, fuzzy, python-format +#, python-format msgid "Opening filter `%s'" -msgstr "Limpiando `%s'..." +msgstr "Abriendo filtro `%s'..." #: lilypond-book.py:1405 #, python-format msgid "`%s' failed (%d)" -msgstr "" +msgstr "%s falló (%d)" #: lilypond-book.py:1406 msgid "The error log is as follows:" -msgstr "" +msgstr "La bitácora de error a continuación:" #: lilypond-book.py:1476 msgid "cannot find \\begin{document} in LaTeX document" -msgstr "" +msgstr "no se puede encontrar \\begin{document} en el documento LaTeX" #: lilypond-book.py:1586 -#, fuzzy msgid "Writing snippets..." -msgstr "Escribiendo `%s'..." +msgstr "Escribiendo fragmentos..." #: lilypond-book.py:1591 -#, fuzzy msgid "Processing..." msgstr "Procesando..." #: lilypond-book.py:1595 -#, fuzzy msgid "All snippets are up to date..." -msgstr "calma, %s está al día" +msgstr "Todos los fragmentos están actualizados" #: lilypond-book.py:1605 -#, fuzzy, python-format +#, python-format msgid "cannot determine format for: %s" -msgstr "no puedo encontrar la fuente por defecto: `%s'" +msgstr "no puedo determinar el formato para: %s" #: lilypond-book.py:1616 -#, fuzzy, python-format +#, python-format msgid "%s is up to date." -msgstr "calma, %s está al día" +msgstr "%s está actualizado." #: lilypond-book.py:1622 #, python-format @@ -354,49 +355,48 @@ msgstr "Escribiendo `%s'..." #: lilypond-book.py:1677 msgid "Output would overwrite input file; use --output." -msgstr "" +msgstr "La salida sobreescribirá el archivo de entrada, use --output." #: lilypond-book.py:1681 -#, fuzzy, python-format +#, python-format msgid "Reading %s..." -msgstr "Limpiando %s..." +msgstr "Leyendo %s..." #: lilypond-book.py:1700 -#, fuzzy msgid "Dissecting..." -msgstr "Listando `%s'..." +msgstr "Analizando..." #: lilypond-book.py:1716 -#, fuzzy, python-format +#, python-format msgid "Compiling %s..." -msgstr "Limpiando %s..." +msgstr "Compilando %s..." #: lilypond-book.py:1725 -#, fuzzy, python-format +#, python-format msgid "Processing include: %s" -msgstr "Procesando `%s'..." +msgstr "Procesando inclusión: %s" #: lilypond-book.py:1739 -#, fuzzy, python-format +#, python-format msgid "Removing `%s'" -msgstr "Invocando `%s'" +msgstr "Borrando `%s'" #: lilypond-book.py:1815 -#, fuzzy, python-format +#, python-format msgid "Writing fonts to %s..." -msgstr "no se puede crear el directorio: `%s'" +msgstr "Escribiendo fuentes a %s..." #: lilypond-book.py:1830 msgid "option --psfonts not used" -msgstr "" +msgstr "opción --psfonts no usada" #: lilypond-book.py:1831 msgid "processing with dvips will have no fonts" -msgstr "" +msgstr "al procesar con dvips no contendrá fuentes" #: lilypond-book.py:1834 msgid "DVIPS usage:" -msgstr "" +msgstr "uso para DVIPS:" #: midi2ly.py:106 lily-library.scm:624 lily-library.scm:632 msgid "warning: " @@ -416,13 +416,13 @@ msgid "%s output to `%s'..." msgstr "%s producidos en `%s'..." #: midi2ly.py:871 musicxml2ly.py:485 -#, fuzzy, python-format +#, python-format msgid "Convert %s to LilyPond input." -msgstr "Convertir mup a ly." +msgstr "Convertir %s a código LilyPond" #: midi2ly.py:875 msgid "print absolute pitches" -msgstr "" +msgstr "imprimir notas absolutos" #: midi2ly.py:877 midi2ly.py:889 msgid "DUR" @@ -430,24 +430,23 @@ msgstr "DUR" #: midi2ly.py:878 msgid "quantise note durations on DUR" -msgstr "" +msgstr "quantizar duraciones de notas en DUR" #: midi2ly.py:881 msgid "print explicit durations" -msgstr "" +msgstr "imprimir duraciones explícitas" #: midi2ly.py:882 msgid "set key: ALT=+sharps|-flats; MINOR=1" msgstr "" #: midi2ly.py:883 -#, fuzzy msgid "ALT[:MINOR]" -msgstr "ACC[:MENOR]" +msgstr "ALT[:MINOR]" #: midi2ly.py:888 msgid "quantise note starts on DUR" -msgstr "" +msgstr "quantizar inicios de notas en DUR" #: midi2ly.py:891 msgid "DUR*NUM/DEN" @@ -455,104 +454,103 @@ msgstr "" #: midi2ly.py:894 msgid "allow tuplet durations DUR*NUM/DEN" -msgstr "" +msgstr "permitir duracione de grupetos DUR*NUM/DEN" #: midi2ly.py:902 msgid "treat every text as a lyric" -msgstr "" +msgstr "tratar cualquier texto como letra" #: midi2ly.py:905 msgid "Examples" -msgstr "" +msgstr "Ejemplos" #: midi2ly.py:925 msgid "no files specified on command line." -msgstr "no se ha especificado ningún fichero en la línea de órdenes." +msgstr "no se ha especificado ningún fichero en la línea de órdenes." #: musicxml2ly.py:473 msgid "musicxml2ly FILE.xml" -msgstr "" +msgstr "musicxml2ly FICHERO.xml" #: musicxml2ly.py:476 -#, fuzzy, python-format +#, python-format msgid "" "This program is free software. It is covered by the GNU General Public\n" "License and you are welcome to change it and/or distribute copies of it\n" "under certain conditions. Invoke as `%s --warranty' for more\n" "information." msgstr "" -"Este software es libre. Está protegido por la Licencia Pública\n" -"General de GNU, y quedas invitado a modificarlo y/o distribuir copias de\n" -"él bajo ciertas condiciones. Invócalo como `%s --warranty' para más\n" -"información.\n" +"Este software es libre. Está protegido por la Licencia Pública\n" +"General de GNU, y es libre de modificarlo y/o distribuir copias de él bajo ciertas condiciones. Invoquese como `%s --warranty' para más información." #: musicxml2ly.py:495 msgid "Use lxml.etree; uses less memory and cpu time." -msgstr "" +msgstr "Usar lxml.etree; usa menos memoria y tiempo del cpu." #: musicxml2ly.py:503 -#, fuzzy msgid "set output filename to FILE" msgstr "escribir la salida en el FICHERO" #: getopt-long.cc:140 #, c-format msgid "option `%s' requires an argument" -msgstr "la opción `%s' requiere un argumento" +msgstr "la opción `%s' requiere un argumento" #: getopt-long.cc:144 -#, fuzzy, c-format +#, c-format msgid "option `%s' does not allow an argument" -msgstr "la opción `%s' no permite argumentos" +msgstr "la opción `%s' no permite argumentos" #: getopt-long.cc:148 #, c-format msgid "unrecognized option: `%s'" -msgstr "opción no reconocida: `%s'" +msgstr "opción no reconocida: `%s'" #: getopt-long.cc:154 #, c-format msgid "invalid argument `%s' to option `%s'" -msgstr "argúmento no válido `%s' para la opción `%s'" +msgstr "argúmento no válido `%s' para la opción `%s'" #: warn.cc:68 grob.cc:559 input.cc:82 -#, fuzzy, c-format +#, c-format msgid "programming error: %s" -msgstr "error de programación: " +msgstr "error de programación: %s" #: warn.cc:69 input.cc:83 msgid "continuing, cross fingers" -msgstr "" +msgstr "continuando, cruzando los dedos" #: accidental-engraver.cc:240 #, c-format msgid "accidental typesetting list must begin with context-name: %s" -msgstr "" +msgstr "lista de grabado de accidentes debe iniciar con un nombre de contexto: %s" #: accidental-engraver.cc:268 #, c-format msgid "ignoring unknown accidental: %s" -msgstr "" +msgstr "ignorando accidentes desconocidos: %s" #: accidental-engraver.cc:284 #, c-format msgid "pair or context-name expected for accidental rule, found %s" -msgstr "" +msgstr "se encontró regla para: se esperaba un par o nombre de contexto para accidente: %s" #: accidental.cc:243 key-signature-interface.cc:133 #, c-format msgid "accidental `%s' not found" -msgstr "" +msgstr "accidente `%s' no encontrado" #: align-interface.cc:222 msgid "" "vertical alignment called before line-breaking.\n" "Only do cross-staff spanners with PianoStaff." msgstr "" +"vertical alignment llamado antes de un corte de línea.\n" +"Solamente hacer cross-staff-spanners con PianoStaff." #: align-interface.cc:329 msgid "tried to get a translation for something that is no child of mine" -msgstr "" +msgstr "intentando obtener una traducción para algo que no está en mi ámbito" #: all-font-metrics.cc:173 #, c-format @@ -561,91 +559,89 @@ msgstr "no encuentro la fuente: `%s'" #: apply-context-iterator.cc:31 msgid "\\applycontext argument is not a procedure" -msgstr "" +msgstr "El argumento \\applycontext no es un procedimiento" #: auto-change-iterator.cc:63 change-iterator.cc:61 -#, fuzzy, c-format +#, c-format msgid "cannot change, already in translator: %s" -msgstr "no puedo cambiar de `%s' a `%s'" +msgstr "no se puede cambiar, ya está en el traductor: %s" #: axis-group-engraver.cc:78 msgid "Axis_group_engraver: vertical group already has a parent" -msgstr "" +msgstr "El grupo vertical Axis_group_engraver: ya tiene un padre" #: axis-group-engraver.cc:79 msgid "are there two Axis_group_engravers?" -msgstr "" +msgstr "hay dos Axis_group_engravers?" #: axis-group-engraver.cc:80 msgid "removing this vertical group" -msgstr "" +msgstr "quitando este grupo vertical" #: axis-group-interface.cc:96 msgid "tried to calculate pure-height at a non-breakpoint" -msgstr "" +msgstr "se trató de calcular la altura pura en un lugar que no es punto de quiebre" #: axis-group-interface.cc:370 msgid "an outside-staff object should have a direction, defaulting to up" -msgstr "" +msgstr "un objeto externo al pentagrama debe tener dirección, por defecto deiniéndolo hacia arriba" #: axis-group-interface.cc:383 #, c-format msgid "outside-staff object %s has an empty extent" -msgstr "" +msgstr "Objeto externo al pentagrama %s tiene una extensión vacía" #: bar-check-iterator.cc:73 #, c-format msgid "barcheck failed at: %s" -msgstr "" +msgstr "revisión de compases falló en: %s" #: beam-engraver.cc:128 msgid "already have a beam" -msgstr "" +msgstr "ya hay una barra de compás " #: beam-engraver.cc:196 msgid "unterminated beam" -msgstr "" +msgstr "barra sin terminar" #: beam-engraver.cc:238 chord-tremolo-engraver.cc:134 msgid "stem must have Rhythmic structure" -msgstr "" +msgstr "la plica debe tener una estructura rítmica" #: beam-engraver.cc:246 msgid "stem does not fit in beam" -msgstr "" +msgstr "la plica no cabe en la barra" #: beam-engraver.cc:247 msgid "beam was started here" -msgstr "" +msgstr "se inició barra aquí" #: beam-quanting.cc:307 -#, fuzzy msgid "no feasible beam position" -msgstr "No se ha encontrado ninguna ruptura de línea factible" +msgstr "No se ha encontrado posicionamiento de barra factible" #: beam.cc:144 msgid "removing beam with no stems" -msgstr "" +msgstr "quitando barra sin plicas" #: beam.cc:1007 msgid "no viable initial configuration found: may not find good beam slope" -msgstr "" +msgstr "no se pudo encontrar una configuración inicial factible: la inclinación de la barra puede no ser correcta" #: break-alignment-interface.cc:208 -#, fuzzy, c-format +#, c-format msgid "No spacing entry from %s to `%s'" -msgstr "No se añade el traductor: `%s'" +msgstr "No hay entrada de espaciado desde %s a `%s'" #: change-iterator.cc:23 -#, fuzzy, c-format +#, c-format msgid "cannot change `%s' to `%s'" -msgstr "no puedo cambiar de `%s' a `%s'" +msgstr "no se puede cambiar `%s' a `%s'" #. FIXME: constant error message. #: change-iterator.cc:82 -#, fuzzy msgid "cannot find context to switch to" -msgstr "no se puede encontrar el contexto de `%s'" +msgstr "no se encuentra encontrar a qué contexto cambiar" #. We could change the current translator's id, but that would make #. errors hard to catch. @@ -653,76 +649,75 @@ msgstr "no se puede encontrar el contexto de `%s'" #. last->translator_id_string () = get_change #. ()->change_to_id_string (); #: change-iterator.cc:91 -#, fuzzy, c-format +#, c-format msgid "not changing to same context type: %s" -msgstr "no hay tal contexto: %s" +msgstr "no se cambiará al mismo tipo de contexto: %s" #. FIXME: uncomprehensable message #: change-iterator.cc:95 msgid "none of these in my family" -msgstr "ninguno de éstos en mi familia" +msgstr "ninguno de éstos en mi familia" #: chord-tremolo-engraver.cc:88 msgid "No tremolo to end" -msgstr "" +msgstr "No hay trémolo que terminar" #: chord-tremolo-engraver.cc:110 msgid "unterminated chord tremolo" -msgstr "acorde de trémolo sin terminar" +msgstr "acorde de trémolo sin terminar" #: chord-tremolo-iterator.cc:33 #, c-format msgid "expect 2 elements for chord tremolo, found %d" -msgstr "" +msgstr "esperaba dos elementos para acorde con trémolo, encontré %d" #: clef.cc:54 #, c-format msgid "clef `%s' not found" -msgstr "" +msgstr "no se encontró la clave de %s" #: cluster.cc:110 -#, fuzzy, c-format +#, c-format msgid "unknown cluster style `%s'" -msgstr "traductor desconocido: `%s'" +msgstr "tipo de grupo (cluster) desconocido `%s'" #: cluster.cc:135 msgid "junking empty cluster" -msgstr "" +msgstr "ignorando cluster vacío" #: coherent-ligature-engraver.cc:100 #, c-format msgid "Coherent_ligature_engraver: setting `spacing-increment=0.01': ptr=%ul" -msgstr "" +msgstr "Coherent_ligature_engraver: incrementando `spacing-increment=0.01': ptr=%ul" #. if we get to here, just put everything on one line #: constrained-breaking.cc:176 constrained-breaking.cc:193 -#, fuzzy msgid "cannot find line breaking that satisfies constraints" -msgstr "no he podido encontrar ninguna fuente satisfactoria " +msgstr "no puedo determinar un corte de línea que satisfaga las restricciones" #: context-def.cc:130 -#, fuzzy, c-format +#, c-format msgid "program has no such type: `%s'" -msgstr "El programa no tiene este tipo" +msgstr "el programa no tiene tal tipo: `%s'" #: context-property.cc:76 msgid "need symbol arguments for \\override and \\revert" -msgstr "" +msgstr "faltan argumentos del símbolo para \\override y \\revert" #: context.cc:151 -#, fuzzy, c-format +#, c-format msgid "cannot find or create new `%s'" -msgstr "no se puede encontrar o crear: `%s'" +msgstr "no se puede encontrar o crear nuevo: `%s'" #: context.cc:213 -#, fuzzy, c-format +#, c-format msgid "cannot find or create `%s' called `%s'" msgstr "no se puede encontrar o crear `%s' llamado `%s'" #: context.cc:276 #, c-format msgid "Invalid CreateContext event: Cannot create %s context" -msgstr "" +msgstr "Evento CreateContext inválido: No puedo crear contexto %s" #: context.cc:388 #, c-format @@ -732,21 +727,21 @@ msgstr "no se puede encontrar o crear: `%s'" #: custos.cc:77 #, c-format msgid "custos `%s' not found" -msgstr "" +msgstr "custos `%s' no encontrado" #: dispatcher.cc:71 msgid "Event class should be a symbol" -msgstr "" +msgstr "Clase de evento debe ser un símbolo" #: dispatcher.cc:78 -#, fuzzy, c-format +#, c-format msgid "Unknown event class %s" -msgstr "traductor desconocido: `%s'" +msgstr "Clase de evento desconocida: `%s'" #: dots.cc:38 #, c-format msgid "dot `%s' not found" -msgstr "" +msgstr "puntillo `%s' no encontrado" #: dynamic-engraver.cc:186 span-dynamic-performer.cc:87 msgid "cannot find start of (de)crescendo" @@ -762,7 +757,7 @@ msgstr "ya tengo un crescendo" #: dynamic-engraver.cc:200 msgid "cresc starts here" -msgstr "" +msgstr "crescendo inicia aquí" #: dynamic-engraver.cc:323 msgid "unterminated (de)crescendo" @@ -770,115 +765,109 @@ msgstr "(de)crescendo sin terminar" #: extender-engraver.cc:131 extender-engraver.cc:140 msgid "unterminated extender" -msgstr "prolongación sin terminar" +msgstr "prolongación sin terminar" #: font-config.cc:28 msgid "Initializing FontConfig..." -msgstr "" +msgstr "Inicializando FontConfig..." #: font-config.cc:44 #, c-format msgid "Rebuilding FontConfig cache %s, this may take a while..." -msgstr "" +msgstr "Reconstruyendo caché de FontConfig %s, puede tomar un rato..." #: font-config.cc:55 -#, fuzzy, c-format +#, c-format msgid "failed adding font directory: %s" -msgstr "no se puede crear el directorio: `%s'" +msgstr "falló al añadir directorio de fuentes: %s" #: font-config.cc:57 -#, fuzzy, c-format +#, c-format msgid "adding font directory: %s" -msgstr "no se puede crear el directorio: `%s'" +msgstr "añadiendo directorio de fuentes: %s" #: general-scheme.cc:160 msgid "infinity or NaN encountered while converting Real number" -msgstr "" +msgstr "Se encontró infinito o NaN al tratar de convertir a un número Real" #: general-scheme.cc:161 msgid "setting to zero" -msgstr "" +msgstr "asignando valor de cero" #: glissando-engraver.cc:92 -#, fuzzy msgid "unterminated glissando" -msgstr "prolongación sin terminar" +msgstr "glissando sin terminar" #: global-context-scheme.cc:91 global-context-scheme.cc:107 -#, fuzzy msgid "no music found in score" -msgstr "ya tengo un crescendo" +msgstr "no se encontró música en la partitura" #: global-context-scheme.cc:97 -#, fuzzy msgid "Interpreting music... " -msgstr "Interpretación de la música..." +msgstr "Interpretando música... " #: global-context-scheme.cc:120 #, c-format msgid "elapsed time: %.2f seconds" -msgstr "" +msgstr "tiempo transcurrido: %.2f segundos" #: gregorian-ligature-engraver.cc:59 -#, fuzzy, c-format +#, c-format msgid "\\%s ignored" -msgstr "(ignorado)" +msgstr "\\%s ignorado" #: gregorian-ligature-engraver.cc:64 #, c-format msgid "implied \\%s added" -msgstr "" +msgstr "\\%s implicados añadidos" #. ligature may not start with 2nd head of pes or flexa #: gregorian-ligature-engraver.cc:212 -#, fuzzy msgid "cannot apply `\\~' on first head of ligature" -msgstr "no puedo encontrar el principio del (de)crescendo" +msgstr "no se puede aplicar `\\~' en pricipio de la ligadura" #. (pitch == prev_pitch) #: gregorian-ligature-engraver.cc:224 msgid "cannot apply `\\~' on heads with identical pitch" -msgstr "" +msgstr "no se puede aplicar \\~' en cabezas con la misma nota" #: grob-interface.cc:57 -#, fuzzy, c-format +#, c-format msgid "Unknown interface `%s'" -msgstr "traductor desconocido: `%s'" +msgstr "Interfase desconocida: `%s'" #: grob-interface.cc:68 #, c-format msgid "Grob `%s' has no interface for property `%s'" -msgstr "" +msgstr "El elemento `%s' no tiene interface para la propiedad `%s'" #: grob.cc:253 msgid "Infinity or NaN encountered" -msgstr "" +msgstr "Se encontró infinito o NaN" #: hairpin.cc:183 msgid "decrescendo too small" -msgstr "decrescendo demasiado pequeño" +msgstr "decrescendo demasiado pequeño" #: horizontal-bracket-engraver.cc:59 msgid "do not have that many brackets" -msgstr "" +msgstr "no hay tantos corchetes" #: horizontal-bracket-engraver.cc:68 msgid "conflicting note group events" -msgstr "" +msgstr "grupo de eventos de notas en conflicto" #: hyphen-engraver.cc:93 -#, fuzzy msgid "removing unterminated hyphen" -msgstr "prolongación sin terminar" +msgstr "eliminando prolongación sin terminar" #: hyphen-engraver.cc:107 -#, fuzzy msgid "unterminated hyphen; removing" -msgstr "acorde de trémolo sin terminar" +msgstr "prolongación sin terminar; eliminando" #: includable-lexer.cc:53 msgid "include files are not allowed in safe mode" -msgstr "" +msgstr "incluir archivos no se permite en modo seguro" #: includable-lexer.cc:60 lily-guile.cc:90 lily-parser-scheme.cc:116 #, c-format @@ -888,42 +877,39 @@ msgstr "no puedo encontrar el fichero: `%s'" #: includable-lexer.cc:62 lily-parser-scheme.cc:107 #, c-format msgid "(search path: `%s')" -msgstr "(ruta de búsqueda: `%s')" +msgstr "(ruta de búsqueda: `%s')" #: input.cc:112 source-file.cc:168 source-file.cc:183 msgid "position unknown" -msgstr "posición desconocida" +msgstr "posición desconocida" #: ligature-engraver.cc:93 -#, fuzzy msgid "cannot find start of ligature" -msgstr "no puedo encontrar el principio del (de)crescendo" +msgstr "no puedo encontrar el principio del ligadura" #: ligature-engraver.cc:98 msgid "no right bound" -msgstr "" +msgstr "no hay límite derecho" #: ligature-engraver.cc:120 -#, fuzzy msgid "already have a ligature" -msgstr "ya tengo un crescendo" +msgstr "ya hay una ligadura" #: ligature-engraver.cc:129 msgid "no left bound" -msgstr "" +msgstr "no hay límite izquierdo" #: ligature-engraver.cc:173 -#, fuzzy msgid "unterminated ligature" -msgstr "prolongación sin terminar" +msgstr "ligadura sin terminar" #: ligature-engraver.cc:202 msgid "ignoring rest: ligature may not contain rest" -msgstr "" +msgstr "ignorando silencio: una ligadura no puede contener silencio" #: ligature-engraver.cc:203 msgid "ligature was started here" -msgstr "" +msgstr "la ligadura no se inició aquí" #: lily-guile.cc:92 #, c-format @@ -933,25 +919,25 @@ msgstr "(ruta de carga: `%s')" #: lily-guile.cc:518 #, c-format msgid "cannot find property type-check for `%s' (%s)." -msgstr "" +msgstr "no puedo encontrar revisión de propiedad para `%s' (%s)." #: lily-guile.cc:521 msgid "perhaps a typing error?" -msgstr "" +msgstr "posiblemente un error de dedo?" #: lily-guile.cc:527 msgid "doing assignment anyway" -msgstr "" +msgstr "realizando asignación de todas maneras" #: lily-guile.cc:539 #, c-format msgid "type check for `%s' failed; value `%s' must be of type `%s'" -msgstr "" +msgstr "revisión de tipo para `%s' falló; el valor `%s' debe ser de tipo `%s'" #: lily-lexer.cc:254 -#, fuzzy, c-format +#, c-format msgid "identifier name is a keyword: `%s'" -msgstr "El nombre del identificativo es una palabra clave: `%s'" +msgstr "el identificador es una palabra clave: `%s'" #: lily-lexer.cc:269 #, c-format @@ -959,24 +945,24 @@ msgid "error at EOF: %s" msgstr "error al final del fichero (EOF): %s" #: lily-parser-scheme.cc:29 -#, fuzzy, c-format +#, c-format msgid "deprecated function called: %s" -msgstr "no puedo encontrar el carácter llamado: `%s'" +msgstr "función en desuso llamada: %s" #: lily-parser-scheme.cc:88 -#, fuzzy, c-format +#, c-format msgid "Changing working directory to: `%s'" -msgstr "no se puede crear el directorio: `%s'" +msgstr "Cambiando directorio de trabajo a: `%s'" #: lily-parser-scheme.cc:106 -#, fuzzy, c-format +#, c-format msgid "cannot find init file: `%s'" -msgstr "no puedo encontrar el fichero: `%s'" +msgstr "no puedo encontrar archivo de inicialización: `%s'" #: lily-parser-scheme.cc:125 -#, fuzzy, c-format +#, c-format msgid "Processing `%s'" -msgstr "Procesando `%s'..." +msgstr "Procesando `%s'" #: lily-parser.cc:99 msgid "Parsing..." @@ -984,25 +970,25 @@ msgstr "Analizando..." #: lily-parser.cc:127 msgid "braces do not match" -msgstr "" +msgstr "Llaves no concuerdan" #: lyric-combine-music-iterator.cc:291 -#, fuzzy, c-format +#, c-format msgid "cannot find Voice `%s'" -msgstr "no puedo encontrar el fichero: `%s'" +msgstr "no se puede encontrar Voice `%s'" #: main.cc:116 -#, fuzzy, c-format +#, c-format msgid "" "This program is free software. It is covered by the GNU General Public\n" "License and you are welcome to change it and/or distribute copies of it\n" "under certain conditions. Invoke as `%s --warranty' for more\n" "information.\n" msgstr "" -"Este software es libre. Está protegido por la Licencia Pública\n" -"General de GNU, y quedas invitado a modificarlo y/o distribuir copias de\n" -"él bajo ciertas condiciones. Invócalo como `%s --warranty' para más\n" -"información.\n" +"Este software es libre. Está protegido por la Licencia Pública\n" +"General de GNU, y es libre para modificarlo y/o distribuir copias de\n" +"él bajo ciertas condiciones. Invóquelo como `%s --warranty' para más\n" +"información.\n" #: main.cc:122 msgid "" @@ -1020,27 +1006,40 @@ msgid "" "the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n" "Boston, MA 02111-1307, USA.\n" msgstr "" +" Este programa es libre, puede redistribuirlo y/o \n" +"modificarlo bajo los términos de la Licencia Públic General GNU versión 2\n" +"tal como está publicada por la Fundación de Software Libre (FSF).\n" +" Este programa se distribuye con la esperanza de que será de utilidad,\n" +"pero sin NINGUNA CLASE DE GARANTÍA, ni siquiera implicada por COMERCIO o para PROPOSITO PARTICULAR. Vea la: " +"Licencia Pública General GNU para más detalles.\n" +" Debe haber recibido una copia de la Licencia Públic General GNU con este programa; si no es así, escriba a:\n" +"Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n" +"Boston, MA 02111-1307, USA.\n" #: main.cc:153 msgid "BACK" -msgstr "" +msgstr "REGRESAR" #: main.cc:153 msgid "" "use backend BACK (eps, gnome, ps [default],\n" "scm, svg, tex, texstr)" msgstr "" +"usar procesador BACK (eps, gnome, \n" +"ps [predet], scm, svg, tex, texstr)" #: main.cc:155 -#, fuzzy msgid "SYM[=VAL]" -msgstr "CLAVE=VALOR" +msgstr "SYM[=VAL]" #: main.cc:156 msgid "" "set Scheme option SYM to VAL (default: #t)\n" "Use -dhelp for help." msgstr "" +"asignando opción Scheme SYM a VAL \n" +"(por defecto: #t)\n" +"Use -dhelp para obtener ayuda." #: main.cc:159 msgid "EXPR" @@ -1048,64 +1047,63 @@ msgstr "EXPR" #: main.cc:159 msgid "evaluate scheme code" -msgstr "" +msgstr "evaluar código scheme" #. Bug in option parser: --output =foe is taken as an abbreviation #. for --output-format. #: main.cc:162 msgid "FORMATs" -msgstr "" +msgstr "FORMATOS" #: main.cc:162 msgid "dump FORMAT,... Also as separate options:" msgstr "" +"volcar FORMATO,... \n" +"También cómo opciones separadas:" #: main.cc:163 -#, fuzzy msgid "generate DVI (tex backend only)" -msgstr "generar una salida PostScript" +msgstr "generar DVI (sólo procesador tex)" #: main.cc:164 -#, fuzzy msgid "generate PDF (default)" -msgstr "generar una salida PostScript" +msgstr "generar salida PDF (predeterminado)" #: main.cc:165 -#, fuzzy msgid "generate PNG" -msgstr "generar una salida PostScript" +msgstr "generar salida PNG" #: main.cc:166 -#, fuzzy msgid "generate PostScript" -msgstr "generar una salida PostScript" +msgstr "generar salida PostScript" #: main.cc:167 msgid "generate TeX (tex backend only)" -msgstr "" +msgstr "generar TeX (sólo procesador tex)" #: main.cc:168 msgid "show this help and exit" -msgstr "" +msgstr "mostrar esta ayuda y salir" #: main.cc:169 msgid "FIELD" msgstr "CAMPO" #: main.cc:169 -#, fuzzy msgid "" "dump header field FIELD to file\n" "named BASENAME.FIELD" -msgstr "escribir campo de cabecera a BASENAME.FIELD" +msgstr "" +"vaciar campo de cabecera FIELD a fichero\n" +"llamado BASENAME.FIELD" #: main.cc:171 msgid "add DIR to search path" -msgstr "añadir DIR a la ruta de búsqueda" +msgstr "añadir DIR a la ruta de búsqueda" #: main.cc:172 msgid "use FILE as init file" -msgstr "usar FICHERO como fichero de inicialización" +msgstr "usar FICHERO como fichero de inicialización" #: main.cc:174 msgid "USER,GROUP,JAIL,DIR" @@ -1116,63 +1114,70 @@ msgid "" "chroot to JAIL, become USER:GROUP\n" "and cd into DIR" msgstr "" +"chroot a JAIL, convertirse en USER:GROUP\n" +"y cd en DIR" #: main.cc:177 -#, fuzzy msgid "do not generate printed output" -msgstr "generar una salida PostScript" +msgstr "no generar salida de impresión" #: main.cc:178 -#, fuzzy msgid "write output to FILE (suffix will be added)" -msgstr "escribir la salida en el FICHERO" +msgstr "" +"escribir la salida en FICHERO\n" +"(añadirá extensión)" #: main.cc:179 msgid "generate a preview of the first system" -msgstr "" +msgstr "generar previsualización del primer sistema" #: main.cc:180 msgid "relocate using directory of lilypond program" msgstr "" +"relocalice usando directorio del \n" +"programa lilypond" #: main.cc:181 msgid "" "disallow unsafe Scheme and PostScript\n" "operations" msgstr "" +"evitar operaciones inseguras de Scheme y \n" +"PostScript" #: main.cc:183 -#, fuzzy msgid "show version number and exit" -msgstr "mostrar número de versión" +msgstr "mostrar número de versión y salir" #: main.cc:224 -#, fuzzy, c-format +#, c-format msgid "" "Copyright (c) %s by\n" "%s and others." -msgstr "Copyright (c) %s " +msgstr "" +"Copyright (c) %s por\n" +"%s y otros." #. No version number or newline here. It confuses help2man. #: main.cc:251 -#, fuzzy, c-format +#, c-format msgid "Usage: %s [OPTION]... FILE..." -msgstr "Sintaxis: %s [OPCIÓN]... FICHERO..." +msgstr "Uso: %s [OPCIÓN]... FICHERO..." #: main.cc:253 #, c-format msgid "Typeset music and/or produce MIDI from FILE." -msgstr "" +msgstr "Grabar música y/o producir MIDI desde FICHERO" #: main.cc:255 #, c-format msgid "LilyPond produces beautiful music notation." -msgstr "" +msgstr "LilyPond produce una hermosa notación musical" #: main.cc:257 #, c-format msgid "For more information, see %s" -msgstr "" +msgstr "Para más información, vea %s" #: main.cc:259 #, c-format @@ -1180,103 +1185,105 @@ msgid "Options:" msgstr "Opciones: " #: main.cc:263 -#, fuzzy, c-format +#, c-format msgid "Report bugs via %s" -msgstr "Informar de gazapos a %s." +msgstr "Informe de errores por medio de %s" #: main.cc:309 #, c-format msgid "expected %d arguments with jail, found: %u" -msgstr "" +msgstr "se esperaba(n) %d argumentos con jail, se encontró: %u" #: main.cc:323 -#, fuzzy, c-format +#, c-format msgid "no such user: %s" -msgstr "no existe tal parámetro: %s" +msgstr "no hay tal usuario: %s" #: main.cc:325 #, c-format msgid "cannot get user id from user name: %s: %s" -msgstr "" +msgstr "no puedo obtener id de usuario a partir del nombre: %s: %s" #: main.cc:340 -#, fuzzy, c-format +#, c-format msgid "no such group: %s" -msgstr "no hay tal contexto: %s" +msgstr "no hay tal grupo: %s" #: main.cc:342 -#, fuzzy, c-format +#, c-format msgid "cannot get group id from group name: %s: %s" -msgstr "no puedo cambiar de `%s' a `%s'" +msgstr "imposible obtener id del grupo desde nombre del grupo: %s: %s" #: main.cc:350 -#, fuzzy, c-format +#, c-format msgid "cannot chroot to: %s: %s" -msgstr "no se puede crear el directorio: `%s'" +msgstr "no se puede hacer chroot a: %s: %s" #: main.cc:357 -#, fuzzy, c-format +#, c-format msgid "cannot change group id to: %d: %s" -msgstr "no puedo cambiar de `%s' a `%s'" +msgstr "imposible cambiar id de grupo a: %d: %s" #: main.cc:363 -#, fuzzy, c-format +#, c-format msgid "cannot change user id to: %d: %s" -msgstr "no puedo cambiar de `%s' a `%s'" +msgstr "imposible cambiar id de usuario a: %d: %s" #: main.cc:369 -#, fuzzy, c-format +#, c-format msgid "cannot change working directory to: %s: %s" -msgstr "no se puede crear el directorio: `%s'" +msgstr "imposible cambiar directorio de trabajo a: %s: %s" #: main.cc:415 #, c-format msgid "Evaluating %s" -msgstr "" +msgstr "Evaluando %s" #: main.cc:645 #, c-format msgid "exception caught: %s" -msgstr "" +msgstr "ocurrió una excepción: %s" #. FIXME: constant error message. #: mark-engraver.cc:154 msgid "rehearsalMark must have integer value" -msgstr "" +msgstr "rehearsalMark debe tener un valor de entero" #: mark-engraver.cc:160 msgid "mark label must be a markup object" -msgstr "" +msgstr "etiqueta mark debe tener un objeto markup" #: mensural-ligature-engraver.cc:85 msgid "ligature with less than 2 heads -> skipping" -msgstr "" +msgstr "ligadura con menos de dos notas -> saltando" #: mensural-ligature-engraver.cc:112 msgid "cannot determine pitch of ligature primitive -> skipping" -msgstr "" +msgstr "no puedo determinar nota de la primitiva de la ligadura -> saltando" #: mensural-ligature-engraver.cc:126 msgid "single note ligature - skipping" -msgstr "" +msgstr "ligadura de una sola nota - saltando" #: mensural-ligature-engraver.cc:138 msgid "prime interval within ligature -> skipping" -msgstr "" +msgstr "intervalo primo dentro de ligadura -> saltando" #: mensural-ligature-engraver.cc:150 msgid "mensural ligature: duration none of Mx, L, B, S -> skipping" -msgstr "" +msgstr "duración de ligadura mensural no es una de Mx, L, B o S -> saltando" #: mensural-ligature-engraver.cc:198 msgid "semibrevis must be followed by another one -> skipping" -msgstr "" +msgstr "semibrevis debe ser seguida de otra igual -> saltando" #: mensural-ligature-engraver.cc:209 msgid "" "semibreves can only appear at the beginning of a ligature,\n" "and there may be only zero or two of them" msgstr "" +"sólo puede aparecer una semibreve al principio de una ligadura.\n" +"y sólo puede haber cero o dos de ellas" #: mensural-ligature-engraver.cc:236 msgid "" @@ -1285,123 +1292,125 @@ msgid "" "the penultimate note must be another one,\n" "or the ligatura must be LB or SSB" msgstr "" +"terminación de ligadura inválida:\n" +"cuando la última nota es una brevis descendente.\n" +"la penúltima nota debe ser otra igual,\n" +"o la ligadura debe ser LB o SSB" #: mensural-ligature-engraver.cc:356 msgid "unexpected case fall-through" -msgstr "" +msgstr "no se contempló este caso" #: mensural-ligature.cc:141 msgid "Mensural_ligature: unexpected case fall-through" -msgstr "" +msgstr "Mensural_ligature: no se esperaba caso no contemplado" #: mensural-ligature.cc:192 msgid "Mensural_ligature: (join_right == 0)" msgstr "" #: midi-item.cc:152 -#, fuzzy, c-format +#, c-format msgid "no such MIDI instrument: `%s'" -msgstr "no hay este instrumento: `%s'" +msgstr "no hay tal instrumento MIDI: `%s'" #: midi-item.cc:285 #, c-format msgid "experimental: temporarily fine tuning (of %d cents) a channel." -msgstr "" +msgstr "experimental: tempralmente afinando (%d) el canal" #: midi-stream.cc:28 -#, fuzzy, c-format +#, c-format msgid "cannot open for write: %s: %s" -msgstr "no se puede abrir el fichero: `%s'" +msgstr "no se puede abrir para escritura: %s: %s" #: midi-stream.cc:44 -#, fuzzy, c-format +#, c-format msgid "cannot write to file: `%s'" -msgstr "no se puede abrir el fichero: `%s'" +msgstr "imposible escribir al fichero: `%s'" #: music-iterator.cc:171 msgid "Sending non-event to context" -msgstr "" +msgstr "Enviando evento nulo a contexto" #: music.cc:141 #, c-format msgid "octave check failed; expected \"%s\", found: \"%s\"" -msgstr "" +msgstr "revisión de octava falló; esperaba \"%s\", encontré: \"%s\"" #: music.cc:207 #, c-format msgid "transposition by %s makes alteration larger than double" -msgstr "" +msgstr "transposición por %s hace que la alteración sea mayor que doble" #: new-fingering-engraver.cc:96 msgid "cannot add text scripts to individual note heads" -msgstr "" +msgstr "no se puede agregar textos a notas individuales" #: new-fingering-engraver.cc:239 msgid "no placement found for fingerings" -msgstr "" +msgstr "no se pudo colocar la digitación" #: new-fingering-engraver.cc:240 msgid "placing below" -msgstr "" +msgstr "colocando abajo" #: note-collision.cc:457 -#, fuzzy msgid "ignoring too many clashing note columns" -msgstr "Demasiadas columnas de notas que chocan entre sí. Se las ignora." +msgstr "ignorando demasiadas columnas de notas en conflicto" #: note-column.cc:124 msgid "cannot have note heads and rests together on a stem" -msgstr "" +msgstr "no se pueden colocar cabezas de notas y silencios en la misma plica" #: note-head.cc:63 #, c-format msgid "none of note heads `%s' or `%s' found" -msgstr "" +msgstr "ninguna de las notas `%s' o `%s' encontradas" #: note-heads-engraver.cc:61 msgid "NoteEvent without pitch" -msgstr "" +msgstr "Evento de Nota sin tonalidad" #: open-type-font.cc:33 -#, fuzzy, c-format +#, c-format msgid "cannot allocate %lu bytes" -msgstr "no se puede abrir el fichero: `%s'" +msgstr "No se puede asignar %lu bytes" #: open-type-font.cc:37 -#, fuzzy, c-format +#, c-format msgid "cannot load font table: %s" -msgstr "no encuentro la fuente: `%s'" +msgstr "no se puede cargar tabla de fuentes: %s" #: open-type-font.cc:98 #, c-format msgid "unsupported font format: %s" -msgstr "" +msgstr "formato de fuente no soportado: %s" #: open-type-font.cc:100 #, c-format msgid "unknown error: %d reading font file: %s" -msgstr "" +msgstr "error desconocido: %d al leer archivo de fuente: %s" #: open-type-font.cc:173 open-type-font.cc:297 #, c-format msgid "FT_Get_Glyph_Name() returned error: %u" -msgstr "" +msgstr "FT_Get_Glyph_Name() regresó error: %u" #: page-turn-page-breaking.cc:205 msgid "" "cannot fit the first page turn onto a single page. Consider setting first-" "page-number to an even number." -msgstr "" +msgstr "no puedo ajustar primer vuelta de página a una sóla página. Considere asignar primero un número par para la primer página." #: page-turn-page-breaking.cc:218 #, c-format msgid "Calculating page and line breaks (%d possible page breaks)..." -msgstr "" +msgstr "Calculando paginación y cortes de línea (%d posibles cortes de página)" #: page-turn-page-breaking.cc:236 paper-score.cc:154 -#, fuzzy msgid "Drawing systems..." -msgstr "Creando voces..." +msgstr "Creando sistemas..." #: pango-font.cc:181 #, c-format @@ -1409,57 +1418,55 @@ msgid "" "Glyph has no name, but font supports glyph naming.\n" "Skipping glyph U+%0X, file %s" msgstr "" +"El glifo no tiene nombre, pero la fuente soporta el nombrado de glifos.\n" +"Saltando glifo U+%0X, archivo %s" #: pango-font.cc:224 -#, fuzzy, c-format +#, c-format msgid "no PostScript font name for font `%s'" -msgstr "no es un fichero PostScript: `%s'" +msgstr "no existe esa fuente PostScript: `%s'" #: pango-font.cc:272 msgid "FreeType face has no PostScript font name" -msgstr "" +msgstr "Fuente FreeType no tiene un nombre de fuente PostScript" #: paper-outputter-scheme.cc:33 -#, fuzzy, c-format +#, c-format msgid "Layout output to `%s'..." -msgstr "%s producidos en `%s'..." +msgstr "Diseño de página generado en `%s'..." #: paper-score.cc:105 -#, fuzzy msgid "Calculating line breaks..." -msgstr "Calculando las posiciones de las columnas" +msgstr "Calculando cortes de línea..." #: paper-score.cc:118 -#, fuzzy, c-format +#, c-format msgid "Element count %d (spanners %d) " -msgstr "Elementos contados %d" +msgstr "Elementos contados %d (spanners %d) " #: paper-score.cc:122 -#, fuzzy msgid "Preprocessing graphical objects..." -msgstr "Preprocesando elementos..." +msgstr "Preprocesando objetos gráficos..." #: parse-scm.cc:83 msgid "GUILE signaled an error for the expression beginning here" -msgstr "" +msgstr "GUILE señaló un error para la expresión iniciada aquí" #: percent-repeat-engraver.cc:200 -#, fuzzy msgid "unterminated percent repeat" -msgstr "prolongación sin terminar" +msgstr "repetición de porcentaje sin terminar" #: performance.cc:45 -#, fuzzy msgid "Track..." -msgstr "Pista ... " +msgstr "Pista..." #: performance.cc:74 msgid "MIDI channel wrapped around" -msgstr "" +msgstr "Se envolvió al canal MIDI" #: performance.cc:75 msgid "remapping modulo 16" -msgstr "" +msgstr "remapeando modulo 16" #: performance.cc:103 #, c-format @@ -1468,52 +1475,52 @@ msgstr "Salida MIDI a `%s'..." #: phrasing-slur-engraver.cc:146 msgid "unterminated phrasing slur" -msgstr "" +msgstr "ligadura de praseo no terminada" #: piano-pedal-engraver.cc:286 #, c-format msgid "expect 3 strings for piano pedals, found: %ld" -msgstr "" +msgstr "esperaba tres cadenas de texto para pedales de piano, se encontraron: %ld" #: piano-pedal-engraver.cc:301 piano-pedal-engraver.cc:312 #: piano-pedal-performer.cc:93 #, c-format msgid "cannot find start of piano pedal: `%s'" -msgstr "" +msgstr "No se encuentra pedal de piano inicial: `%s'" #: piano-pedal-engraver.cc:347 -#, fuzzy, c-format +#, c-format msgid "cannot find start of piano pedal bracket: `%s'" -msgstr "no puedo encontrar el principio del (de)crescendo" +msgstr "no se encuentra el principio del pedal: `%s'" #: program-option.cc:205 -#, fuzzy, c-format +#, c-format msgid "no such internal option: %s" -msgstr "no hay este instrumento: `%s'" +msgstr "no existe esa opción: %s" #: property-iterator.cc:74 #, c-format msgid "not a grob name, `%s'" -msgstr "" +msgstr "No es un nombre de elemento, `%s'" #: relative-octave-check.cc:38 msgid "Failed octave check, got: " -msgstr "" +msgstr "Falló la revisión de octava, se obtuvo: " #: relocate.cc:44 -#, fuzzy, c-format +#, c-format msgid "Setting %s to %s" -msgstr "no se puede crear el directorio: `%s'" +msgstr "Asignando %s a %s" #: relocate.cc:59 -#, fuzzy, c-format +#, c-format msgid "no such file: %s for %s" -msgstr "no hay tal contexto: %s" +msgstr "no hay tal archivo: %s para %s" #: relocate.cc:69 relocate.cc:87 -#, fuzzy, c-format +#, c-format msgid "no such directory: %s for %s" -msgstr "no hay tal contexto: %s" +msgstr "no existe el directorio: %s para %s" #: relocate.cc:79 #, c-format @@ -1523,22 +1530,22 @@ msgstr "" #: relocate.cc:99 #, c-format msgid "Relocation: compile prefix=%s, new prefix=%s" -msgstr "" +msgstr "Relocación: prefijo de compilación=%s, nuevo prefijo=%s" #: relocate.cc:129 #, c-format msgid "Relocation: framework_prefix=%s" -msgstr "" +msgstr "Relocación: framework_prefix=%s" #: relocate.cc:169 #, c-format msgid "Relocation: is absolute: argv0=%s" -msgstr "" +msgstr "Relocación: es absoluta: argv0=%s" #: relocate.cc:176 #, c-format msgid "Relocation: from cwd: argv0=%s" -msgstr "" +msgstr "Relocación: desde cwd: argv0=%s" #: relocate.cc:185 #, c-format @@ -1546,129 +1553,125 @@ msgid "" "Relocation: from PATH=%s\n" "argv0=%s" msgstr "" +"Relocación: desde TRAYECTO=%s\n" +"argv0=%s" #: relocate.cc:354 -#, fuzzy, c-format +#, c-format msgid "Relocation file: %s" -msgstr "no se puede abrir el fichero: `%s'" +msgstr "Archivo de relocación: %s" #: relocate.cc:390 #, c-format msgid "Unknown relocation command %s" -msgstr "" +msgstr "Comando de relocación desconocido: %s" #: rest-collision.cc:151 msgid "cannot resolve rest collision: rest direction not set" -msgstr "" +msgstr "no puedo resolver colisión de silencios: no se fijó dirección de silencio" #: rest-collision.cc:165 rest-collision.cc:210 msgid "too many colliding rests" -msgstr "" +msgstr "demasiados silencios en colisión" #: rest.cc:144 #, c-format msgid "rest `%s' not found" -msgstr "" +msgstr "silencio `%s' no encontrado" #: score-engraver.cc:67 -#, fuzzy, c-format +#, c-format msgid "cannot find `%s'" -msgstr "no se puede encontrar: `%s'" +msgstr "imposible encontrar: `%s'" #: score-engraver.cc:69 msgid "Music font has not been installed properly." -msgstr "" +msgstr "La fuente de música no ha sido instalada correctamente" #: score-engraver.cc:71 -#, fuzzy, c-format +#, c-format msgid "Search path `%s'" -msgstr "(ruta de búsqueda: `%s')" +msgstr "Ruta de búsqueda: `%s'" #: score-engraver.cc:73 msgid "Aborting" -msgstr "" +msgstr "Abortando" #: score.cc:225 -#, fuzzy msgid "already have music in score" -msgstr "ya tengo un crescendo" +msgstr "debe existir música en la partitura" #: score.cc:226 msgid "this is the previous music" -msgstr "" +msgstr "esta es la música previa" #: score.cc:231 -#, fuzzy msgid "errors found, ignoring music expression" -msgstr "" -"Erreurs trouvées/*, pas de traitement de la feuille de musique*/ Se han " -"encontrado errores/*, no se procesa la partitura*/" +msgstr "se encontraron errores, ignorando expresión musical" #. FIXME: #: script-engraver.cc:102 -#, fuzzy msgid "do not know how to interpret articulation: " -msgstr "No se sabe como interpretar la articulación `%s'" +msgstr "no se sabe como interpretar la articulación `%s'" #: script-engraver.cc:103 msgid "scheme encoding: " -msgstr "" +msgstr "codificación scheme" #: simple-spacer.cc:375 #, c-format msgid "No spring between column %d and next one" -msgstr "" +msgstr "No hay separación entre la columna %d y la siguiente" #: slur-engraver.cc:83 tuplet-engraver.cc:75 #, c-format msgid "direction of %s invalid: %d" -msgstr "" +msgstr "dirección de %s es inválida: %d" #: slur-engraver.cc:157 msgid "unterminated slur" -msgstr "" +msgstr "ligadura sin terminar" #: slur-engraver.cc:166 -#, fuzzy msgid "cannot end slur" -msgstr "no se puede encontrar: `%s'" +msgstr "no se puede terminar frase" #: source-file.cc:74 #, c-format msgid "expected to read %d characters, got %d" -msgstr "" +msgstr "se esperaba leer %d caracteres, se obtuvieron %d" #: staff-symbol-engraver.cc:62 msgid "staff-span event has no direction" -msgstr "" +msgstr "evento de 'staff-span' sin idirección" #: stem-engraver.cc:92 msgid "tremolo duration is too long" -msgstr "" +msgstr "la duración del trémolo es demasiado larga" #. FIXME: #: stem-engraver.cc:129 #, c-format msgid "adding note head to incompatible stem (type = %d)" -msgstr "" +msgstr "añadiendo cabeza de nota a plica incompatible (tipo = %d)" #: stem-engraver.cc:131 msgid "maybe input should specify polyphonic voices" -msgstr "" +msgstr "Quizás la entrada deba especificar voces polifónicas" #: stem.cc:105 msgid "weird stem size, check for narrow beams" -msgstr "" +msgstr "longitud extraña de plica, revisando barras angostas" #: stem.cc:641 #, c-format msgid "flag `%s' not found" -msgstr "" +msgstr "bandera `%s' no encontrada" #: stem.cc:652 #, c-format msgid "flag stroke `%s' not found" -msgstr "" +msgstr "flag stroke `%s' no encontrada" #: system.cc:180 #, c-format @@ -1676,25 +1679,25 @@ msgid "Element count %d." msgstr "Elementos contados %d." #: system.cc:276 -#, fuzzy, c-format +#, c-format msgid "Grob count %d" msgstr "Elementos contados %d" #: text-spanner-engraver.cc:61 msgid "cannot find start of text spanner" -msgstr "" +msgstr "no se puede encontrar inicio de spanner de texto" #: text-spanner-engraver.cc:73 msgid "already have a text spanner" -msgstr "" +msgstr "ya hay un spanner de texto" #: text-spanner-engraver.cc:133 msgid "unterminated text spanner" -msgstr "" +msgstr "spanner de texto sin terminar" #: tie-engraver.cc:264 msgid "lonely tie" -msgstr "" +msgstr "ligadura solitaria" #. #. Todo: should make typecheck? @@ -1704,14 +1707,14 @@ msgstr "" #: time-signature-engraver.cc:64 #, c-format msgid "strange time signature found: %d/%d" -msgstr "" +msgstr "se encontró un compás extraño: %d/%d" #. If there is no such symbol, we default to the numbered style. #. (Here really with a warning!) #: time-signature.cc:83 #, c-format msgid "time signature symbol `%s' not found; reverting to numbered style" -msgstr "" +msgstr "no se encontró un símbolo de compás `%s'; revirtiendo a estilo numerado" #: translator-ctors.cc:52 #, c-format @@ -1726,137 +1729,131 @@ msgstr "no se puede encontrar: `%s'" #: translator.cc:332 #, c-format msgid "Two simultaneous %s events, junking this one" -msgstr "" +msgstr "Dos eventos %s simultáneos, descartando este" #: translator.cc:333 #, c-format msgid "Previous %s event here" -msgstr "" +msgstr "Evento %s previo aquí" #: trill-spanner-engraver.cc:68 -#, fuzzy msgid "cannot find start of trill spanner" -msgstr "no puedo encontrar el principio del (de)crescendo" +msgstr "no se encuentra el inicio del trino" #: trill-spanner-engraver.cc:80 -#, fuzzy msgid "already have a trill spanner" -msgstr "ya tengo un crescendo" +msgstr "ya hay un trino" #: vaticana-ligature-engraver.cc:388 #, c-format msgid "" "ignored prefix (es) `%s' of this head according to restrictions of the " "selected ligature style" -msgstr "" +msgstr "se ignora prefijo(s) `%s' de esta nota de acuerdo a las restricciones de estilo de ligadura seleccionada" #: vaticana-ligature-engraver.cc:714 #, c-format msgid "Vaticana_ligature_engraver: setting `spacing-increment = %f': ptr =%ul" -msgstr "" +msgstr "Vaticana_ligature_engraver: asignando `spacing-increment = %f': ptr =%ul" #: vaticana-ligature.cc:84 msgid "flexa-height undefined; assuming 0" -msgstr "" +msgstr "flexa-height no definida, se asume 0" #: vaticana-ligature.cc:89 msgid "ascending vaticana style flexa" -msgstr "" +msgstr "estilo ascendente vaticana flexa" #: vaticana-ligature.cc:177 msgid "Vaticana_ligature: zero join (delta_pitch == 0)" -msgstr "" +msgstr "Vaticana_ligature: unión cero join (delta_pitch == 0)" #. fixme: be more verbose. #: volta-engraver.cc:144 -#, fuzzy msgid "cannot end volta spanner" -msgstr "no puedo encontrar el principio del (de)crescendo" +msgstr "no se encuentra en final de la repetición" #: volta-engraver.cc:154 msgid "already have a volta spanner, ending that one prematurely" -msgstr "" +msgstr "ya existe un spanner de volta, terminando este de forma prematura" #: volta-engraver.cc:158 -#, fuzzy msgid "also already have an ended spanner" -msgstr "ya tengo un crescendo" +msgstr "ya hay un final de volta" #: volta-engraver.cc:159 -#, fuzzy msgid "giving up" msgstr "Abandonando" #: parser.yy:702 msgid "\\paper cannot be used in \\score, use \\layout instead" -msgstr "" +msgstr "\\paper no puede ser usado en \\score, mejor use \\layout" #: parser.yy:726 msgid "need \\paper for paper block" -msgstr "" +msgstr "se requiere \\paper para la sección paper" #: parser.yy:1172 msgid "Grob name should be alphanumeric" -msgstr "" +msgstr "El nombre del elemento debe ser alfanumérico" #: parser.yy:1475 -#, fuzzy msgid "second argument must be pitch list" -msgstr "El segundo argumento debe ser un símbolo" +msgstr "El segundo argumento debe ser una lista de tonos" #: parser.yy:1502 parser.yy:1507 parser.yy:1972 msgid "have to be in Lyric mode for lyrics" -msgstr "" +msgstr "Debe estar en modo Lyric para letra" #: parser.yy:1604 msgid "expecting string as script definition" -msgstr "" +msgstr "esperando una cadena de texto como definición del script" #: parser.yy:1759 parser.yy:1809 #, c-format msgid "not a duration: %d" -msgstr "no es una duración: %d" +msgstr "no es una duración: %d" #: parser.yy:1926 msgid "have to be in Note mode for notes" -msgstr "" +msgstr "debe estar en modo de Note para notas" #: parser.yy:1987 msgid "have to be in Chord mode for chords" -msgstr "" +msgstr "debe estar en modo Chord para acordes" #: lexer.ll:176 msgid "stray UTF-8 BOM encountered" -msgstr "" +msgstr "se encontró caracter UTF-8 BOM aislado" #: lexer.ll:180 msgid "Skipping UTF-8 BOM" -msgstr "" +msgstr "Saltando UTF-8 BOM" #: lexer.ll:235 -#, fuzzy, c-format +#, c-format msgid "Renaming input to: `%s'" -msgstr "Limpiando `%s'..." +msgstr "Renombrando entrada a: `%s'" #: lexer.ll:252 msgid "quoted string expected after \\version" -msgstr "" +msgstr "se esperaba cadena entre comillas después de \\version" #: lexer.ll:256 msgid "quoted string expected after \\sourcefilename" -msgstr "" +msgstr "se esperaba cadena entre comillas después de \\sourcefilename" #: lexer.ll:260 msgid "integer expected after \\sourcefileline" -msgstr "" +msgstr "se esperaba un entero después de \\sourcefileline" #: lexer.ll:273 msgid "EOF found inside a comment" -msgstr "" +msgstr "Se encontró FIN de FICHERO dentro de un comentario" #: lexer.ll:288 msgid "\\maininput not allowed outside init files" -msgstr "" +msgstr "\\maininput no es permitido fuera de los archivos de incicialización" #: lexer.ll:312 #, c-format @@ -1866,176 +1863,174 @@ msgstr "identificativo equivocado o no definido: `%s'" #. backup rule #: lexer.ll:321 msgid "end quote missing" -msgstr "" +msgstr "comillas de cierre faltantes" #: lexer.ll:466 msgid "Brace found at end of lyric. Did you forget a space?" -msgstr "" +msgstr "Se encontró un corchete al final de una letra. ¿Olvidó poner espacio?" #: lexer.ll:559 msgid "Brace found at end of markup. Did you forget a space?" -msgstr "" +msgstr "Se encontró un corchete al final de un markup. ¿Olvidó poner espacio?" #: lexer.ll:659 #, c-format msgid "invalid character: `%c'" -msgstr "carácter no válido: `%c'" +msgstr "carácter no válido: `%c'" #: lexer.ll:774 lexer.ll:775 #, c-format msgid "unknown escaped string: `\\%s'" -msgstr "" +msgstr "cadena de escape desconocida: `\\%s'" #: lexer.ll:880 lexer.ll:881 #, c-format msgid "file too old: %s (oldest supported: %s)" -msgstr "" +msgstr "versión de archivo demasiado vieja: %s (más antigua soportada: %s)" #: lexer.ll:881 lexer.ll:882 -#, fuzzy msgid "consider updating the input with the convert-ly script" -msgstr "" -"Considere la conversión de la entrada con ayuda del guión (script) convert-ly" +msgstr "considere actualizar la entrada con el script convert-ly" #: lexer.ll:887 lexer.ll:888 #, c-format msgid "program too old: %s (file requires: %s)" -msgstr "" +msgstr "programa demasiado viejo: %s (archivo requiere: %s)" #: backend-library.scm:19 lily.scm:599 ps-to-png.scm:82 -#, fuzzy, scheme-format +#, scheme-format msgid "Invoking `~a'..." -msgstr "Invocando `%s'" +msgstr "Invocando `~a'..." #: backend-library.scm:24 #, scheme-format msgid "`~a' failed (~a)" -msgstr "" +msgstr "`~a' falló (~a)" #: backend-library.scm:95 framework-tex.scm:343 framework-tex.scm:368 -#, fuzzy, scheme-format +#, scheme-format msgid "Converting to `~a'..." -msgstr "Escribiendo `%s'..." +msgstr "Convirtiendo a `~a'..." #: backend-library.scm:108 -#, fuzzy, scheme-format +#, scheme-format msgid "Converting to ~a..." -msgstr "Escribiendo `%s'..." +msgstr "Convirtiendo a ~a..." #: backend-library.scm:145 -#, fuzzy, scheme-format +#, scheme-format msgid "Writing header field `~a' to `~a'..." -msgstr "escribiendo el campo de cabecera `%s' a `%s'" +msgstr "Escribiendo el campo de cabecera `~a' to `~a'..." #: define-context-properties.scm:20 define-grob-properties.scm:10 #: define-music-properties.scm:10 #, scheme-format msgid "symbol ~S redefined" -msgstr "" +msgstr "símbolo ~S redefinido" #: define-event-classes.scm:119 #, scheme-format msgid "event class ~A seems to be unused" -msgstr "" +msgstr "evento de clase ~A parece no ser usado" #. should be programming-error #: define-event-classes.scm:125 #, scheme-format msgid "translator listens to nonexisting event class ~A" -msgstr "" +msgstr "traductor escucha a un evento de clase inexistente ~A" #: define-markup-commands.scm:255 msgid "no systems found in \\score markup, does it have a \\layout block?" -msgstr "" +msgstr "No se encontraron sistemas en el bloque \\score, tiene un bloque de \\layout?" #: define-markup-commands.scm:1297 -#, fuzzy, scheme-format +#, scheme-format msgid "not a valid duration string: ~a" -msgstr "no es una duración: %d" +msgstr "no representa una duración válida: ~a" #: define-music-types.scm:751 #, scheme-format msgid "symbol expected: ~S" -msgstr "" +msgstr "se esperaba un símbolo:~S" #: define-music-types.scm:754 -#, fuzzy, scheme-format +#, scheme-format msgid "cannot find music object: ~S" -msgstr "no se puede encontrar el contexto de `%s'" +msgstr "no se encuentra objeto musical: ~S" #: define-music-types.scm:774 -#, fuzzy, scheme-format +#, scheme-format msgid "unknown repeat type `~S'" -msgstr "traductor desconocido: `%s'" +msgstr "tipo de repetición desconocido `~S'" #: define-music-types.scm:775 msgid "See music-types.scm for supported repeats" -msgstr "" +msgstr "Vea music-types.scp para repeticiones soportadas" #: document-backend.scm:91 #, scheme-format msgid "pair expected in doc ~s" -msgstr "" +msgstr "se esperaba un par en doc ~s" #: document-backend.scm:135 -#, fuzzy, scheme-format +#, scheme-format msgid "cannot find interface for property: ~S" -msgstr "no puedo encontrar el carácter número: %d" +msgstr "no se encuentra interface para la propiedad: ~S" #: document-backend.scm:145 -#, fuzzy, scheme-format +#, scheme-format msgid "unknown Grob interface: ~S" -msgstr "traductor desconocido: `%s'" +msgstr "Interface de elemento desconocida: ~S" #: documentation-lib.scm:45 -#, fuzzy, scheme-format +#, scheme-format msgid "Processing ~S..." -msgstr "Procesando..." +msgstr "Procesando ~S..." #: documentation-lib.scm:150 -#, fuzzy, scheme-format +#, scheme-format msgid "Writing ~S..." -msgstr "Escribiendo `%s'..." +msgstr "Escribiendo ~S..." #: documentation-lib.scm:172 -#, fuzzy, scheme-format +#, scheme-format msgid "cannot find description for property ~S (~S)" -msgstr "no puedo encontrar el carácter número: %d" +msgstr "no se encuentra la descripción para la propiedad ~S(~S)" #: framework-eps.scm:91 framework-eps.scm:92 -#, fuzzy, scheme-format +#, scheme-format msgid "Writing ~a..." -msgstr "Escribiendo `%s'..." +msgstr "Escribiendo ~a..." #: framework-ps.scm:279 #, scheme-format msgid "cannot embed ~S=~S" -msgstr "" +msgstr "no se puede empotrar ~S=~S" #: framework-ps.scm:332 #, scheme-format msgid "cannot extract file matching ~a from ~a" -msgstr "" +msgstr "no se puede extraer archivo que concuerde ~a desde ~a" #: framework-ps.scm:349 #, scheme-format msgid "do not know how to embed ~S=~S" -msgstr "" +msgstr "se ignora como empotrar ~S=~S" #: framework-ps.scm:380 -#, fuzzy, scheme-format +#, scheme-format msgid "do not know how to embed font ~s ~s ~s" -msgstr "No se sabe como interpretar la articulación `%s'" +msgstr "no se sabe como empotrar la fuente ~s ~s ~s" #: framework-ps.scm:729 #, scheme-format msgid "cannot convert to ~S" -msgstr "" +msgstr "no se puede convertir a ~S" #: framework-ps.scm:748 framework-ps.scm:751 #, scheme-format msgid "cannot generate ~S using the postscript back-end" -msgstr "" +msgstr "no se puede generar ~S usando el backend postscript" #: framework-ps.scm:758 msgid "" @@ -2047,719 +2042,170 @@ msgid "" "\n" "or remove the lilypond-book specific settings from the input.\n" msgstr "" +"\n" +"El procesador PostScript no soporta la infraestructura 'clásica'.\n" +"Use el procesador EPS en su lugar.\n" +" lilipond -b eps \n" +"\\ " +"o elimine sintaxis específicas de lilypond-book de la entrada.\n" #: framework-tex.scm:360 -#, fuzzy, scheme-format +#, scheme-format msgid "TeX file name must not contain whitespace: `~a'" -msgstr "el nombre del fichero no debería contener espacios: `%s'" +msgstr "El nombre del archivo TeX no puede contener espacios: `~a'" #: layout-beam.scm:29 #, scheme-format msgid "Error in beam quanting. Expected (~S,~S) found ~S." -msgstr "" +msgstr "Error en cuantizado de barras. Esperaba (~S,~S) se encontró ~S" #: layout-beam.scm:46 #, scheme-format msgid "Error in beam quanting. Expected ~S 0, found ~S." -msgstr "" +msgstr "Error en cuantizado de barras. Esperaba ~S 0, se encontró ~S" #: layout-page-layout.scm:357 -#, fuzzy msgid "Calculating page breaks..." -msgstr "Calculando las posiciones de las columnas" +msgstr "Calculando cortes de página..." #: lily-library.scm:593 -#, fuzzy, scheme-format +#, scheme-format msgid "unknown unit: ~S" -msgstr "traductor desconocido: `%s'" +msgstr "unidad desconocida: ~S" #: lily-library.scm:626 #, scheme-format msgid "no \\version statement found, please add~afor future compatibility" -msgstr "" +msgstr "no se encontró enunciado \\version, por favor añáda ~a para compatibilidad futura." #: lily-library.scm:633 msgid "old relative compatibility not used" -msgstr "" +msgstr "old relative: compatibilidad anitgua no se usó" #: lily.scm:144 -#, fuzzy, scheme-format +#, scheme-format msgid "cannot find: ~A" -msgstr "no se puede encontrar: `%s'" +msgstr "no se puede encontrar: ~A" #: lily.scm:209 #, scheme-format msgid "wrong type for argument ~a. Expecting ~a, found ~s" -msgstr "" +msgstr "argumento erróneo ~a. Se esperaba ~a, se encontró ~s" #: lily.scm:525 lily.scm:589 #, scheme-format msgid "failed files: ~S" -msgstr "" +msgstr "se falló en los archivos: ~S" #: lily.scm:579 -#, fuzzy, scheme-format +#, scheme-format msgid "Redirecting output to ~a..." -msgstr "dependencias producidas en `%s'..." +msgstr "Redirigiendo salida a ~a..." #: ly-syntax-constructors.scm:40 msgid "Music head function must return Music object" -msgstr "" +msgstr "Función de cabecera de Music debe regresar un objeto Music." #: ly-syntax-constructors.scm:136 #, scheme-format msgid "Invalid property operation ~a" -msgstr "" +msgstr "Operación de propiedad inválida ~a" #: markup.scm:123 #, scheme-format msgid "Wrong number of arguments. Expect: ~A, found ~A: ~S" -msgstr "" +msgstr "Cantidad errónea de argumentos. Esperaba: ~A, se encontró ~A: ~S" #: markup.scm:129 #, scheme-format msgid "Invalid argument in position ~A. Expect: ~A, found: ~S." -msgstr "" +msgstr "Argumento erróneo en la posición ~A. .Esperaba: ~A, se encontró: ~S" #: music-functions.scm:213 msgid "More alternatives than repeats. Junking excess alternatives" -msgstr "" +msgstr "Más alternativas que repeticiones. Descartando alternativas excedentes." #: music-functions.scm:232 #, scheme-format msgid "expecting 2 elements for chord tremolo, found ~a" -msgstr "" +msgstr "se esperaban dos elementos den trémolo de acorde, se encontró ~a" #: music-functions.scm:538 #, scheme-format msgid "music expected: ~S" -msgstr "" +msgstr "se esperaba música: ~S" #. FIXME: uncomprehensable message #: music-functions.scm:589 #, scheme-format msgid "Bar check failed. Expect to be at ~a, instead at ~a" -msgstr "" +msgstr "Revisión de compases falló. Esperaba estar en ~a, en vez de ~a " #: music-functions.scm:748 -#, fuzzy, scheme-format +#, scheme-format msgid "cannot find quoted music: `~S'" -msgstr "no encuentro la fuente: `%s'" +msgstr "no se encuentra la música: `~S'" #: music-functions.scm:942 -#, fuzzy, scheme-format +#, scheme-format msgid "unknown accidental style: ~S" -msgstr "traductor desconocido: `%s'" +msgstr "estilo desconocido de accidentes: ~S" #: output-ps.scm:315 msgid "utf-8-string encountered in PS backend" -msgstr "" +msgstr "se encontró una cadena utf-8 en el procesador PS" #: output-svg.scm:42 -#, fuzzy, scheme-format +#, scheme-format msgid "undefined: ~S" -msgstr "prolongación sin terminar" +msgstr "indefinido: ~S" #: output-svg.scm:132 #, scheme-format msgid "cannot decypher Pango description: ~a" -msgstr "" +msgstr "no puedo descifrar descripción Pango: ~a" #: output-tex.scm:98 -#, fuzzy, scheme-format +#, scheme-format msgid "cannot find ~a in ~a" -msgstr "no encuentro la fuente: `%s'" +msgstr "no se puede enconrtar ~a en ~a" #: paper.scm:69 msgid "Not in toplevel scope" -msgstr "" +msgstr "No en el ámbito superior" #: paper.scm:117 #, scheme-format msgid "This is not a \\layout {} object, ~S" -msgstr "" +msgstr "Este no es un objeto \\layout{}, ~S" #: paper.scm:129 #, scheme-format msgid "Unknown papersize: ~a" -msgstr "" +msgstr "papersize (tamaño de papel) desconocido: ~a" #. TODO: should raise (generic) exception with throw, and catch #. that in parse-scm.cc #: paper.scm:144 msgid "Must use #(set-paper-size .. ) within \\paper { ... }" -msgstr "" +msgstr "Debe usar #(set-paper-size .. ) dentro de \\paper { ... }" #: parser-clef.scm:126 -#, fuzzy, scheme-format +#, scheme-format msgid "unknown clef type `~a'" -msgstr "traductor desconocido: `%s'" +msgstr "tipo de clave desconocida `~a'" #: parser-clef.scm:127 msgid "see scm/clef.scm for supported clefs" -msgstr "" +msgstr "vea scm/clef.scm para las claves soportadas" #: ps-to-png.scm:88 -#, fuzzy, scheme-format +#, scheme-format msgid "~a exited with status: ~S" -msgstr "fin de la orden con valor %d" +msgstr "~a terminó con estado: ~S" #: to-xml.scm:190 #, scheme-format msgid "assertion failed: ~S" -msgstr "" - -#, fuzzy -#~ msgid "show warranty" -#~ msgstr "mostrar los avisos de garantía y de copyright" - -#, fuzzy -#~ msgid "loading default font" -#~ msgstr "Cargando la fuente por defecto" - -#~ msgid "cannot find default font: `%s'" -#~ msgstr "no puedo encontrar la fuente por defecto: `%s'" - -#~ msgid "crescendo too small" -#~ msgstr "crescendo demasiado pequeño" - -#~ msgid "print this help" -#~ msgstr "esta ayuda" - -#, fuzzy -#~ msgid "cannot open file %s" -#~ msgstr "no se puede abrir el fichero: `%s'" - -#, fuzzy -#~ msgid "Incorrect lilypond version: %s (%s, %s)" -#~ msgstr "versión de lilypond incorrecta: %s (%s, %s)" - -#~ msgid "no one to print a tremolos" -#~ msgstr "ninguno para la impresión de trémolos" - -#, fuzzy -#~ msgid "junking event: `%s'" -#~ msgstr "Invocando `%s'" - -#~ msgid "no one to print a repeat brace" -#~ msgstr "ninguno para la impresión de llaves repetidas" - -#~ msgid "cannot find `%s' context" -#~ msgstr "no se puede encontrar el contexto de `%s'" - -#, fuzzy -#~ msgid "no feasible line breaking found" -#~ msgstr "No se ha encontrado ninguna ruptura de línea factible" - -#~ msgid "Creator: " -#~ msgstr "Creador: " - -#, fuzzy -#~ msgid "at " -#~ msgstr ", en " - -#, fuzzy -#~ msgid "in quotation: junking event %s" -#~ msgstr "Invocando `%s'" - -#, fuzzy -#~ msgid "unterminated trill spanner" -#~ msgstr "prolongación sin terminar" - -#, fuzzy -#~ msgid "identifier should have alphabetic characters only" -#~ msgstr "El identificativo debería contener solamente caracteres alfabéticos" - -#, fuzzy -#~ msgid "cannot find signature for music function" -#~ msgstr "no se puede encontrar el contexto de `%s'" - -#, fuzzy -#~ msgid "Opening pipe `%s'" -#~ msgstr "Limpiando `%s'..." - -#~ msgid "(ignored)" -#~ msgstr "(ignorado)" - -#~ msgid "Cleaning %s..." -#~ msgstr "Limpiando %s..." - -#, fuzzy -#~ msgid "Usage: %s [OPTION]... [FILE]..." -#~ msgstr "Sintaxis: %s [OPCIÓN]... FICHERO..." - -#, fuzzy -#~ msgid "%s: skipping: `%s'" -#~ msgstr "no existe tal parámetro: %s" - -#, fuzzy -#~ msgid "print version information" -#~ msgstr "mostrar número de versión" - -#~ msgid "getopt says: `%s'" -#~ msgstr "getopt() dice: `%s'" - -#~ msgid "command exited with value %d" -#~ msgstr "fin de la orden con valor %d" - -#~ msgid "debug" -#~ msgstr "depurar" - -#~ msgid "define macro NAME [optional expansion EXP]" -#~ msgstr "define la macro NOMBRE [EXPRESIÓN de expansión opcional]" - -#~ msgid "only pre-process" -#~ msgstr "solamente preprocesar" - -#~ msgid "no such context: %s" -#~ msgstr "no hay tal contexto: %s" - -#~ msgid "Processing `%s'..." -#~ msgstr "Procesando `%s'..." - -#, fuzzy -#~ msgid "Wrote `%s'" -#~ msgstr "Escribiendo `%s'..." - -#, fuzzy -#~ msgid "cannot dlopen: %s: %s" -#~ msgstr "no se puede abrir el fichero: `%s'" - -#, fuzzy -#~ msgid "install package: %s or %s" -#~ msgstr "no puedo cambiar de `%s' a `%s'" - -#, fuzzy -#~ msgid "parsing AFM file: `%s'" -#~ msgstr "Error de análisis sintáctico del fichero AFM: `%s'" - -#~ msgid "checksum mismatch for font file: `%s'" -#~ msgstr "suma de control no acorde para el fichero de fuentes: `%s'" - -#~ msgid "does not match: `%s'" -#~ msgstr "no concuerda: `%s'" - -#, fuzzy -#~ msgid "Rebuild all .afm files, and remove all .pk and .tfm files." -#~ msgstr "" -#~ "Reconstruir todos los ficheros .afm, y borrar todos los ficheros .pk y ." -#~ "tfm. Re-ejecutar con la opción -V para mostrar las rutas de las fuentes." - -#, fuzzy -#~ msgid "adding lilypond directory: %s" -#~ msgstr "no se puede crear el directorio: `%s'" - -#~ msgid "Separation_item: I've been drinking too much" -#~ msgstr "Separation_item: He bebido demasiado" - -#, fuzzy -#~ msgid "suspect duration in beam: %s" -#~ msgstr "no es una duración: %d" - -#, fuzzy -#~ msgid "syntax error: cannot back up" -#~ msgstr "error no fatal: " - -#, fuzzy -#~ msgid "Stack now" -#~ msgstr "pista " - -#, fuzzy -#~ msgid "Reading a token: " -#~ msgstr "Limpiando `%s'..." - -#, fuzzy -#~ msgid "syntax error, unexpected %s" -#~ msgstr "error no fatal: " - -#, fuzzy -#~ msgid "syntax error, unexpected %s, expecting %s" -#~ msgstr "error no fatal: " - -#, fuzzy -#~ msgid "syntax error, unexpected %s, expecting %s or %s" -#~ msgstr "error no fatal: " - -#, fuzzy -#~ msgid "syntax error, unexpected %s, expecting %s or %s or %s" -#~ msgstr "error no fatal: " - -#, fuzzy -#~ msgid "syntax error; also memory exhausted" -#~ msgstr "error no fatal: " - -#, fuzzy -#~ msgid "syntax error" -#~ msgstr "error no fatal: " - -#, fuzzy -#~ msgid "cannot find CFF/PFA/PFB font ~S=~S" -#~ msgstr "no encuentro la fuente: `%s'" - -#, fuzzy -#~ msgid "unknown bar glyph: `~S'" -#~ msgstr "traductor desconocido: `%s'" - -#, fuzzy -#~ msgid "Extracting fonts to %s..." -#~ msgstr "no se puede crear el directorio: `%s'" - -#, fuzzy -#~ msgid "Writing %s..." -#~ msgstr "Escribiendo `%s'..." - -#, fuzzy -#~ msgid "Second argument must be pitch list." -#~ msgstr "El segundo argumento debe ser un símbolo" - -#, fuzzy -#~ msgid "programming error: " -#~ msgstr "error de programación: " - -#, fuzzy -#~ msgid "Programming error: " -#~ msgstr "error de programación: " - -#~ msgid "I'm one myself" -#~ msgstr "Yo mismo soy uno" - -#~ msgid "Huh? Got %d, expected %d characters" -#~ msgstr "¿Eh? Se han obtenido %d caracteres, cuando se esperaban %d" - -#~ msgid "EXT" -#~ msgstr "EXT" - -#, fuzzy -#~ msgid "kpathsea cannot find %s file: `%s'" -#~ msgstr "no puedo encontrar el fichero: `%s'" - -#, fuzzy -#~ msgid "kpathsea cannot find file: `%s'" -#~ msgstr "no puedo encontrar el fichero: `%s'" - -#, fuzzy -#~ msgid "EXTs" -#~ msgstr "EXT" - -#, fuzzy -#~ msgid "generate DVI" -#~ msgstr "generar una salida PostScript" - -#, fuzzy -#~ msgid "generate TeX" -#~ msgstr "generar una salida PostScript" - -#, fuzzy -#~ msgid "kpathsea can not find %s file: `%s'" -#~ msgstr "no puedo encontrar el fichero: `%s'" - -#, fuzzy -#~ msgid "kpathsea can not find AFM file `%s'" -#~ msgstr "no puedo encontrar el fichero: `%s'" - -#, fuzzy -#~ msgid "kpathsea can not find TFM file: `%s'" -#~ msgstr "no puedo encontrar el fichero: `%s'" - -#, fuzzy -#~ msgid "Converting to `~a.ps'..." -#~ msgstr "Escribiendo `%s'..." - -#~ msgid "find pfa fonts used in FILE" -#~ msgstr "buscar las fuentes pfa utilizadas en FICHERO" - -#~ msgid "add DIR to LilyPond's search path" -#~ msgstr "añadir DIR a la ruta de búsqueda de LilyPond" - -#, fuzzy -#~ msgid "keep all output, output to directory %s.dir" -#~ msgstr "conservar todas las salidas, y nombrar el directorio %s.dir" - -#~ msgid "do not run LilyPond" -#~ msgstr "no ejecutar LilyPond" - -#~ msgid "produce MIDI output only" -#~ msgstr "producir solamente una salida MIDI" - -#, fuzzy -#~ msgid "generate PDF output" -#~ msgstr "generar una salida PostScript" - -#, fuzzy -#~ msgid "generate PS.GZ" -#~ msgstr "generar una salida PostScript" - -#~ msgid "change global setting KEY to VAL" -#~ msgstr "cambiar el parámetro global CLAVE a VALOR" - -#, fuzzy -#~ msgid "Continuing..." -#~ msgstr "Ejecutando %s..." - -#~ msgid "Analyzing %s..." -#~ msgstr "Analizando %s..." - -#, fuzzy -#~ msgid "no LilyPond output found for `%s'" -#~ msgstr "no se ha encontrado ninguna salida de lilypond para %s" - -#, fuzzy -#~ msgid "no files specified on command line" -#~ msgstr "no se ha especificado ningún fichero en la línea de órdenes." - -#, fuzzy -#~ msgid "%s output to ..." -#~ msgstr "%s producidos en `%s'..." - -#, fuzzy -#~ msgid "%s output to %s..." -#~ msgstr "%s producidos en `%s'..." - -#, fuzzy -#~ msgid "cannot find file: `%s.%s'" -#~ msgstr "no puedo encontrar el fichero: `%s'" - -#, fuzzy -#~ msgid "DIM" -#~ msgstr "DIR" - -#, fuzzy -#~ msgid "write dependencies" -#~ msgstr "añadir el prefijo DIR a las dependencias" - -#, fuzzy -#~ msgid "prepend PREF before each -M dependency" -#~ msgstr "añadir el prefijo DIR a las dependencias" - -#, fuzzy -#~ msgid "do not run lilypond" -#~ msgstr "no ejecutar LilyPond" - -#~ msgid "write Makefile dependencies for every input file" -#~ msgstr "crear las dependencias para Makefile de cada fichero de entrada" - -#, fuzzy -#~ msgid "invalid value: `%s'" -#~ msgstr "valor no válido: %s" - -#, fuzzy -#~ msgid "Writing HTML menu `%s'" -#~ msgstr "Escribiendo `%s'..." - -#, fuzzy -#~ msgid "programming error: %s (Continuing; cross thumbs)\n" -#~ msgstr " (Continuando; cruza los dedos)" - -#~ msgid "NaN" -#~ msgstr "NaN" - -#, fuzzy -#~ msgid "" -#~ "Nothing to connect extender to on the left. Ignoring extender event." -#~ msgstr "" -#~ "Nada a la izquierda a lo que conectar la prologación. Ignorando la " -#~ "petición de prolongación." - -#, fuzzy -#~ msgid "Nothing to connect hyphen to on the left. Ignoring hyphen event." -#~ msgstr "" -#~ "Nada a la izquierda a lo que conectar la prologación. Ignorando la " -#~ "petición de prolongación." - -#~ msgid "Score contains errors; will not process it" -#~ msgstr "La partitura contiene errores; no será procesada." - -#~ msgid "Now processing: `%s'" -#~ msgstr "Ahora en proceso: `%s'" - -#~ msgid "prepend DIR to dependencies" -#~ msgstr "añadir el prefijo DIR a las dependencias" - -#~ msgid "inhibit file output naming and exporting" -#~ msgstr "inhibir la denominación del fichero de salida y la exportación" - -#~ msgid "silly duration" -#~ msgstr "duración ridícula" - -#~ msgid "I'm one myself: `%s'" -#~ msgstr "Yo mismo soy uno: `%s'" - -#~ msgid "from musical definition: %s" -#~ msgstr "a partir de la definición musical: %s" - -#, fuzzy -#~ msgid "unterminated pedal bracket" -#~ msgstr "prolongación sin terminar" - -#~ msgid "Already contains: `%s'" -#~ msgstr "Ya contiene: `%s'" - -#~ msgid "Not adding translator: `%s'" -#~ msgstr "No se añade el traductor: `%s'" - -#~ msgid "Fetch and rebuild from latest source package" -#~ msgstr "Obtener y reconstruir a partir del último paquete fuente" - -#~ msgid "unpack and build in DIR [%s]" -#~ msgstr "desempaquetar y construir en DIR [%s]" - -#~ msgid "execute COMMAND, subtitute:" -#~ msgstr "ejecutar la órden de sustitución:" - -#~ msgid "%b: build root" -#~ msgstr "%b: construir la raíz" - -#~ msgid "%n: package name" -#~ msgstr "%n: nombre del paquete" - -#~ msgid "%r: release directory" -#~ msgstr "%r: directorio de publicación" - -#~ msgid "%t: tarball" -#~ msgstr "%t: tarball" - -#~ msgid "%v: package version" -#~ msgstr "%v: versión del paquete" - -#~ msgid "keep all output, and name the directory %s" -#~ msgstr "conservar todas las salidas, y nombrar el directorio %s" - -#~ msgid "upon failure notify EMAIL[,EMAIL]" -#~ msgstr "en caso de fallo avisar por EMAIL[,EMAIL]" - -#~ msgid "remove previous build" -#~ msgstr "eliminar la construcción anterior" - -#~ msgid "fetch and build URL [%s]" -#~ msgstr "obtener y construir el URL [%s]" - -#~ msgid "latest is: %s" -#~ msgstr "el último es: %s" - -#~ msgid "Fetching `%s'..." -#~ msgstr "Obteniendo `%s'..." - -#~ msgid "Building `%s'..." -#~ msgstr "Construyendo `%s'..." - -#~ msgid "invalid subtraction: not part of chord: %s" -#~ msgstr "sustracción no válida: no forma parte del acorde: %s" - -#~ msgid "invalid inversion pitch: not part of chord: %s" -#~ msgstr "inversión de tonos no válida: no forma parte del acorde: %s" - -#~ msgid ", at " -#~ msgstr ", en " - -#~ msgid "Generate .dvi with LaTeX for LilyPond" -#~ msgstr "Generar un fichero .dvi con la ayuda de LaTeX para LilyPond" - -#~ msgid "cannot map file" -#~ msgstr "no es posible producir el fichero map" - -#~ msgid "This binary was compiled with the following options:" -#~ msgstr "Este binario fue compilado con las siguientes opciones:" - -#~ msgid "%s is far from completed. Not all constructs are recognised." -#~ msgstr "" -#~ "%s está lejos de estar completo. No se han reconocido todas las " -#~ "construcciones." - -#~ msgid "EOF in a string" -#~ msgstr "Fin de fichero (EOF) en una cadena" - -#~ msgid "" -#~ msgstr "" - -#~ msgid "unknown spacing pair `%s', `%s'" -#~ msgstr "par de espacimiento desconocido `%s', `%s'" - -#~ msgid "track %d:" -#~ msgstr "pista %d:" - -#~ msgid "% MIDI copyright:" -#~ msgstr "% Copyright MIDI:" - -#~ msgid "% MIDI instrument:" -#~ msgstr "% Instrumento MIDI:" - -#~ msgid "% Creator: " -#~ msgstr "% Creador: " - -#~ msgid "% Automatically generated" -#~ msgstr "% Generado automáticamente" - -#~ msgid "% from input file: " -#~ msgstr "% a partir del fichero de entrada: " - -#~ msgid "set FILE as default output" -#~ msgstr "establecer FICHERO como salida por defecto" - -#~ msgid "be quiet" -#~ msgstr "trabajar en silencio" - -#~ msgid "do not output rests or skips" -#~ msgstr "no producir pausas o saltos" - -#~ msgid "set smallest duration" -#~ msgstr "definir la duración más pequeña" - -#~ msgid "do not timestamp the output" -#~ msgstr "no datar la salida" - -#~ msgid "assume no double dotted notes" -#~ msgstr "no asumir notas doblemente puntuadas" - -#~ msgid "Usage: %s [OPTION]... [FILE]" -#~ msgstr "Sintaxis: %s [OPCIÓN]... [FICHERO]" - -#~ msgid "Translate MIDI-file to lilypond" -#~ msgstr "Traducir un fichero MIDI a lilypond" - -#~ msgid "no_double_dots: %d\n" -#~ msgstr "no_double_dots: %d\n" - -#~ msgid "no_rests: %d\n" -#~ msgstr "no_rests: %d\n" - -#~ msgid "no_quantify_b_s: %d\n" -#~ msgstr "no_quantify_b_s: %d\n" - -#~ msgid "no_smaller_than: %d (1/%d)\n" -#~ msgstr "no_smaller_than: %d (1/%d)\n" - -#~ msgid "no_tuplets: %d\n" -#~ msgstr "no_tuplets: %d\n" - -#~ msgid "zero length string encountered" -#~ msgstr "encontrada cadena de longitud cero" - -#~ msgid "MIDI header expected" -#~ msgstr "Esperado encabezado de formato MIDI" - -#~ msgid "invalid header length" -#~ msgstr "longitud del encabezado no válida" - -#~ msgid "invalid MIDI format" -#~ msgstr "formato MIDI no válido" - -#~ msgid "invalid number of tracks" -#~ msgstr "número de pistas no válido" - -#~ msgid "cannot handle non-metrical time" -#~ msgstr "no se pueden manejar tiempos no métricos" - -#~ msgid "invalid running status" -#~ msgstr "estado de ejecución no válido" - -#~ msgid "unimplemented MIDI meta-event" -#~ msgstr "meta-evento MIDI no implementado" - -#~ msgid "invalid MIDI event" -#~ msgstr "evento MIDI no válido" - -#~ msgid "MIDI track expected" -#~ msgstr "Esperada pista MIDI" +msgstr "declaración falló: ~S" -#~ msgid "invalid track length" -#~ msgstr "longitud de pista no válida" diff --git a/python/convertrules.py b/python/convertrules.py index a2ac08534b..06f572e204 100644 --- a/python/convertrules.py +++ b/python/convertrules.py @@ -604,24 +604,25 @@ def conv (str): return str conversions.append (((1,3,113), conv, 'LyricVoice -> LyricsVoice')) +def regularize_id (str): + s = '' + lastx = '' + for x in str: + if x == '_': + lastx = x + continue + elif x in string.digits: + x = chr(ord (x) - ord ('0') +ord ('A')) + elif x not in string.letters: + x = 'x' + elif x in string.lowercase and lastx == '_': + x = string.upper (x) + s = s + x + lastx = x + return s def conv (str): - def regularize_id (str): - s = '' - lastx = '' - for x in str: - if x == '_': - lastx = x - continue - elif x in string.digits: - x = chr(ord (x) - ord ('0') +ord ('A')) - elif x not in string.letters: - x = 'x' - elif x in string.lowercase and lastx == '_': - x = string.upper (x) - s = s + x - lastx = x - return s + def regularize_dollar_reference (match): return regularize_id (match.group (1)) @@ -2885,3 +2886,69 @@ def conv (str): conversions.append (((2, 11, 2), conv, """ly:clone-parser -> ly:parser-clone""")) + + +def conv (str): + str = re.sub ("Accidental\s*#'cautionary-style\s*=\s*#'smaller", + "AccidentalCautionary #'font-size = #-2", str) + str = re.sub ("Accidental\s*#'cautionary-style\s*=\s*#'parentheses", + "AccidentalCautionary #'parenthesized = ##t", str) + str = re.sub ("([A-Za-z]+)\s*#'cautionary-style\s*=\s*#'parentheses", + r"\1 #'parenthesized = ##t", str) + str = re.sub ("([A-Za-z]+)\s*#'cautionary-style\s*=\s*#'smaller", + r"\1 #'font-size = #-2", str) + + return str + +conversions.append (((2, 11, 5), conv, """deprecate cautionary-style. Use AccidentalCautionary properties""")) + + + + +def conv (str): + + def sub_acc_name (m): + idx = int (m.group (1).replace ('M','-')) + + return ["accidentals.doublesharp", + "accidentals.sharp.slashslash.stemstemstem", + "accidentals.sharp", + "accidentals.sharp.slashslash.stem", + "accidentals.natural", + "accidentals.mirroredflat", + "accidentals.flat", + "accidentals.mirroredflat.flat", + "accidentals.flatflat"][4-idx] + + str = re.sub (r"accidentals[.](M?[-0-9]+)", + sub_acc_name, str) + str = re.sub (r"(KeySignature|Accidental[A-Za-z]*)\s*#'style\s*=\s*#'([a-z]+)", + r"\1 #'glyph-name-alist = #alteration-\2-glyph-name-alist", str) + + return str + +conversions.append (((2, 11, 6), conv, """Rename accidental glyphs, use glyph-name-alist.""")) + + +def conv (str): + str = re.sub (r'(\\set\s+)?([A-Z][a-zA-Z]+\s*\.\s*)allowBeamBreak', + r"\override \2Beam #'breakable", str) + str = re.sub (r'(\\set\s+)?allowBeamBreak', + r"\override Beam #'breakable", str) + str = re.sub (r'addquote' , 'addQuote', str) + if re.search ("Span_dynamic_performer", str): + error_file.write ("Span_dynamic_performer has been merged into Dynamic_performer") + + return str + +conversions.append (((2, 11, 10), conv, """allowBeamBreak -> Beam #'breakable = ##t +addquote -> addQuote + +""")) + +def conv (str): + str = re.sub (r'\(layout-set-staff-size \(\*\s*([0-9.]+)\s*(pt|mm|cm)\)\)', + r'(layout-set-absolute-staff-size (* \1 \2))', str) + return str + +conversions.append (((2, 11, 11), conv, """layout-set-staff-size -> layout-set-absolute-staff-size""")) diff --git a/python/midi.c b/python/midi.c index facf06446a..69ac12848c 100644 --- a/python/midi.c +++ b/python/midi.c @@ -304,10 +304,10 @@ midi_parse_track (unsigned char **track, unsigned char *track_end) { PyObject *pytime = PyInt_FromLong (0L); + unsigned char running_status = 0; + while (*track < track_end) { - unsigned char running_status = 0; - long dt = get_variable_length_number(track, track_end); PyObject *pyev = 0; diff --git a/scm/backend-library.scm b/scm/backend-library.scm index 42c04b6e57..eaefaf7867 100644 --- a/scm/backend-library.scm +++ b/scm/backend-library.scm @@ -120,6 +120,7 @@ (let* ((completed (completize-formats formats)) (base (string-regexp-substitute "\\.[a-z]+$" "" filename)) (intermediate (remove (lambda (x) (member x formats)) completed))) + (for-each (lambda (f) ((eval (string->symbol (format "convert-to-~a" f)) module) paper-book filename)) completed) diff --git a/scm/chord-name.scm b/scm/chord-name.scm index 33f82c9501..939ae7b91e 100644 --- a/scm/chord-name.scm +++ b/scm/chord-name.scm @@ -15,14 +15,14 @@ ;; TODO: make into markup. ;; (define-public (alteration->text-accidental-markup alteration) + (make-smaller-markup (make-raise-markup (if (= alteration FLAT) 0.3 0.6) (make-musicglyph-markup - (format "accidentals.~a" - (inexact->exact (* 4 alteration))))))) + (assoc-get alteration standard-alteration-glyph-name-alist ""))))) (define (accidental->markup alteration) "Return accidental markup for ALTERATION." diff --git a/scm/coverage.scm b/scm/coverage.scm new file mode 100644 index 0000000000..7b1dfc810d --- /dev/null +++ b/scm/coverage.scm @@ -0,0 +1,96 @@ +(define-module (scm coverage)) + +(use-modules (lily) + (ice-9 rdelim) + (ice-9 regex) + (ice-9 format)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define-public (coverage:show-all filter?) + (let* + ((keys + (filter filter? + (sort (map car (hash-table->alist coverage-table)) string= line (vector-length vec))) + (set! vec + (hash-set! coverage-table name + (if vec + (veccopy vec (make-vector (1+ line) #f)) + (make-vector (1+ line) #f))))) + + (vector-set! vec line #t)) + ))) + + + + + diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index 43a738d6ae..7dda76b16b 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -38,7 +38,6 @@ (alignBassFigureAccidentals ,boolean? "If true, then the accidentals are aligned in bass figure context.") - (allowBeamBreak ,boolean? "If true allow line breaks for beams over bar lines.") (associatedVoice ,string? "Name of the @code{Voice} that has the melody for this @code{Lyrics} line.") (autoBeamSettings ,list? "Specifies @@ -249,6 +248,8 @@ selector for tab notation.") (ignoreBarChecks ,boolean? "Ignore bar checks") (ignoreMelismata ,boolean? "Ignore melismata for this @internalsref{Lyrics} line.") + (implicitTimeSignatureVisibility ,vector? "break visibility for the default timesignature.") + (implicitBassFigures ,list? "List of bass figures that are not printed as numbers, but only as extender lines.") @@ -279,9 +280,10 @@ alterations should be printed. The format is (@var{step} ") (keySignature ,list? "The current key signature. This is an alist -containing (@var{name} . @var{alter}) or ((@var{octave} . @var{name}) . @var{alter}). - where @var{name} is from 0.. 6 and -@var{alter} from -4 (double flat) to 4 (double sharp). +containing (@var{step} . @var{alter}) or ((@var{octave} . @var{step}) +. @var{alter}). where @var{step} is from 0.. 6 and @var{alter} a fraction, denoting +alteration. For alterations, use symbols, eg. +@code{keySignature = #`((6 . ,FLAT))} ") (majorSevenSymbol ,markup? "How should the major 7th be formatted in a chord name?") @@ -484,7 +486,7 @@ Valid values are described in @internalsref{bar-line-interface}. ) `((slurMelismaBusy ,boolean? "Signal if a slur is present.") - (originalCentralCPosition + (originalMiddleCPosition ,integer? "Used for temporary overriding middle C in octavation brackets. ") (melismaBusy ,boolean? "Signifies @@ -506,9 +508,6 @@ measure. The format is the same as for keySignature, but can also contain ((@var{octave} . @var{name}) . (@var{alter} . @var{barnumber})) pairs. It is reset at every bar line.") - - (localKeySignatureChanges ,list? "Experimental. [DOCME]") - (finalizations ,list? "List of expressions to evaluate before proceeding to next time step. Internal variable.") (busyGrobs ,list? "a queue of (@var{end-moment} . @var{GROB}) conses. This is for internal (C++) use only. This property contains diff --git a/scm/define-grob-interfaces.scm b/scm/define-grob-interfaces.scm index fe584ad40d..e141103e05 100644 --- a/scm/define-grob-interfaces.scm +++ b/scm/define-grob-interfaces.scm @@ -135,7 +135,8 @@ (ly:add-interface 'trill-pitch-accidental-interface "An accidental for trill pitch" - '(accidentals)) + '() + ) (ly:add-interface 'rhythmic-grob-interface @@ -175,6 +176,13 @@ interesting enough to maintain a hara-kiri staff." "An interface for any notes set in a tablature staff" '()) +(ly:add-interface + 'unbreakable-spanner-interface + "A spanner that should not be broken across line breaks. Override +with @code{breakable=##t}. " + + '(breakable)) + (ly:add-interface 'vertically-spaceable-interface "Objects that should be kept at constant vertical distances. Typically: diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index b9012c52d7..79c53c0dc0 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -25,7 +25,7 @@ (X-offset ,number? "The horizontal amount that this object is moved relative to its X-parent") (Y-offset ,number? "The vertical amount that this object is moved relative to its Y-parent") - (accidentals ,list? "List of alteration numbers") + (alteration ,number? "alteration numbers for accidental") (after-line-breaking ,boolean? "Dummy property, used to trigger callback for after-line-breaking") (alteration-alist ,list? "List of @code{(@var{pitch} . @var{accidental})} pairs for key signature.") @@ -68,6 +68,7 @@ beaming patterns from stem to stem inside a beam.") (bracket-flare ,number-pair? "A pair of numbers specifying how much edges of brackets should slant outward. Value 0.0 means straight edges") + (breakable ,boolean? "Allow breaks here.") (break-align-symbol ,symbol? "This key is used for aligning and spacing breakable items.") (break-align-orders ,vector? " Defines the order in which @@ -98,10 +99,6 @@ tuplet bracket.") #t means visible, #f means killed.") (c0-position ,integer? "An integer indicating the position of middle C.") - (cautionary-style ,symbol? "How to print cautionary -accidentals. Choices are @code{smaller} or -@code{parentheses}.") - (cautionary ,boolean? "Is this a cautionary accidental?") (concaveness ,number? "A beam is concave when its inner stems are closer to the beam than the two outside stems. This number is a measure of the closeness of the inner stems. It is used for damping @@ -190,6 +187,7 @@ typeset. Valid choices depend on the function that is reading this property.") (gap ,ly:dimension? "Size of a gap in a variable symbol.") (gap-count ,integer? "Number of gapped beams for tremolo.") + (glyph-name-alist ,list? "Alist of key-string pairs.") (grow-direction ,ly:dir? "Crescendo or decrescendo?") (hair-thickness ,number? "Thickness of the thin line in a bar line.") (head-direction ,ly:dir? "Are the note heads left or right in a semitie?") @@ -201,7 +199,8 @@ of note-column for horizontal shifting. This is used by @internalsref{note-collision-interface}.") (avoid-slur ,symbol? "Method of handling slur collisions. Choices are @code{around}, @code{inside}, @code{outside}. If unset, script -and slur ignore eachother.") +and slur ignore each other. @code{around} will only move the script if +there is a collision; @code{outside} will always move the script.") (ignore-collision ,boolean? "If set, don't do note collision resolution on this NoteColumn.") (infinite-spacing-height ,boolean? "If true, then for the purposes of horizontal spacing, treat this item as though it were infinitely tall. That @@ -250,10 +249,14 @@ multimeasure rest.") note heads in collisions, even if they have different note heads. The smaller of the two heads will be rendered invisible. This used polyphonic guitar notation. The value of this setting is used by -@internalsref{note-collision-interface} .") +@internalsref{note-collision-interface} . +merge-differently-headed only applies to opposing stem dirs +(ie. Voice 1 & 2).") (merge-differently-dotted ,boolean? "Merge note heads in collisions, even if they have a different number of dots. This normal -notation for some types of polyphonic music. ") +notation for some types of polyphonic music. +merge-differently-dotted only applies to opposing stem dirs +(ie. Voice 1 & 2).") (minimum-length-fraction ,number? "Minimum length of ledger line as fraction of note head size.") (minimum-distance ,ly:dimension? "Minimum distance between rest and notes or beam.") @@ -262,7 +265,8 @@ dimension, measured in staff space.") (minimum-Y-extent ,number-pair? "See @code{minimum-X-extent}.") (minimum-length ,ly:dimension? "Try to make a spanner at least this long. This requires an appropriate callback for the -@code{springs-and-rods} property.") +@code{springs-and-rods} property. If added to a Tie, this sets the +minimum distance between noteheads.") (minimum-space ,ly:dimension? "Minimum distance that the victim should move (after padding).") (neutral-direction ,ly:dir? "Which direction to take in the @@ -304,6 +308,7 @@ with a negative penalty.") This affects the choices of the page breaker; it will avoid a page turn at a column with a positive penalty and prefer a page turn at a column with a negative penalty.") + (parenthesized ,boolean? "Parenthesize this grob.") (line-break-penalty ,number? "Penalty for a line break at this column. This affects the choices of the line breaker; it will avoid a line break at a column with a positive penalty and prefer a line break at a column @@ -317,6 +322,7 @@ quicker the slur attains it @code{height-limit}.") (remove-empty ,boolean? "If set, remove group if it contains no @code{interesting-items}") (remove-first ,boolean? "Remove the first staff of a orchestral score?") + (restore-first ,boolean? "Print a natural before the accidental.") (rhythmic-location ,rhythmic-location? "Where (bar number, measure position) in the score.") (right-padding ,ly:dimension? "Space to insert on the right side of an object (eg. between note and its accidentals.)") (rotation ,list? "Number of degrees to rotate this object, and what point @@ -406,8 +412,11 @@ use LEFT.") (threshold ,number-pair? "(@var{min} . @var{max}), where @var{min} and @var{max} are dimensions in staff space.") (tie-configuration ,list? "List of (@var{position} . @var{dir}) -pairs, indicating the desired tie configuration. A non-pair entry in -the list will cause said tie to be formatted automatically. ") +pairs, indicating the desired tie configuration where @var{position} is +the offset from the center of the +staff in staff space and @var{dir} indicates the direction of the tie +(1=>up, -1=>down, 0=>center). A non-pair entry in the list will cause +the corresponding tie to be formatted automatically.") (transparent ,boolean? "This makes the grob invisible.") (uniform-stretching ,boolean? "If set, items stretch proportional to their durations. This looks better in complex polyphonic patterns") @@ -442,9 +451,12 @@ glissando line can be constructed from a whole number of squiggles.") (apply define-internal-grob-property x)) `( - (pure-relevant-elements ,ly:grob-array? "The subset of elements that are relevant for finding the pure-Y-extent.") + + ;;;;;;;;;;;;;;;; + ;; grobs & grob arrays. (alphabetical) + (Y-common ,ly:grob? "See X-common") + (X-common ,ly:grob? "Common refpoint for axis group.") (cached-pure-extents ,vector? "Used by a VerticalAxisGroup to cache the Y-extents of different column ranges.") - (common-refpoint-of-elements ,ly:grob? "Caches the common_refpoint_of_array of the elements grob-set") (axis-group-parent-X ,ly:grob? "Containing X axis group") (axis-group-parent-Y ,ly:grob? "Containing Y axis group") (accidental-grobs ,list? "Alist with (NOTENAME . GROBLIST) entries") @@ -460,8 +472,21 @@ set, which grob to get the direction from .") (dots ,ly:grob-array? "multiple Dots objects.") (figures ,ly:grob-array? "Figured bass objects for continuation line.") (important-column-ranks ,vector? "Cache of columns that contain items-worth-living.") + (items-worth-living ,ly:grob-array? "A list of interesting items. If +empty in a particular staff, then that staff is erased.") + (glyph-name ,string? "a name of character within font.") + (left-neighbors ,ly:grob-array? " List of +spacing-wish grobs that are close to the current column. + +The closest spacing-wishes determine the actual distances between the +columns. +") + (left-items ,ly:grob-array? "") (pedal-text ,ly:grob? "Pointer to the text of a mixed-style piano pedal.") + + (pure-Y-common ,ly:grob? "Caches the common_refpoint_of_array of the elements grob-set") + (pure-relevant-elements ,ly:grob-array? "The subset of elements that are relevant for finding the pure-Y-extent.") (stem ,ly:grob? "pointer to Stem object.") (tremolo-flag ,ly:grob? "The tremolo object on a stem.") (tie ,ly:grob? "") @@ -474,7 +499,7 @@ set, which grob to get the direction from .") (bounded-by-me ,ly:grob-array? "list of spanners that have this column as start/begin point. Only columns that have grobs or act as bounds are spaced.") - (circled-tip ,boolean? "Put a circle at start/end of hairpins (al/del niente)") + (columns ,ly:grob-array? "list of grobs, typically containing paper-columns or note-column objects.") (conditional-elements ,ly:grob-array? "Internal use only") @@ -483,93 +508,84 @@ in addition to notes and stems.") (elements ,ly:grob-array? "list of grobs, type depending on the Grob where this is set in.") (grace-spacing ,ly:grob? "a run of grace notes.") - (spacing ,ly:grob? "the spacing spanner governing this section.") (heads ,ly:grob-array? "List of note heads.") - (items-worth-living ,ly:grob-array? "A list of interesting items. If -empty in a particular staff, then that staff is erased.") - (details ,list? "alist of parameters for detailed grob behavior. -more information on the allowed parameters can be found by inspecting -lily/slur-scoring.cc, lily/beam-quanting.cc, and -lily/tie-formatting-problem.cc. Setting @code{debug-tie-scoring}, -@code{debug-beam-scoring} or @code{debug-slur-scoring} also provides -useful clues. + (note-columns ,pair? "list of NoteColumn grobs.") -") + (normal-stems ,ly:grob-array? "Array of visible stems.") (note-heads ,ly:grob-array? "List of note head grobs") (note-head ,ly:grob? "A single note head") + (right-items ,ly:grob-array? "") + (right-neighbors ,ly:grob-array? "see left-neighbors") + (separation-item ,ly:grob? "A separation item.") + (slur ,ly:grob? "A pointer to a slur object") + (spacing ,ly:grob? "the spacing spanner governing this section.") + (spaceable-staves ,ly:grob-array? "Objects to be spaced during page layout.") (side-support-elements ,ly:grob-array? "the support, a list of grobs.") (spacing-wishes ,ly:grob-array? "List of note spacing or staff spacing objects.") (stems ,ly:grob-array? "list of stem objects, corresponding to the notes that the arpeggio has to be before.") (tuplets ,ly:grob-array? "list of smaller tuplet brackets") (tuplet-number ,ly:grob? "the number for a bracket.") - (left-neighbors ,ly:grob-array? " List of -spacing-wish grobs that are close to the current column. + + + ;;;;;;;;;;;;;;;; + ;; other + (begin-of-line-visible ,boolean? "Used for marking ChordNames that should only show changes.") + (cause ,scheme? "Any kind of causation objects (i.e. music, or perhaps translator) that was the cause for this grob. ") + (circled-tip ,boolean? "Put a circle at start/end of hairpins (al/del niente)") + (delta-position ,number? "vertical position difference") + (details ,list? "alist of parameters for detailed grob behavior. + +more information on the allowed parameters can be found by inspecting +lily/slur-scoring.cc, lily/beam-quanting.cc, and +lily/tie-formatting-problem.cc. Setting @code{debug-tie-scoring}, +@code{debug-beam-scoring} or @code{debug-slur-scoring} also provides +useful clues. -The closest spacing-wishes determine the actual distances between the -columns. ") - (right-neighbors ,ly:grob-array? "see left-neighbors") - (left-items ,ly:grob-array? "") - (right-items ,ly:grob-array? "") - (cause ,scheme? "Any kind of causation objects (i.e. music, or perhaps translator) that was the cause for this grob. ") + (font ,ly:font-metric? "Cached font metric object") + (head-width ,ly:dimension? "width of this ligature head") + + (ideal-distances ,list? "(@var{obj} . (@var{dist} . @var{strength})) pairs.") + (interfaces ,list? "list of symbols indicating the interfaces supported by this object. Is initialized from the @code{meta} field.") + (least-squares-dy ,number? + "ideal beam slope, without damping.") + (meta ,list? "Contains meta information. It is an alist with the +entries @code{name} and @code{interfaces}.") + (minimum-distances ,list? "list of rods, that have the format (@var{obj} . @var{dist}).") + (positioning-done ,boolean? "Used to signal that a positioning element did its job. This ensures that a positioning is only done once.") (pure-Y-extent ,number-pair? "The estimated height of a system") - - (script-stencil ,pair? "Pair (@code{type} . @code{arg}), which -acts as an index for looking up a Stencil object.") - - (meta ,list? "Contains meta information. It is an alist with the -entries @code{name} and @code{interfaces}.") - - - ;; TODO: use interface for this! (quantized-positions ,number-pair? "Beam positions after quanting.") - (begin-of-line-visible ,boolean? "Used for marking ChordNames that should only show changes.") - (quantize-position ,boolean? "If set, a vertical alignment is aligned to be within staff spaces.") (quant-score ,string? "Beam quanting score -- can be stored for debugging") - (least-squares-dy ,number? - "ideal beam slope, without damping.") - (stem-info ,pair? "caching of stem parameters") - (note-columns ,pair? "list of NoteColumn grobs.") - -;;; add-join would be enough if in ly:mensural-ligature::brew-ligature-primitive -;;; the next note could be seen - (join-right-amount ,number? "") - - (delta-position ,number? "vertical position difference") - (head-width ,ly:dimension? "width of this ligature head") - - ;; [TODO: change this] - (primitive ,integer? "Pointer to a ligature primitive, i.e. an item similar to a note head that is part of a ligature. ") - (ideal-distances ,list? "(@var{obj} . (@var{dist} . @var{strength})) pairs.") - (minimum-distances ,list? "list of rods, that have the format (@var{obj} . @var{dist}).") + (script-stencil ,pair? "Pair (@code{type} . @code{arg}), which +acts as an index for looking up a Stencil object.") - (interfaces ,list? "list of symbols indicating the interfaces supported by this object. Is initialized from the @code{meta} field.") + (stem-info ,pair? "caching of stem parameters") (shorten ,ly:dimension? "The amount of space that a stem. Internally used to distribute beam shortening over stems. ") - (slur ,ly:grob? "A pointer to a slur object") + (skyline-distance ,number? "The distance between this staff and the next one, as determined by a skyline algorithm.") + (skyline-horizontal-padding ,number? "For determining the vertical distance between 2 staves, it is possible to have a configuration which would result in a tight interleaving of grobs from the top staff and the bottom staff. The larger this parameter is, the farther apart the staves will be placed in such a configuration.") + (use-breve-rest ,boolean? "Use breve rests for measures longer than a whole rest.") - (spaceable-staves ,ly:grob-array? "Objects to be spaced during page layout.") - (skyline-distance ,number? "The distance between this staff and the next one, as determined by a skyline algorithm.") - (skyline-horizontal-padding ,number? "For determining the vertical distance between 2 staves, it is possible to have a configuration which would result in a tight interleaving of grobs from the top staff and the bottom staff. The larger this parameter is, the farther apart the staves will be placed in such a configuration.") - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ancient notation -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (join-right-amount ,number? "") + (primitive ,integer? "Pointer to a ligature primitive, i.e. an item similar to a note head that is part of a ligature. ") + + ;;;;;;; TODO: ;; there are too many properties for ancient notation ;; probably neume-types (a list of symbols) would also work. diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index af306ed01d..0dc2235031 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -20,28 +20,42 @@ (Accidental . ( (avoid-slur . inside) - (cautionary-style . parentheses) + (glyph-name-alist . ,standard-alteration-glyph-name-alist) + (alteration . ,accidental-interface::calc-alteration) (stencil . ,ly:accidental-interface::print) - (after-line-breaking - . ,ly:accidental-interface::after-line-breaking) + (Y-extent . ,ly:accidental-interface::height) (meta . ((class . Item) (interfaces . (accidental-interface font-interface)))))) + (AccidentalCautionary + . ( + (avoid-slur . inside) + (parenthesized . #t) + (glyph-name-alist . ,standard-alteration-glyph-name-alist) + (alteration . ,accidental-interface::calc-alteration) + (stencil . ,ly:accidental-interface::print) + (Y-extent . ,ly:accidental-interface::height) + (meta . ((class . Item) + (interfaces . (accidental-interface + font-interface)))))) + (AccidentalSuggestion . ( (stencil . ,ly:accidental-interface::print) + (Y-extent . ,ly:accidental-interface::height) (X-offset . ,(ly:make-simple-closure `(,+ ,(ly:make-simple-closure (list ly:self-alignment-interface::centered-on-x-parent)) ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self))))) (self-alignment-X . ,CENTER) - (cautionary . #t) - (cautionary-style . smaller) + (font-size . -2) + (glyph-name-alist . ,standard-alteration-glyph-name-alist) + (alteration . ,accidental-interface::calc-alteration) (Y-offset . ,ly:side-position-interface::y-aligned-side) - (cautionary-style . parentheses) (direction . ,UP) (staff-padding . 0.25) + (outside-staff-priority . 0) (script-priority . 0) (side-axis . ,X) (meta . ((class . Item) @@ -104,12 +118,12 @@ (padding . 0.5) (X-offset . ,ly:side-position-interface::x-aligned-side) (direction . ,LEFT) - (cautionary-style . parentheses) (stencil . ,ly:accidental-interface::print) - (after-line-breaking . ,ly:accidental-interface::after-line-breaking) + (Y-extent . ,ly:accidental-interface::height) + (glyph-name-alist . ,standard-alteration-glyph-name-alist) (side-axis . ,X) (meta . ((class . Item) - (interfaces . (item-interface + (interfaces . ( accidental-interface break-aligned-interface side-position-interface @@ -161,8 +175,6 @@ (layer . 0) (break-visibility . ,all-visible) (non-musical . #t) - (extra-spacing-width . (-0.3 . 0.3)) - (stencil . ,ly:bar-line::print) (glyph-name . ,bar-line::calc-glyph-name) (bar-size . ,ly:bar-line::calc-bar-size) @@ -174,7 +186,7 @@ (key-signature . (extra-space . 1.0)) (key-cancellation . (extra-space . 1.0)) (first-note . (fixed-space . 1.3)) - (next-note . (semi-fixed-space . 1.3)) + (next-note . (semi-fixed-space . 0.9)) (right-edge . (extra-space . 0.0)))) ;; @@ -307,7 +319,8 @@ (beaming . ,ly:beam::calc-beaming) (stencil . ,ly:beam::print) (clip-edges . #t) - + + (details . ((hint-direction-penalty . 20))) ;; TODO: should be in SLT. (thickness . 0.48) ; in staff-space (neutral-direction . ,DOWN) @@ -333,7 +346,9 @@ ;; only for debugging. (font-family . roman) (meta . ((class . Spanner) + (object-callbacks . ((normal-stems . ,ly:beam::calc-normal-stems))) (interfaces . (staff-symbol-referencer-interface + unbreakable-spanner-interface beam-interface)))))) (BendAfter @@ -474,7 +489,7 @@ rhythmic-grob-interface text-interface chord-name-interface - item-interface)))))) + )))))) (CombineTextScript . ( @@ -530,6 +545,7 @@ . ( (stencil . ,ly:dots::print) (dot-count . ,dots::calc-dot-count) + (staff-position . ,dots::calc-staff-position) (meta . ((class . Item) (interfaces . (font-interface staff-symbol-referencer-interface @@ -649,7 +665,6 @@ (self-alignment-X . 0) (self-alignment-Y . 0) (script-priority . 100) - (stencil . ,ly:text-interface::print) (direction . ,ly:script-interface::calc-direction) (text . ,fingering::calc-text) @@ -662,7 +677,7 @@ text-interface side-position-interface self-alignment-interface - item-interface)))))) + )))))) (FretBoard . ((stencil . ,fret-board::calc-stencil) (finger-code . below-string) @@ -682,6 +697,7 @@ (after-line-breaking . ,ly:line-spanner::after-line-breaking) (meta . ((class . Spanner) (interfaces . (line-interface + unbreakable-spanner-interface line-spanner-interface)))))) (GraceSpacing @@ -691,7 +707,7 @@ (shortest-duration-space . 1.6) (meta . ((class . Spanner) (interfaces . (grace-spacing-interface - spacing-interface + spacing-options-interface spanner-interface)))))) (GridPoint @@ -782,6 +798,7 @@ (KeyCancellation . ( (stencil . ,ly:key-signature-interface::print) + (glyph-name-alist . ,cancellation-glyph-name-alist) (space-alist . ( (time-signature . (extra-space . 1.25)) (staff-bar . (extra-space . 0.6)) @@ -801,6 +818,7 @@ . ( (stencil . ,ly:key-signature-interface::print) (avoid-slur . inside) + (glyph-name-alist . ,standard-alteration-glyph-name-alist) (space-alist . ( (time-signature . (extra-space . 1.15)) (staff-bar . (extra-space . 1.1)) @@ -930,7 +948,7 @@ (X-extent . #f) (meta . ((class . Spanner) (interfaces . (spanner-interface - lyric-hyphen-interface spacing-interface)) + lyric-hyphen-interface )) )) )) @@ -969,7 +987,7 @@ . ( (neutral-direction . ,DOWN) (meta . ((class . Item) - (interfaces . (melody-spanner-interface spacing-interface)))))) + (interfaces . (melody-spanner-interface )))))) (MensuralLigature . ( (thickness . 1.4) @@ -1117,7 +1135,7 @@ ;; If you ever change this back, please document! --hwn (knee-spacing-correction . 1.0) (meta . ((class . Item) - (interfaces . (spacing-interface + (interfaces . ( note-spacing-interface)))))) (NoteName @@ -1139,7 +1157,6 @@ (Y-offset . ,ly:side-position-interface::y-aligned-side) (stencil . ,ly:text-interface::print) (font-shape . italic) - (padding . 0.6) (staff-padding . 0.2) (font-size . -4) (meta . ((class . Item) @@ -1281,7 +1298,7 @@ (font-size . 2) (baseline-skip . 2) (break-visibility . ,end-of-line-invisible) - (break-align-symbol . staff-bar) + (break-align-symbol . clef) (padding . 0.8) (outside-staff-priority . 1500) (meta . ((class . Item) @@ -1356,7 +1373,6 @@ ;; padding set in script definitions. (staff-padding . 0.25) - ;; (script-priority . 0) priorities for scripts, see script.scm (X-offset . ,ly:self-alignment-interface::centered-on-x-parent) (Y-offset . ,ly:side-position-interface::y-aligned-side) (side-axis . ,Y) @@ -1387,7 +1403,7 @@ (Y-extent . ,ly:axis-group-interface::height) (skylines . ,ly:separation-item::calc-skylines) (meta . ((class . Item) - (interfaces . (spacing-interface + (interfaces . ( separation-item-interface)))))) (SeparatingGroupSpanner @@ -1395,7 +1411,7 @@ (springs-and-rods . ,ly:separating-group-spanner::set-spacing-rods) (meta . ((class . Spanner) (interfaces . (only-prebreak-interface - spacing-interface + separating-group-spanner-interface)))))) (Slur @@ -1453,7 +1469,7 @@ (base-shortest-duration . ,(ly:make-moment 3 16)) (meta . ((class . Spanner) - (interfaces . (spacing-interface + (interfaces . ( spacing-options-interface spacing-spanner-interface)))))) @@ -1503,8 +1519,7 @@ (non-musical . #t) (stem-spacing-correction . 0.4) (meta . ((class . Item) - (interfaces . (spacing-interface - staff-spacing-interface)))))) + (interfaces . (staff-spacing-interface)))))) (StaffSymbol @@ -1599,7 +1614,7 @@ text-interface side-position-interface self-alignment-interface - item-interface)))))) + )))))) (StrokeFinger . ( @@ -1620,7 +1635,7 @@ text-interface side-position-interface self-alignment-interface - item-interface)))))) + )))))) (SustainPedal @@ -1802,14 +1817,17 @@ (stem-gap . 0.35) (height-limit . 1.0) (horizontal-distance-penalty-factor . 10) - (min-length-penalty-factor . 20) + (same-dir-as-stem-penalty . 8) + (min-length-penalty-factor . 26) (tie-tie-collision-distance . 0.45) (tie-tie-collision-penalty . 25.0) (intra-space-threshold . 1.25) (outer-tie-vertical-distance-symmetry-penalty-factor . 10) (outer-tie-length-symmetry-penalty-factor . 10) + (vertical-distance-penalty-factor . 7) (outer-tie-vertical-gap . 0.25) (multi-tie-region-size . 1) + (single-tie-region-size . 4) (between-length-limit . 1.0))) (thickness . 1.2) @@ -1869,9 +1887,11 @@ (font-size . -4) (side-axis . ,X) (stencil . ,ly:accidental-interface::print) + (Y-extent . ,ly:accidental-interface::height) + (glyph-name-alist . ,standard-alteration-glyph-name-alist) (meta . ((class . Item) - (interfaces . (item-interface - trill-pitch-accidental-interface + (interfaces . (trill-pitch-accidental-interface + accidental-interface side-position-interface font-interface)))))) @@ -1886,10 +1906,10 @@ (padding . 0.3) (meta . ((class . Item) (interfaces . (side-position-interface + parentheses-interface note-head-interface rhythmic-head-interface font-interface - accidental-interface axis-group-interface)))))) (TrillPitchHead @@ -1899,8 +1919,7 @@ (Y-offset . ,ly:staff-symbol-referencer::callback) (font-size . -4) (meta . ((class . Item) - (interfaces . (item-interface - rhythmic-head-interface + (interfaces . (rhythmic-head-interface font-interface pitched-trill-interface ledgered-interface @@ -1984,6 +2003,7 @@ (padding . 0.5) (skylines . ,ly:axis-group-interface::combine-skylines) (meta . ((class . Spanner) + (object-callbacks . ((Y-common . ,ly:axis-group-interface::calc-y-common))) (interfaces . (align-interface axis-group-interface)))))) (VerticalAxisGroup @@ -1994,6 +2014,7 @@ (X-extent . ,ly:axis-group-interface::width) (skylines . ,ly:axis-group-interface::calc-skylines); (meta . ((class . Spanner) + (object-callbacks . ((X-common . ,ly:axis-group-interface::calc-x-common))) (interfaces . (axis-group-interface hara-kiri-group-spanner-interface vertically-spaceable-interface)))))) @@ -2063,6 +2084,8 @@ (cons 'spanner-interface ifaces-entry)))) (else (ly:warning "Unknown class ~a" class))) + + (set! ifaces-entry (uniq-list (sort ifaces-entry symbolstencil axis size file-name) )) -(define-markup-command (postscript layout props str) (string?) +(define-builtin-markup-command (postscript layout props str) (string?) "This inserts @var{str} directly into the output as a PostScript command string. Due to technicalities of the output backends, different scales should be used for the @TeX{} and PostScript backend, @@ -244,7 +244,7 @@ grestore '(0 . 0) '(0 . 0))) -(define-markup-command (score layout props score) (ly:score?) +(define-builtin-markup-command (score layout props score) (ly:score?) "Inline an image of music." (let* ((output (ly:score-embedded-format score layout))) @@ -255,7 +255,7 @@ grestore (ly:warning (_"no systems found in \\score markup, does it have a \\layout block?")) empty-stencil)))) -(define-markup-command (null layout props) () +(define-builtin-markup-command (null layout props) () "An empty markup with extents of a single point" point-stencil) @@ -266,12 +266,12 @@ grestore -(define-markup-command (simple layout props str) (string?) +(define-builtin-markup-command (simple layout props str) (string?) "A simple text string; @code{\\markup @{ foo @}} is equivalent with @code{\\markup @{ \\simple #\"foo\" @}}." (interpret-markup layout props str)) -(define-markup-command (tied-lyric layout props str) (string?) +(define-builtin-markup-command (tied-lyric layout props str) (string?) "Like simple-markup, but use tie characters for ~ tilde symbols." @@ -329,7 +329,7 @@ grestore (/ (+ (car text-widths) (car (cdr text-widths))) 2)) (get-fill-space word-count line-width (cdr text-widths)))))) -(define-markup-command (fill-line layout props markups) +(define-builtin-markup-command (fill-line layout props markups) (markup-list?) "Put @var{markups} in a horizontal line of width @var{line-width}. The markups are spaced/flushed to fill the entire line. @@ -389,7 +389,7 @@ grestore (stack-stencils-padding-list X RIGHT fill-space-normal line-stencils)))) -(define-markup-command (line layout props args) (markup-list?) +(define-builtin-markup-command (line layout props args) (markup-list?) "Put @var{args} in a horizontal line. The property @code{word-space} determines the space between each markup in @var{args}." (let* @@ -406,7 +406,7 @@ determines the space between each markup in @var{args}." space (remove ly:stencil-empty? stencils)))) -(define-markup-command (concat layout props args) (markup-list?) +(define-builtin-markup-command (concat layout props args) (markup-list?) "Concatenate @var{args} in a horizontal line, without spaces inbetween. Strings and simple markups are concatenated on the input level, allowing ligatures. For example, @code{\\concat @{ \"f\" \\simple #\"i\" @}} is @@ -524,14 +524,14 @@ equivalent to @code{\"fi\"}." (stack-lines DOWN 0.0 baseline-skip lines))) -(define-markup-command (justify layout props args) (markup-list?) +(define-builtin-markup-command (justify layout props args) (markup-list?) "Like wordwrap, but with lines stretched to justify the margins. Use @code{\\override #'(line-width . X)} to set line-width, where X is the number of staff spaces." (wordwrap-markups layout props args #t)) -(define-markup-command (wordwrap layout props args) (markup-list?) +(define-builtin-markup-command (wordwrap layout props args) (markup-list?) "Simple wordwrap. Use @code{\\override #'(line-width . X)} to set line-width, where X is the number of staff spaces." @@ -572,23 +572,23 @@ line-width, where X is the number of staff spaces." (stack-lines DOWN 0.0 baseline-skip (apply append para-lines)))) -(define-markup-command (wordwrap-string layout props arg) (string?) +(define-builtin-markup-command (wordwrap-string layout props arg) (string?) "Wordwrap a string. Paragraphs may be separated with double newlines" (wordwrap-string layout props #f arg)) -(define-markup-command (justify-string layout props arg) (string?) +(define-builtin-markup-command (justify-string layout props arg) (string?) "Justify a string. Paragraphs may be separated with double newlines" (wordwrap-string layout props #t arg)) -(define-markup-command (wordwrap-field layout props symbol) (symbol?) +(define-builtin-markup-command (wordwrap-field layout props symbol) (symbol?) (let* ((m (chain-assoc-get symbol props))) (if (string? m) (interpret-markup layout props (list wordwrap-string-markup m)) (ly:make-stencil '() '(1 . -1) '(1 . -1))))) -(define-markup-command (justify-field layout props symbol) (symbol?) +(define-builtin-markup-command (justify-field layout props symbol) (symbol?) (let* ((m (chain-assoc-get symbol props))) (if (string? m) (interpret-markup layout props @@ -597,7 +597,7 @@ line-width, where X is the number of staff spaces." -(define-markup-command (combine layout props m1 m2) (markup? markup?) +(define-builtin-markup-command (combine layout props m1 m2) (markup? markup?) "Print two markups on top of each other." (let* ((s1 (interpret-markup layout props m1)) (s2 (interpret-markup layout props m2))) @@ -606,7 +606,7 @@ line-width, where X is the number of staff spaces." ;; ;; TODO: should extract baseline-skip from each argument somehow.. ;; -(define-markup-command (column layout props args) (markup-list?) +(define-builtin-markup-command (column layout props args) (markup-list?) "Stack the markups in @var{args} vertically. The property @code{baseline-skip} determines the space between each markup in @var{args}." @@ -620,7 +620,7 @@ line-width, where X is the number of staff spaces." (remove ly:stencil-empty? arg-stencils)))) -(define-markup-command (dir-column layout props args) (markup-list?) +(define-builtin-markup-command (dir-column layout props args) (markup-list?) "Make a column of args, going up or down, depending on the setting of the @code{#'direction} layout property." (let* ((dir (chain-assoc-get 'direction props))) @@ -630,39 +630,39 @@ of the @code{#'direction} layout property." (chain-assoc-get 'baseline-skip props) (map (lambda (x) (interpret-markup layout props x)) args)))) -(define-markup-command (center-align layout props args) (markup-list?) +(define-builtin-markup-command (center-align layout props args) (markup-list?) "Put @code{args} in a centered column. " (let* ((mols (map (lambda (x) (interpret-markup layout props x)) args)) (cmols (map (lambda (x) (ly:stencil-aligned-to x X CENTER)) mols))) (stack-lines -1 0.0 (chain-assoc-get 'baseline-skip props) cmols))) -(define-markup-command (vcenter layout props arg) (markup?) +(define-builtin-markup-command (vcenter layout props arg) (markup?) "Align @code{arg} to its Y center. " (let* ((mol (interpret-markup layout props arg))) (ly:stencil-aligned-to mol Y CENTER))) -(define-markup-command (hcenter layout props arg) (markup?) +(define-builtin-markup-command (hcenter layout props arg) (markup?) "Align @code{arg} to its X center. " (let* ((mol (interpret-markup layout props arg))) (ly:stencil-aligned-to mol X CENTER))) -(define-markup-command (right-align layout props arg) (markup?) +(define-builtin-markup-command (right-align layout props arg) (markup?) "Align @var{arg} on its right edge. " (let* ((m (interpret-markup layout props arg))) (ly:stencil-aligned-to m X RIGHT))) -(define-markup-command (left-align layout props arg) (markup?) +(define-builtin-markup-command (left-align layout props arg) (markup?) "Align @var{arg} on its left edge. " (let* ((m (interpret-markup layout props arg))) (ly:stencil-aligned-to m X LEFT))) -(define-markup-command (general-align layout props axis dir arg) (integer? number? markup?) +(define-builtin-markup-command (general-align layout props axis dir arg) (integer? number? markup?) "Align @var{arg} in @var{axis} direction to the @var{dir} side." (let* ((m (interpret-markup layout props arg))) (ly:stencil-aligned-to m axis dir))) -(define-markup-command (halign layout props dir arg) (number? markup?) +(define-builtin-markup-command (halign layout props dir arg) (number? markup?) "Set horizontal alignment. If @var{dir} is @code{-1}, then it is left-aligned, while @code{+1} is right. Values in between interpolate alignment accordingly." @@ -671,14 +671,14 @@ alignment accordingly." -(define-markup-command (with-dimensions layout props x y arg) (number-pair? number-pair? markup?) +(define-builtin-markup-command (with-dimensions layout props x y arg) (number-pair? number-pair? markup?) "Set the dimensions of @var{arg} to @var{x} and @var{y}." (let* ((m (interpret-markup layout props arg))) (ly:make-stencil (ly:stencil-expr m) x y))) -(define-markup-command (pad-around layout props amount arg) (number? markup?) +(define-builtin-markup-command (pad-around layout props amount arg) (number? markup?) "Add padding @var{amount} all around @var{arg}. " @@ -694,7 +694,7 @@ alignment accordingly." )) -(define-markup-command (pad-x layout props amount arg) (number? markup?) +(define-builtin-markup-command (pad-x layout props amount arg) (number? markup?) "Add padding @var{amount} around @var{arg} in the X-direction. " (let* @@ -709,17 +709,17 @@ alignment accordingly." )) -(define-markup-command (put-adjacent layout props arg1 axis dir arg2) (markup? integer? ly:dir? markup?) +(define-builtin-markup-command (put-adjacent layout props arg1 axis dir arg2) (markup? integer? ly:dir? markup?) "Put @var{arg2} next to @var{arg1}, without moving @var{arg1}. " (let* ((m1 (interpret-markup layout props arg1)) (m2 (interpret-markup layout props arg2))) - (ly:stencil-combine-at-edge m1 axis dir m2 0.0 0.0) + (ly:stencil-combine-at-edge m1 axis dir m2 0.0) )) -(define-markup-command (transparent layout props arg) (markup?) +(define-builtin-markup-command (transparent layout props arg) (markup?) "Make the argument transparent" (let* ((m (interpret-markup layout props arg)) @@ -732,7 +732,7 @@ alignment accordingly." x y))) -(define-markup-command (pad-to-box layout props x-ext y-ext arg) +(define-builtin-markup-command (pad-to-box layout props x-ext y-ext arg) (number-pair? number-pair? markup?) "Make @var{arg} take at least @var{x-ext}, @var{y-ext} space" @@ -746,7 +746,7 @@ alignment accordingly." (interval-union y-ext y)))) -(define-markup-command (hcenter-in layout props length arg) +(define-builtin-markup-command (hcenter-in layout props length arg) (number? markup?) "Center @var{arg} horizontally within a box of extending @var{length}/2 to the left and right." @@ -762,7 +762,7 @@ alignment accordingly." ;; property ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define-markup-command (fromproperty layout props symbol) (symbol?) +(define-builtin-markup-command (fromproperty layout props symbol) (symbol?) "Read the @var{symbol} from property settings, and produce a stencil from the markup contained within. If @var{symbol} is not defined, it returns an empty markup" @@ -772,7 +772,7 @@ alignment accordingly." (ly:make-stencil '() '(1 . -1) '(1 . -1))))) -(define-markup-command (on-the-fly layout props procedure arg) (symbol? markup?) +(define-builtin-markup-command (on-the-fly layout props procedure arg) (symbol? markup?) "Apply the @var{procedure} markup command to @var{arg}. @var{procedure} should take a single argument." (let* ((anonymous-with-signature (lambda (layout props arg) (procedure layout props arg)))) @@ -783,7 +783,7 @@ alignment accordingly." -(define-markup-command (override layout props new-prop arg) (pair? markup?) +(define-builtin-markup-command (override layout props new-prop arg) (pair? markup?) "Add the first argument in to the property list. Properties may be any sort of property supported by @internalsref{font-interface} and @internalsref{text-interface}, for example @@ -799,7 +799,7 @@ any sort of property supported by @internalsref{font-interface} and ;; files ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define-markup-command (verbatim-file layout props name) (string?) +(define-builtin-markup-command (verbatim-file layout props name) (string?) "Read the contents of a file, and include verbatimly" (interpret-markup @@ -819,26 +819,26 @@ any sort of property supported by @internalsref{font-interface} and ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define-markup-command (bigger layout props arg) (markup?) +(define-builtin-markup-command (bigger layout props arg) (markup?) "Increase the font size relative to current setting" (interpret-markup layout props `(,fontsize-markup 1 ,arg))) -(define-markup-command (smaller layout props arg) (markup?) +(define-builtin-markup-command (smaller layout props arg) (markup?) "Decrease the font size relative to current setting" (interpret-markup layout props `(,fontsize-markup -1 ,arg))) -(define-markup-command larger (markup?) bigger-markup) +(define-builtin-markup-command larger (markup?) bigger-markup) -(define-markup-command (finger layout props arg) (markup?) +(define-builtin-markup-command (finger layout props arg) (markup?) "Set the argument as small numbers." (interpret-markup layout (cons '((font-size . -5) (font-encoding . fetaNumber)) props) arg)) -(define-markup-command (fontsize layout props increment arg) (number? markup?) +(define-builtin-markup-command (fontsize layout props increment arg) (number? markup?) "Add @var{increment} to the font-size. Adjust baseline skip accordingly." (let* ((fs (chain-assoc-get 'font-size props 0)) @@ -852,7 +852,7 @@ any sort of property supported by @internalsref{font-interface} and ;; FIXME -> should convert to font-size. -(define-markup-command (magnify layout props sz arg) (number? markup?) +(define-builtin-markup-command (magnify layout props sz arg) (number? markup?) "Set the font magnification for the its argument. In the following example, the middle A will be 10% larger: @example @@ -866,54 +866,54 @@ Use @code{\\fontsize} otherwise." (prepend-alist-chain 'font-magnification sz props) arg)) -(define-markup-command (bold layout props arg) (markup?) +(define-builtin-markup-command (bold layout props arg) (markup?) "Switch to bold font-series" (interpret-markup layout (prepend-alist-chain 'font-series 'bold props) arg)) -(define-markup-command (sans layout props arg) (markup?) +(define-builtin-markup-command (sans layout props arg) (markup?) "Switch to the sans serif family" (interpret-markup layout (prepend-alist-chain 'font-family 'sans props) arg)) -(define-markup-command (number layout props arg) (markup?) +(define-builtin-markup-command (number layout props arg) (markup?) "Set font family to @code{number}, which yields the font used for time signatures and fingerings. This font only contains numbers and some punctuation. It doesn't have any letters. " (interpret-markup layout (prepend-alist-chain 'font-encoding 'fetaNumber props) arg)) -(define-markup-command (roman layout props arg) (markup?) +(define-builtin-markup-command (roman layout props arg) (markup?) "Set font family to @code{roman}." (interpret-markup layout (prepend-alist-chain 'font-family 'roman props) arg)) -(define-markup-command (huge layout props arg) (markup?) +(define-builtin-markup-command (huge layout props arg) (markup?) "Set font size to +2." (interpret-markup layout (prepend-alist-chain 'font-size 2 props) arg)) -(define-markup-command (large layout props arg) (markup?) +(define-builtin-markup-command (large layout props arg) (markup?) "Set font size to +1." (interpret-markup layout (prepend-alist-chain 'font-size 1 props) arg)) -(define-markup-command (normalsize layout props arg) (markup?) +(define-builtin-markup-command (normalsize layout props arg) (markup?) "Set font size to default." (interpret-markup layout (prepend-alist-chain 'font-size 0 props) arg)) -(define-markup-command (small layout props arg) (markup?) +(define-builtin-markup-command (small layout props arg) (markup?) "Set font size to -1." (interpret-markup layout (prepend-alist-chain 'font-size -1 props) arg)) -(define-markup-command (tiny layout props arg) (markup?) +(define-builtin-markup-command (tiny layout props arg) (markup?) "Set font size to -2." (interpret-markup layout (prepend-alist-chain 'font-size -2 props) arg)) -(define-markup-command (teeny layout props arg) (markup?) +(define-builtin-markup-command (teeny layout props arg) (markup?) "Set font size to -3." (interpret-markup layout (prepend-alist-chain 'font-size -3 props) arg)) -(define-markup-command (fontCaps layout props arg) (markup?) +(define-builtin-markup-command (fontCaps layout props arg) (markup?) "Set @code{font-shape} to @code{caps}." (interpret-markup layout (prepend-alist-chain 'font-shape 'caps props) arg)) ;; Poor man's caps -(define-markup-command (smallCaps layout props text) (markup?) +(define-builtin-markup-command (smallCaps layout props text) (markup?) "Turn @code{text}, which should be a string, to small caps. @example \\markup \\smallCaps \"Text between double quotes\" @@ -978,10 +978,10 @@ some punctuation. It doesn't have any letters. " #f #f))) -(define-markup-command (caps layout props arg) (markup?) +(define-builtin-markup-command (caps layout props arg) (markup?) (interpret-markup layout props (make-smallCaps-markup arg))) -(define-markup-command (dynamic layout props arg) (markup?) +(define-builtin-markup-command (dynamic layout props arg) (markup?) "Use the dynamic font. This font only contains @b{s}, @b{f}, @b{m}, @b{z}, @b{p}, and @b{r}. When producing phrases, like ``pi@`{u} @b{f}'', the normal words (like ``pi@`{u}'') should be done in a different font. The @@ -989,7 +989,7 @@ recommend font for this is bold and italic" (interpret-markup layout (prepend-alist-chain 'font-encoding 'fetaDynamic props) arg)) -(define-markup-command (text layout props arg) (markup?) +(define-builtin-markup-command (text layout props arg) (markup?) "Use a text font instead of music symbol or music alphabet font." ;; ugh - latin1 @@ -997,26 +997,26 @@ recommend font for this is bold and italic" arg)) -(define-markup-command (italic layout props arg) (markup?) +(define-builtin-markup-command (italic layout props arg) (markup?) "Use italic @code{font-shape} for @var{arg}. " (interpret-markup layout (prepend-alist-chain 'font-shape 'italic props) arg)) -(define-markup-command (typewriter layout props arg) (markup?) +(define-builtin-markup-command (typewriter layout props arg) (markup?) "Use @code{font-family} typewriter for @var{arg}." (interpret-markup layout (prepend-alist-chain 'font-family 'typewriter props) arg)) -(define-markup-command (upright layout props arg) (markup?) +(define-builtin-markup-command (upright layout props arg) (markup?) "Set font shape to @code{upright}. This is the opposite of @code{italic}." (interpret-markup layout (prepend-alist-chain 'font-shape 'upright props) arg)) -(define-markup-command (medium layout props arg) (markup?) +(define-builtin-markup-command (medium layout props arg) (markup?) "Switch to medium font-series (in contrast to bold)." (interpret-markup layout (prepend-alist-chain 'font-series 'medium props) arg)) -(define-markup-command (normal-text layout props arg) (markup?) +(define-builtin-markup-command (normal-text layout props arg) (markup?) "Set all font related properties (except the size) to get the default normal text font, no matter what font was used earlier." ;; ugh - latin1 (interpret-markup layout @@ -1029,44 +1029,45 @@ recommend font for this is bold and italic" ;; symbols. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define-markup-command (doublesharp layout props) () +(define-builtin-markup-command (doublesharp layout props) () "Draw a double sharp symbol." - (interpret-markup layout props (markup #:musicglyph "accidentals.4"))) + (interpret-markup layout props (markup #:musicglyph (assoc-get 1 standard-alteration-glyph-name-alist "")))) -(define-markup-command (sesquisharp layout props) () +(define-builtin-markup-command (sesquisharp layout props) () "Draw a 3/2 sharp symbol." - (interpret-markup layout props (markup #:musicglyph "accidentals.3"))) + (interpret-markup layout props (markup #:musicglyph (assoc-get 3/4 standard-alteration-glyph-name-alist "")))) + -(define-markup-command (sharp layout props) () +(define-builtin-markup-command (sharp layout props) () "Draw a sharp symbol." - (interpret-markup layout props (markup #:musicglyph "accidentals.2"))) + (interpret-markup layout props (markup #:musicglyph (assoc-get 1/2 standard-alteration-glyph-name-alist "")))) -(define-markup-command (semisharp layout props) () +(define-builtin-markup-command (semisharp layout props) () "Draw a semi sharp symbol." - (interpret-markup layout props (markup #:musicglyph "accidentals.1"))) + (interpret-markup layout props (markup #:musicglyph (assoc-get 1/4 standard-alteration-glyph-name-alist "")))) -(define-markup-command (natural layout props) () +(define-builtin-markup-command (natural layout props) () "Draw a natural symbol." - (interpret-markup layout props (markup #:musicglyph "accidentals.0"))) + (interpret-markup layout props (markup #:musicglyph (assoc-get 0 standard-alteration-glyph-name-alist "")))) -(define-markup-command (semiflat layout props) () +(define-builtin-markup-command (semiflat layout props) () "Draw a semiflat." - (interpret-markup layout props (markup #:musicglyph "accidentals.M1"))) + (interpret-markup layout props (markup #:musicglyph (assoc-get -1/4 standard-alteration-glyph-name-alist "")))) -(define-markup-command (flat layout props) () +(define-builtin-markup-command (flat layout props) () "Draw a flat symbol." - (interpret-markup layout props (markup #:musicglyph "accidentals.M2"))) + (interpret-markup layout props (markup #:musicglyph (assoc-get -1/2 standard-alteration-glyph-name-alist "")))) -(define-markup-command (sesquiflat layout props) () +(define-builtin-markup-command (sesquiflat layout props) () "Draw a 3/2 flat symbol." - (interpret-markup layout props (markup #:musicglyph "accidentals.M3"))) + (interpret-markup layout props (markup #:musicglyph (assoc-get -3/4 standard-alteration-glyph-name-alist "")))) -(define-markup-command (doubleflat layout props) () +(define-builtin-markup-command (doubleflat layout props) () "Draw a double flat symbol." - (interpret-markup layout props (markup #:musicglyph "accidentals.M4"))) + (interpret-markup layout props (markup #:musicglyph (assoc-get -1 standard-alteration-glyph-name-alist "")))) -(define-markup-command (with-color layout props color arg) (color? markup?) +(define-builtin-markup-command (with-color layout props color arg) (color? markup?) "Draw @var{arg} in color specified by @var{color}" (let* ((stil (interpret-markup layout props arg))) @@ -1081,7 +1082,7 @@ recommend font for this is bold and italic" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define-markup-command (arrow-head layout props axis direction filled) +(define-builtin-markup-command (arrow-head layout props axis direction filled) (integer? ly:dir? boolean?) "produce an arrow head in specified direction and axis. Use the filled head if @var{filled} is specified." (let* @@ -1096,21 +1097,21 @@ recommend font for this is bold and italic" props)) name))) -(define-markup-command (musicglyph layout props glyph-name) (string?) +(define-builtin-markup-command (musicglyph layout props glyph-name) (string?) "This is converted to a musical symbol, e.g. @code{\\musicglyph -#\"accidentals.0\"} will select the natural sign from the music font. +#\"accidentals.natural\"} will select the natural sign from the music font. See @usermanref{The Feta font} for a complete listing of the possible glyphs." (ly:font-get-glyph (ly:paper-get-font layout (cons '((font-encoding . fetaMusic)) props)) glyph-name)) -(define-markup-command (lookup layout props glyph-name) (string?) +(define-builtin-markup-command (lookup layout props glyph-name) (string?) "Lookup a glyph by name." (ly:font-get-glyph (ly:paper-get-font layout props) glyph-name)) -(define-markup-command (char layout props num) (integer?) +(define-builtin-markup-command (char layout props num) (integer?) "Produce a single character, e.g. @code{\\char #65} produces the letter 'A'." @@ -1138,13 +1139,13 @@ letter 'A'." (number->markletter-string vec (remainder n lst))) (make-string 1 (vector-ref vec n))))) -(define-markup-command (markletter layout props num) (integer?) +(define-builtin-markup-command (markletter layout props num) (integer?) "Make a markup letter for @var{num}. The letters start with A to Z (skipping I), and continues with double letters." (ly:text-interface::interpret-markup layout props (number->markletter-string number->mark-letter-vector num))) -(define-markup-command (markalphabet layout props num) (integer?) +(define-builtin-markup-command (markalphabet layout props num) (integer?) "Make a markup letter for @var{num}. The letters start with A to Z and continues with double letters." (ly:text-interface::interpret-markup layout props @@ -1152,7 +1153,7 @@ letter 'A'." -(define-markup-command (slashed-digit layout props num) (integer?) +(define-builtin-markup-command (slashed-digit layout props num) (integer?) "A feta number, with slash. This is for use in the context of figured bass notation" (let* @@ -1167,30 +1168,42 @@ figured bass notation" (num-x (interval-widen (ly:stencil-extent number-stencil X) (* mag 0.2))) (num-y (ly:stencil-extent number-stencil Y)) - (slash-stencil - (ly:make-stencil - `(draw-line - ,thickness - ,(car num-x) ,(- (interval-center num-y) dy) - ,(cdr num-x) ,(+ (interval-center num-y) dy)) - num-x num-y - ))) - - (ly:stencil-add number-stencil - (cond - ((= num 5) (ly:stencil-translate slash-stencil - ;;(cons (* mag -0.05) (* mag 0.42)) - (cons (* mag -0.00) (* mag -0.07)) - - )) - ((= num 7) (ly:stencil-translate slash-stencil - ;;(cons (* mag -0.05) (* mag 0.42)) - (cons (* mag -0.00) (* mag -0.15)) - - )) - - (else slash-stencil))) - )) + (is-sane (and (interval-sane? num-x) (interval-sane? num-y))) + + (slash-stencil + (if is-sane + (ly:make-stencil + `(draw-line + ,thickness + ,(car num-x) ,(- (interval-center num-y) dy) + ,(cdr num-x) ,(+ (interval-center num-y) dy)) + num-x num-y) + #f))) + + (set! slash-stencil + (cond + ((not (ly:stencil? slash-stencil)) #f) + ((= num 5) (ly:stencil-translate slash-stencil + ;;(cons (* mag -0.05) (* mag 0.42)) + (cons (* mag -0.00) (* mag -0.07)) + + )) + ((= num 7) (ly:stencil-translate slash-stencil + ;;(cons (* mag -0.05) (* mag 0.42)) + (cons (* mag -0.00) (* mag -0.15)) + + )) + + (else slash-stencil))) + + (if slash-stencil + (set! number-stencil + (ly:stencil-add number-stencil slash-stencil)) + + (ly:warning "invalid number for slashed digit ~a" num)) + + + number-stencil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; the note command. @@ -1199,7 +1212,7 @@ figured bass notation" ;; TODO: better syntax. -(define-markup-command (note-by-number layout props log dot-count dir) (number? number? number?) +(define-builtin-markup-command (note-by-number layout props log dot-count dir) (number? number? number?) "Construct a note symbol, with stem. By using fractional values for @var{dir}, you can obtain longer or shorter stems." @@ -1250,8 +1263,8 @@ figured bass notation" (apply ly:stencil-add (map (lambda (x) (ly:stencil-translate-axis - dot (* (+ 1 (* 2 x)) dotwid) X)) - (iota dot-count 1))))) + dot (* 2 x dotwid) X)) + (iota dot-count))))) (flaggl (and (> log 2) (ly:stencil-translate (ly:font-get-glyph font @@ -1259,6 +1272,9 @@ figured bass notation" (if (> dir 0) "u" "d") (number->string log))) (cons (+ (car attach-off) (/ stem-thickness 2)) stemy))))) + + (if (and dots flaggl (> dir 0)) + (set! dots (ly:stencil-translate-axis dots 0.35 X))) (if flaggl (set! stem-glyph (ly:stencil-add flaggl stem-glyph))) (if (ly:stencil? stem-glyph) @@ -1269,12 +1285,7 @@ figured bass notation" (ly:stencil-add (ly:stencil-translate-axis dots - (+ (if (and (> dir 0) (> log 2)) - (* 1.5 dotwid) - 0) - ;; huh ? why not necessary? - ;;(cdr (ly:stencil-extent head-glyph X)) - dotwid) + (+ (cdr (ly:stencil-extent head-glyph X)) dotwid) X) stem-glyph))) stem-glyph)) @@ -1296,7 +1307,7 @@ figured bass notation" (if dots (string-length dots) 0))) (ly:error (_ "not a valid duration string: ~a") duration-string)))) -(define-markup-command (note layout props duration dir) (string? number?) +(define-builtin-markup-command (note layout props duration dir) (string? number?) "This produces a note with a stem pointing in @var{dir} direction, with the @var{duration} for the note head type and augmentation dots. For example, @code{\\note #\"4.\" #-0.75} creates a dotted quarter note, with @@ -1309,7 +1320,7 @@ a shortened down stem." ;; translating. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define-markup-command (lower layout props amount arg) (number? markup?) +(define-builtin-markup-command (lower layout props amount arg) (number? markup?) " Lower @var{arg}, by the distance @var{amount}. A negative @var{amount} indicates raising, see also @code{\\raise}. @@ -1318,7 +1329,7 @@ A negative @var{amount} indicates raising, see also @code{\\raise}. (- amount) Y)) -(define-markup-command (translate-scaled layout props offset arg) (number-pair? markup?) +(define-builtin-markup-command (translate-scaled layout props offset arg) (number-pair? markup?) "Translate @var{arg} by @var{offset}, scaling the offset by the @code{font-size}." (let* @@ -1329,7 +1340,7 @@ A negative @var{amount} indicates raising, see also @code{\\raise}. (ly:stencil-translate (interpret-markup layout props arg) scaled))) -(define-markup-command (raise layout props amount arg) (number? markup?) +(define-builtin-markup-command (raise layout props amount arg) (number? markup?) " Raise @var{arg}, by the distance @var{amount}. A negative @var{amount} indicates lowering, see also @code{\\lower}. @@ -1348,7 +1359,7 @@ positions it next to the staff cancels any shift made with and/or @code{extra-offset} properties. " (ly:stencil-translate-axis (interpret-markup layout props arg) amount Y)) -(define-markup-command (fraction layout props arg1 arg2) (markup? markup?) +(define-builtin-markup-command (fraction layout props arg1 arg2) (markup? markup?) "Make a fraction of two markups." (let* ((m1 (interpret-markup layout props arg1)) (m2 (interpret-markup layout props arg2)) @@ -1376,13 +1387,13 @@ and/or @code{extra-offset} properties. " -(define-markup-command (normal-size-super layout props arg) (markup?) +(define-builtin-markup-command (normal-size-super layout props arg) (markup?) "Set @var{arg} in superscript with a normal font size." (ly:stencil-translate-axis (interpret-markup layout props arg) (* 0.5 (chain-assoc-get 'baseline-skip props)) Y)) -(define-markup-command (super layout props arg) (markup?) +(define-builtin-markup-command (super layout props arg) (markup?) " @cindex raising text @cindex lowering text @@ -1408,7 +1419,7 @@ Raising and lowering texts can be done with @code{\\super} and (* 0.5 (chain-assoc-get 'baseline-skip props)) Y)) -(define-markup-command (translate layout props offset arg) (number-pair? markup?) +(define-builtin-markup-command (translate layout props offset arg) (number-pair? markup?) "This translates an object. Its first argument is a cons of numbers @example A \\translate #(cons 2 -3) @{ B C @} D @@ -1422,7 +1433,7 @@ that. (ly:stencil-translate (interpret-markup layout props arg) offset)) -(define-markup-command (sub layout props arg) (markup?) +(define-builtin-markup-command (sub layout props arg) (markup?) "Set @var{arg} in subscript." (ly:stencil-translate-axis (interpret-markup @@ -1432,7 +1443,7 @@ that. (* -0.5 (chain-assoc-get 'baseline-skip props)) Y)) -(define-markup-command (normal-size-sub layout props arg) (markup?) +(define-builtin-markup-command (normal-size-sub layout props arg) (markup?) "Set @var{arg} in subscript, in a normal font size." (ly:stencil-translate-axis (interpret-markup layout props arg) @@ -1443,91 +1454,17 @@ that. ;; brackets. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define-markup-command (hbracket layout props arg) (markup?) +(define-builtin-markup-command (hbracket layout props arg) (markup?) "Draw horizontal brackets around @var{arg}." (let ((th 0.1) ;; todo: take from GROB. (m (interpret-markup layout props arg))) (bracketify-stencil m X th (* 2.5 th) th))) -(define-markup-command (bracket layout props arg) (markup?) +(define-builtin-markup-command (bracket layout props arg) (markup?) "Draw vertical brackets around @var{arg}." (let ((th 0.1) ;; todo: take from GROB. (m (interpret-markup layout props arg))) (bracketify-stencil m Y th (* 2.5 th) th))) - -(define-markup-command (bracketed-y-column layout props indices args) - (list? markup-list?) - "Make a column of the markups in @var{args}, putting brackets around -the elements marked in @var{indices}, which is a list of numbers. - -" -;; -;; DROPME? This command is a relic from the old figured bass implementation. -;; - - (define (sublist lst start stop) - (take (drop lst start) (- (1+ stop) start))) - - (define (stencil-list-extent ss axis) - (cons - (apply min (map (lambda (x) (car (ly:stencil-extent x axis))) ss)) - (apply max (map (lambda (x) (cdr (ly:stencil-extent x axis))) ss)))) - - - (define (stack-stencils-vertically stencils bskip last-stencil) - (cond - ((null? stencils) '()) - ((not (ly:stencil? last-stencil)) - (cons (car stencils) - (stack-stencils-vertically (cdr stencils) bskip (car stencils)))) - (else - (let* ((orig (car stencils)) - (dir (chain-assoc-get 'direction props DOWN)) - (new (ly:stencil-moved-to-edge last-stencil Y dir - orig - 0.1 bskip))) - - (cons new (stack-stencils-vertically (cdr stencils) bskip new)))))) - - (define (make-brackets stencils indices acc) - (if (and stencils - (pair? indices) - (pair? (cdr indices))) - (let* ((encl (sublist stencils (car indices) (cadr indices))) - (x-ext (stencil-list-extent encl X)) - (y-ext (stencil-list-extent encl Y)) - (thick 0.10) - (pad 0.35) - (protusion (* 2.5 thick)) - (lb - (ly:stencil-translate-axis - (ly:bracket Y y-ext thick protusion) - (- (car x-ext) pad) X)) - (rb (ly:stencil-translate-axis - (ly:bracket Y y-ext thick (- protusion)) - (+ (cdr x-ext) pad) X))) - - (make-brackets - stencils (cddr indices) - (append - (list lb rb) - acc))) - acc)) - - (let* ((stencils - (map (lambda (x) - (interpret-markup - layout - props - x)) args)) - (leading - (chain-assoc-get 'baseline-skip props)) - (stacked (stack-stencils-vertically - (remove ly:stencil-empty? stencils) 1.25 #f)) - (brackets (make-brackets stacked indices '()))) - - (apply ly:stencil-add - (append stacked brackets)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/scm/define-music-display-methods.scm b/scm/define-music-display-methods.scm index 66beb27cea..91be3e28b3 100644 --- a/scm/define-music-display-methods.scm +++ b/scm/define-music-display-methods.scm @@ -598,6 +598,7 @@ Otherwise, return #f." (fig (ly:music-property figure 'figure)) (bracket-start (ly:music-property figure 'bracket-start)) (bracket-stop (ly:music-property figure 'bracket-stop))) + (format #f "~a~a~a~a" (if (null? bracket-start) "" "[") (cond ((null? fig) "_") @@ -605,12 +606,12 @@ Otherwise, return #f." (else fig)) (if (null? alteration) "" - (case alteration - ((-4) "--") - ((-2) "-") - ((0) "!") - ((2) "+") - ((4) "++") + (cond + ((= alteration DOUBLE-FLAT) "--") + ((= alteration FLAT) "-") + ((= alteration NATURAL) "!") + ((= alteration SHARP) "+") + ((= alteration DOUBLE-SHARP) "++") (else ""))) (if (null? bracket-stop) "" "]")))) @@ -829,10 +830,14 @@ Otherwise, return #f." ;;; Layout properties (define-display-method OverrideProperty (expr parser) - (let ((symbol (ly:music-property expr 'symbol)) - (properties (ly:music-property expr 'grob-property-path)) - (value (ly:music-property expr 'grob-value)) - (once (ly:music-property expr 'once))) + (let* ((symbol (ly:music-property expr 'symbol)) + (property-path (ly:music-property expr 'grob-property-path)) + (properties (if (pair? property-path) + property-path + (list (ly:music-property expr 'grob-property)))) + (value (ly:music-property expr 'grob-value)) + (once (ly:music-property expr 'once))) + (format #f "~a\\override ~a~a #'~a = ~a~a" (if (or (null? once) (not once)) @@ -895,10 +900,15 @@ Otherwise, return #f." ?unit-count))) ;;; \clef -(define clef-name-alist (map (lambda (name+vals) - (cons (cdr name+vals) - (car name+vals))) - supported-clefs)) +(define clef-name-alist #f) +(define-public (memoize-clef-names clefs) + "Initialize `clef-name-alist', if not already set." + (if (not clef-name-alist) + (set! clef-name-alist + (map (lambda (name+vals) + (cons (cdr name+vals) + (car name+vals))) + clefs)))) (define-extra-display-method ContextSpeccedMusic (expr parser) "If `expr' is a clef change, return \"\\clef ...\" diff --git a/scm/define-music-properties.scm b/scm/define-music-properties.scm index b9901d5d86..4a898263e4 100644 --- a/scm/define-music-properties.scm +++ b/scm/define-music-properties.scm @@ -96,9 +96,6 @@ It must take a single argument, being the context.") (quoted-context-id ,string? "The id of the context to direct quotes to, eg., @code{cue}.") (quoted-transposition ,ly:pitch? "The pitch used for the quote, overriding \\transposition") (to-relative-callback ,procedure? "How to transform a piece of music to relative pitches") - (tweaks ,list? "An alist of properties to override in the backend -for the grob made of this event.") - (repeat-count ,integer? "do a @code{\repeat} how ofen?") (span-direction ,ly:dir? "Does this start or stop a spanner?") (span-type ,string? "What kind of spanner should be created? @@ -122,6 +119,8 @@ e.g. @code{\\tag #'part ...} could tag a piece of music as only being active in (type ,symbol? "The type of this music object. Determines iteration in some cases.") (types ,list? "The types of this music object; determines by what engraver this music expression is processed.") + (tweaks ,list? "An alist of properties to override in the backend +-for the grob made of this event.") (value ,scheme? "Assignment value for a translation property") (void ,boolean? "If this property is #t, then the music expression is to be diff --git a/scm/define-music-types.scm b/scm/define-music-types.scm index e7e2bb88cf..c421eefdf5 100644 --- a/scm/define-music-types.scm +++ b/scm/define-music-types.scm @@ -283,14 +283,6 @@ e.g. @code{\\mark \"A\"}.") (types . (general-music mark-event event)) )) - (ManualMelismaEvent - . ( - (description . "Start or stop a melisma. - -Syntax: @code{c4\\melisma d\\melismaEnd}.") - (types . (general-music melisma-span-event event)) - )) - (MultiMeasureRestMusic . ( (description . "Rests that may be compressed into Multi rests. diff --git a/scm/display-lily.scm b/scm/display-lily.scm index df0d04df7d..b7e253566a 100644 --- a/scm/display-lily.scm +++ b/scm/display-lily.scm @@ -11,9 +11,10 @@ ;;; Display methods are stored in the `display-methods' property of each music ;;; type. ;;; -;;; - `display-lily-music' can be called to display a music expression using -;;; LilyPond notation. `music->lily-string' return a string describing a music -;;; expression using LilyPond notation. +;;; - `music->lily-string' return a string describing a music expression using +;;; LilyPond notation. The special variables *indent*, *previous-duration*, +;;; and *force-duration* influence the indentation level and the display of +;;; music durations. ;;; ;;; - `with-music-match' can be used to destructure a music expression, extracting ;;; some interesting music properties. @@ -98,13 +99,6 @@ display method will be called." music-type))) (format #f "%{ expecting a music expression: ~a %}" expr))) -(define*-public (display-lily-music expr parser #:key force-duration) - (parameterize ((*indent* 0) - (*previous-duration* (ly:make-duration 2)) - (*force-duration* force-duration)) - (display (music->lily-string expr parser)) - (newline))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Music pattern matching @@ -267,13 +261,13 @@ inside body." ;;; ;;; indentation -(define *indent* (make-parameter 0)) +(define-public *indent* (make-parameter 0)) ;;; set to #t to force duration printing -(define *force-duration* (make-parameter #f)) +(define-public *force-duration* (make-parameter #f)) ;;; last duration found -(define *previous-duration* (make-parameter (ly:make-duration 2))) +(define-public *previous-duration* (make-parameter (ly:make-duration 2))) ;;; Set to #t to force a line break with some kinds of expressions (eg sequential music) (define *force-line-break* (make-parameter #t)) diff --git a/scm/document-markup.scm b/scm/document-markup.scm index 9a5e51eb19..27d1229dde 100644 --- a/scm/document-markup.scm +++ b/scm/document-markup.scm @@ -10,10 +10,10 @@ (f-name (symbol->string (procedure-name func))) (c-name (regexp-substitute/global #f "-markup$" f-name 'pre "" 'post)) (sig (object-property func 'markup-signature)) - (arg-names - (map symbol->string - (cddr (cadr (procedure-source func))))) - + (arg-names (let ((arg-list (cadr (procedure-source func)))) + (if (list? arg-list) + (map symbol->string (cddr arg-list)) + (make-list (length sig) "arg")))) (sig-type-names (map type-name sig)) (signature-str (string-join diff --git a/scm/framework-eps.scm b/scm/framework-eps.scm index e2215ede41..cf9bec54b3 100644 --- a/scm/framework-eps.scm +++ b/scm/framework-eps.scm @@ -28,11 +28,14 @@ stencil, so LaTeX includegraphics doesn't fuck up the alignment." (define left - (apply min - (map (lambda (stc) - (interval-start (ly:stencil-extent stc X))) - stencils))) + (if (pair? stencils) + (apply min + (map (lambda (stc) + (interval-start (ly:stencil-extent stc X))) + stencils)) + 0.0)) + (map (lambda (stil) (ly:make-stencil @@ -79,18 +82,22 @@ stencil, so LaTeX includegraphics doesn't fuck up the alignment." (dump-stencils-as-separate-EPS rest (1+ count))))) ;; main body - (let* ((tex-system-name (format "~a-systems.tex" basename)) - (texi-system-name (format "~a-systems.texi" basename)) - (tex-system-port (open-output-file tex-system-name)) - (texi-system-port (open-output-file texi-system-name)) + (let* ((write-file (lambda (str-port ext) + (let* + ((name (format "~a-systems.~a" basename ext)) + (port (open-output-file name))) + (ly:message (_ "Writing ~a...") name) + (display (get-output-string str-port) port) + (close-output-port port) + ))) + + (tex-system-port (open-output-string)) + (texi-system-port (open-output-string)) (widened-stencils (widen-left-stencil-edges stencils)) (counted-systems (count-list widened-stencils)) (eps-files (map dump-counted-stencil counted-systems)) ) - (ly:message (_ "Writing ~a...") tex-system-name) - (ly:message (_ "Writing ~a...") texi-system-name) - (if do-pdf ;; par-for-each: a bit faster ... @@ -113,15 +120,16 @@ stencil, so LaTeX includegraphics doesn't fuck up the alignment." basename (1+ c)) texi-system-port)) (iota (length stencils))) - (display "@c eof - 'eof' is a Makefile marker; do not remove. " texi-system-port) - (display "% eof - 'eof' is Makefile marker; do not remove. " tex-system-port) - - (close-output-port texi-system-port) - (close-output-port tex-system-port) + (display "@c eof." texi-system-port) + (display "% eof. " tex-system-port) (dump-infinite-stack-EPS stencils) (postprocess-output book framework-eps-module - (format "~a.eps" basename) (ly:output-formats)))) + (format "~a.eps" basename) (ly:output-formats)) + + (write-file texi-system-port "texi") + (write-file tex-system-port "tex") + )) diff --git a/scm/framework-gnome.scm b/scm/framework-gnome.scm index 9e8cf4510d..e69de29bb2 100644 --- a/scm/framework-gnome.scm +++ b/scm/framework-gnome.scm @@ -1,421 +0,0 @@ -;;;; framework-gnome.scm -- -;;;; -;;;; source file of the GNU LilyPond music typesetter -;;;; -;;;; (c) 2004--2006 Jan Nieuwenhuizen - -;;;; See output-gnome.scm for usage information. - - -(define-module (scm framework-gnome)) - -(use-modules (guile) - (oop goops) - (scm page) - (scm paper-system) - (lily)) - -(use-modules - (srfi srfi-2) - (ice-9 regex) - (gnome gtk) - (gnome gtk gdk-event) - (gnome gw canvas)) - -(define-public (output-framework basename book scopes fields ) - (gnome-main book basename)) - -(define SCROLLBAR-SIZE 20) -(define BUTTON-HEIGHT 25) -(define PANELS-HEIGHT 80) - -(define PIXELS-PER-UNIT 2) -;; 2.5?? -(define OUTPUT-SCALE (* 2.5 PIXELS-PER-UNIT)) -(define-public output-scale OUTPUT-SCALE) - -(define (debugf string . rest) - (if #f - (apply stderr (cons string rest)))) - -(define-class () - (name #:init-value "untitled" #:init-keyword #:name #:accessor name) - - ;; FIXME - (dragging #:init-value #f #:accessor dragging) - (drag-origin #:init-value #f #:accessor drag-origin) - (drag-location #:init-value #f #:accessor drag-location) - - (page-stencils ;;#:init-value '#() - #:init-keyword #:page-stencils #:accessor page-stencils) - (window #:init-value (make #:type 'toplevel) #:accessor window) - (scrolled #:init-value (make ) #:accessor scrolled) - (canvas #:init-value #f #:accessor canvas) - (page-number #:init-value 0 #:accessor page-number) - (pixels-per-unit #:init-value PIXELS-PER-UNIT #:accessor pixels-per-unit) - (text-items #:init-value '() #:accessor text-items) - (grob #:init-value #f #:accessor grob) - (item-grobs #:init-value (make-hash-table 31) #:accessor item-grobs) - (window-width #:init-keyword #:window-width #:accessor window-width) - (window-height #:init-keyword #:window-height #:accessor window-height) - (canvas-width #:init-keyword #:canvas-width #:accessor canvas-width) - (canvas-height #:init-keyword #:canvas-height #:accessor canvas-height)) - -(define-method (initialize (go )) - (let* ((save (make #:label "Save")) - (exit (make #:label "Exit")) - (next (make #:label "Next")) - (prev (make #:label "Previous")) - (vbox (make #:homogeneous #f)) - (hbox (make #:homogeneous #f))) - - (set-size-request (window go) (window-width go) (window-height go)) - - (set-size-request (scrolled go) (window-width go) (- (window-height go) - BUTTON-HEIGHT - SCROLLBAR-SIZE)) - - (new-canvas go) - - (add (window go) vbox) - (add vbox (scrolled go)) - - (add (scrolled go) (canvas go)) - - ;; buttons - (add vbox hbox) - (set-size-request hbox (window-width go) BUTTON-HEIGHT) - - ;; hmm? These are broken when using . - ;;(set-child-packing vbox hbox #f #f 0 'end) - ;;(set-child-packing hbox button #f #f 0 'end) - - (set-size-request exit (quotient (window-width go) 2) BUTTON-HEIGHT) - - - (add hbox next) - (add hbox prev) - (add hbox save) - (add hbox exit) - - ;; signals - (connect exit 'clicked (lambda (b) (gtk-main-quit))) - (connect save 'clicked (lambda (b) (save-tweaks go))) - (connect next 'clicked (lambda (b) (dump-page go (1+ (page-number go))))) - (connect prev 'clicked (lambda (b) (dump-page go (1- (page-number go))))) - (connect (window go) 'key-press-event - (lambda (w e) (key-press-event go w e))) - - (show-all (window go)))) - - -(define (gnome-main book name) - (let* ((paper (ly:paper-book-paper book)) - (paper-width (ly:output-def-lookup paper 'paper-width)) - (paper-height (ly:output-def-lookup paper 'paper-height)) - (page-width (inexact->exact (ceiling (* OUTPUT-SCALE paper-width)))) - (page-height (inexact->exact (ceiling (* OUTPUT-SCALE paper-height)))) - ;;(page-width (inexact->exact (ceiling paper-width))) - ;;(page-height (inexact->exact (ceiling paper-height))) - - (screen-width (gdk-screen-width)) - (screen-height (gdk-screen-height)) - (desktop-height (- screen-height PANELS-HEIGHT)) - - (go (make - #:name name - #:page-stencils (list->vector (map page-stencil (ly:paper-book-pages book))) - #:canvas-width page-width - #:canvas-height page-height - #:window-width - ;; huh, *2 -- pixels-per-unit? - (min (+ SCROLLBAR-SIZE (* page-width 2)) screen-width) - #:window-height - (min (+ BUTTON-HEIGHT SCROLLBAR-SIZE (* page-height 2)) - desktop-height)))) - - ;; ugh. The GOOPS doc promises this is called automagically. - ;; possibly a goops 1.6.4 problem - (initialize go) - - (dump-page go 0) - - (gtk-main))) - -(define (dump-page go number) - (if (or (not (page-stencils go)) - (< number 0) - (>= number (vector-length (page-stencils go)))) - (stderr "No such page: ~S\n" (1+ number)) - - (let ((old-canvas (canvas go))) - (new-canvas go) - (set! (page-number go) number) - - ;; no destroy method for gnome-canvas-text yet. - ;;(map destroy (gtk-container-get-children main-canvas)) - ;;(map destroy text-items) - - (set! (text-items go) '()) - (debugf "page-stencil ~S: ~S\n" - (page-number go) - (vector-ref (page-stencils go) (page-number go))) - - (ly:interpret-stencil-expression - ;; ;;(vector-ref (page-stencils go) (page-number go)) - (ly:stencil-expr (vector-ref (page-stencils go) (page-number go))) - gnome-output-expression go '(0 . 0)) - - (if old-canvas (destroy old-canvas)) - (add (scrolled go) (canvas go)) - (show (canvas go))))) - -(define ifs #f) -(define (get-ifs) - (if (not ifs) - (set! ifs (getenv "IFS"))) - (if (not ifs) - (set! ifs " ")) - ifs) - -(define (spawn-editor location) - (let* ((file-name (car location)) - (line (cadr location)) - (char (caddr location)) - (column (cadddr location)) - (command (get-editor-command file line char column))) - (debugf "spawning: ~s\n" command) - (if (= (primitive-fork) 0) - (let ((command-list (string-split command #\ )));; (get-ifs)))) - (apply execlp command-list) - (primitive-exit))))) - -(define location-callback spawn-editor) - -(define (get-location grob) - (and-let* ((p (procedure? point-and-click)) - (g grob) - (cause (ly:grob-property grob 'cause)) - (music-origin (if (ly:event? cause) - (ly:event-property cause 'origin) - ;; How come # [and '()] - ;; are #t? :-( - #f))) - (if (ly:input-location? music-origin) - (ly:input-location music-origin) - #f))) - -;; todo: how to integrate nicely? -;(define-public (tweak-grob-property grob sym val) -; (set! (ly:grob-property grob sym) val)) - - -(define-method (tweak (go ) item offset) - (let* ((grob (hashq-ref (item-grobs go) item #f)) - (extra-offset (ly:grob-property grob 'extra-offset)) - (origin (if (null? extra-offset) '(0 . 0) - (offset-flip-y extra-offset)))) - - (if grob - (ly:grob-replace-tweak - grob (list tweak-grob-property - 'extra-offset - (offset-flip-y (offset-add origin offset))))))) - -(define-method (save-tweaks (go )) - (let* ((dumper (ly:make-dumper)) - (tweaks (ly:all-tweaks)) - (serialized-tweaks - (map - (lambda (tweak) (append - (list (ly:dumper-key-serial dumper (car tweak)) - (list 'unquote (procedure-name (cadr tweak)))) - (cddr tweak))) - tweaks))) - - (if (not (null? serialized-tweaks)) - (let ((file (open-file (string-append (name go) ".twy") "w"))) - (format file - ";;;tweaks. Generated file. Do not edit. -(ly:tweak-clear-registry) -(ly:tweak-define-keys `~S) -(ly:tweak-define-tweaks `~S)" - (ly:dumper-definitions dumper) - serialized-tweaks))))) - -;;;(define (item-event go grob item event) -(define (item-event go item event) - ;;(stderr "EVENT: ~S\n" event) - ;;(stderr "TYPE: ~S\n" (gdk-event:type event)) - (case (gdk-event:type event) - ((enter-notify) (gobject-set-property item 'fill-color "red")) - ((leave-notify) (gobject-set-property item 'fill-color "black")) - ((motion-notify) (if (ly:grob? (dragging go)) - (let ((x (gdk-event-motion:x event)) - (y (gdk-event-motion:y event)) - (s output-scale) - (r (drag-location go))) - ;;(stderr "MOVED AT: ~S ~S\n" x y) - (move item (/ (- x (car r)) s) (/ (- y (cdr r)) s)) - (set! (drag-location go) (cons x y))))) - ((button-release) (if (ly:grob? (dragging go)) - (let ((x (gdk-event-button:x event)) - (y (gdk-event-button:y event)) - (s output-scale) - (o (drag-origin go)) - (r (drag-location go))) - (move item (/ (- x (car r)) s) (/ (- y (cdr r)) s)) - (set! (drag-location go) #f) - (set! (drag-origin go) #f) - (stderr "RELEASE at: ~S ~S\n" x y) - (set! (dragging go) #f) - (tweak go item (cons (/ (- x (car o)) s) - (/ (- y (cdr o)) s)))))) - ((button-press) - (let ((button (gdk-event-button:button event))) - (cond - ((= button 1) - (if (null? (gdk-event-button:modifiers event)) - (let ((x (gdk-event-button:x event)) - (y (gdk-event-button:y event))) - (stderr "CLICK at: ~S ~S\n" x y) - (set! (dragging go) (hashq-ref (item-grobs go) item #f)) - (set! (drag-origin go) (cons x y)) - (set! (drag-location go) (cons x y))) - (begin - (stderr "CLICK WITH MODIFIERS: ~S\n" - (gdk-event-button:modifiers event)) - - ;; some modifier, do jump to source - (and-let* ((grob (hashq-ref (item-grobs go) item #f)) - (location (get-location grob))) - (location-callback location))))) - ((= button 2) - (and-let* ((grob (hashq-ref (item-grobs go) item #f))) - - (let ((properties (ly:grob-properties grob)) - (basic-properties (ly:grob-basic-properties grob)) - (x (inexact->exact (gdk-event-button:x-root event))) - (y (inexact->exact (gdk-event-button:y-root event)))) - - (debugf "GROB: ~S\n" grob) - (debugf "PROPERTIES: ~S\n" properties) - (debugf "BASIC PROPERTIES: ~S\n" basic-properties) - - ;; FIXME: dialog iso window? - ;; http://www.gtk.org/tutorial/sec-textentries.html - (let ((window (make )) - (vbox (make )) - (ok (make #:label "Ok"))) - - (add window vbox) - (connect ok 'clicked (lambda (b) (destroy window))) - - (for-each - (lambda (x) - (let ((label (make - ;;#:label (symbol->string (car x)))) - #:label (format #f "~S" (car x)))) - ;;(symbol->string (car x)))) - (entry (make - #:text (format #f "~S" (cdr x)))) - (hbox (make ))) - (add hbox label) - (add hbox entry) - (set-size-request label 150 BUTTON-HEIGHT) - (add vbox hbox))) - (append properties basic-properties)) - (add vbox ok) - - (show-all window) - (move window x y)))))))) - - ((2button-press) (gobject-set-property item 'fill-color "green")) - ((key-press) - (let ((keyval (gdk-event-key:keyval event)) - (mods (gdk-event-key:modifiers event)) - (step (quotient (pixels-per-unit go) 2))) - (cond ((and (null? mods) - (eq? keyval gdk:Up)) - (tweak go item (cons 0 (- 0 step)))) - ((and (null? mods) - (eq? keyval gdk:Down)) - (tweak go item (cons 0 step))) - ((and (null? mods) - (eq? keyval gdk:Left)) - (tweak go item (cons (- 0 step) 0))) - ((and (null? mods) - (eq? keyval gdk:Right)) - (tweak go item (cons step 0))))))) - #t) - -(define (scale-canvas go factor) - (set! (pixels-per-unit go) (* (pixels-per-unit go) factor)) - (set-pixels-per-unit (canvas go) (pixels-per-unit go)) - (for-each - (lambda (x) - (let ((scale (gobject-get-property x 'scale)) - (points (gobject-get-property x 'size-points))) - ;;(gobject-set-property x 'scale pixels-per-unit) - (gobject-set-property x 'size-points (* points factor)))) - (text-items go))) - -(define (key-press-event go item event) - (let ((keyval (gdk-event-key:keyval event)) - (mods (gdk-event-key:modifiers event))) - (cond ((and (or (eq? keyval gdk:q) - (eq? keyval gdk:w)) - (equal? mods '(control-mask modifier-mask))) - (gtk-main-quit)) - ((and (eq? keyval gdk:s) - (equal? mods '(control-mask modifier-mask))) - (save-tweaks go)) - ((and #t ;;(null? mods) - (eq? keyval gdk:plus)) - (scale-canvas go 2)) - ((and #t ;; (null? mods) - (eq? keyval gdk:minus)) - (scale-canvas go 0.5)) - ((or (eq? keyval gdk:Page-Up) - (eq? keyval gdk:BackSpace)) - (dump-page go (1- (page-number go)))) - ((or (eq? keyval gdk:Page-Down) - (eq? keyval gdk:space)) - (dump-page go (1+ (page-number go))))) - #f)) - -(define (new-canvas go) - (set! (canvas go) (make )) - (set-size-request (canvas go) (window-width go) (window-height go)) - (set-scroll-region (canvas go) 0 0 (canvas-width go) (canvas-height go)) - (set-pixels-per-unit (canvas go) (pixels-per-unit go)) - (make - #:parent (root (canvas go)) - #:x2 (canvas-width go) #:y2 (canvas-height go) - #:fill-color "white")) - -(define output-gnome-module #f) -(define (get-output-gnome-module go) - (if (not output-gnome-module) - (let ((m (resolve-module '(scm output-gnome)))) - (module-define! m 'canvas-root (lambda () (root (canvas go)))) - (module-define! m 'output-scale output-scale) - (set! output-gnome-module m))) - output-gnome-module) - -(define-public (gnome-output-expression go expr) - (let* ((m (get-output-gnome-module go)) - (result (eval expr m))) - (cond - ((ly:grob? result) (set! (grob go) result)) - ((is-a? result ) - - ;; AAARGH; grobs happen after stencils - ;; (connect result 'event (lambda (w e) (item-event go (grob go) w e))) - (connect result 'event (lambda (w e) (item-event go w e))) - (if (grob go) - (hashq-set! (item-grobs go) result (grob go))) - (set! (grob go) #f) - - (if (is-a? result ) - (set! (text-items go) (cons result (text-items go)))))))) diff --git a/scm/framework-ps.scm b/scm/framework-ps.scm index 23d0f10dfc..213d995c2c 100644 --- a/scm/framework-ps.scm +++ b/scm/framework-ps.scm @@ -8,9 +8,7 @@ ;;; this is still too big a mess. -(use-modules (ice-9 regex) - (ice-9 string-fun) - (ice-9 format) +(use-modules (ice-9 string-fun) (guile) (scm page) (scm paper-system) @@ -19,6 +17,10 @@ (scm clip-region) (lily)) +(define (format dest . rest) + (if (string? dest) + (apply simple-format (cons #f (cons dest rest))) + (apply simple-format (cons dest rest)))) (define framework-ps-module (current-module)) @@ -31,7 +33,12 @@ (string-append "magfont" - (string-regexp-substitute "[ /%]" "_" name) + (ly:string-substitute + " " "_" + (ly:string-substitute + "/" "_" + (ly:string-substitute + "%" "_" name))) "m" (string-encode-integer (inexact->exact (round (* 1000 magnify))))))) (define (tex-font? fontname) @@ -45,10 +52,6 @@ (string-append "/" command " { /" fontname " " (ly:number->string scaling) " output-scale div selectfont } bind def\n")) - (define (standard-tex-font? x) - (or (equal? (substring x 0 2) "ms") - (equal? (substring x 0 2) "cm"))) - (define (font-load-command font) (let* ((specced-font-name (ly:font-name font)) (fontname (if specced-font-name @@ -63,10 +66,6 @@ (ops (ly:output-def-lookup paper 'output-scale)) (scaling (* ops magnification designsize))) - ;; Bluesky pfbs have UPCASE names (sigh.) - ;; FIXME - don't support Bluesky? - (if (standard-tex-font? fontname) - (set! fontname (string-upcase fontname))) (if (equal? fontname "unknown") (display (list font fontname))) (define-font plain fontname scaling))) @@ -165,10 +164,10 @@ (ly:output-def-lookup paper 'output-scale)) (ly:bp 1))) (landscape? (eq? (ly:output-def-lookup paper 'landscape) #t))) - (format "%%DocumentMedia: ~a ~$ ~$ ~a ~a ~a\n" + (format "%%DocumentMedia: ~a ~a ~a ~a ~a ~a\n" (ly:output-def-lookup paper 'papersizename) - (if landscape? h w) - (if landscape? w h) + (round2 (if landscape? h w)) + (round2 (if landscape? w h)) 80 ;; weight "()" ;; color "()" ;; type @@ -270,7 +269,10 @@ (if (mac-font? bare-file-name) (handle-mac-font name bare-file-name) (cond - ((string-match "^([eE]mmentaler|[Aa]ybabtu)" file-name) + ((or (string-startswith file-name "Emmentaler") + (string-startswith file-name "emmentaler") + (string-startswith file-name "aybabtu") + (string-startswith file-name "Aybabtu")) (ps-load-file (ly:find-file (format "~a.otf" file-name)))) ((string? bare-file-name) @@ -337,13 +339,13 @@ ((downcase-file-name (string-downcase file-name))) (cond - ((and file-name (string-match "\\.pfa" downcase-file-name)) + ((and file-name (string-endswith downcase-file-name ".pfa")) (embed-document file-name)) - ((and file-name (string-match "\\.pfb" downcase-file-name)) + ((and file-name (string-endswith downcase-file-name ".pfb")) (ly:pfb->pfa file-name)) - ((and file-name (string-match "\\.ttf" downcase-file-name)) + ((and file-name (string-endswith downcase-file-name ".ttf")) (ly:ttf->pfa file-name)) - ((and file-name (string-match "\\.otf" downcase-file-name)) + ((and file-name (string-endswith downcase-file-name ".otf")) (ps-embed-cff (ly:otf->cff file-name) name 0)) (else (ly:warning (_ "do not know how to embed ~S=~S") name file-name) @@ -354,7 +356,7 @@ (eq? PLATFORM 'darwin) bare-file-name (or - (string-match "\\.dfont" bare-file-name) + (string-endswith bare-file-name ".dfont") (= (stat:size (stat bare-file-name)) 0)))) (define (load-font font-name-filename) @@ -487,7 +489,10 @@ (let* ((xext (ly:stencil-extent dump-me X)) (yext (ly:stencil-extent dump-me Y)) - (left-overshoot (ly:get-option 'eps-box-padding)) + (padding (ly:get-option 'eps-box-padding)) + (left-overshoot (if (number? padding) + (* -1 padding (ly:output-def-lookup paper 'mm)) + #f)) (bbox (map (lambda (x) @@ -755,10 +760,16 @@ (define-public (output-classic-framework basename book scopes fields) - (ly:error (_ "\nThe PostScript backend does not support the 'classic' -framework. Use the EPS backend instead, + (ly:error (_ "\nThe PostScript backend does not support the system-by-system +output. For that, use the EPS backend instead, lilypond -b eps -or remove the lilypond-book specific settings from the input. +If have cut & pasted a lilypond fragment from a webpage, be sure +to only remove anything before + + %% **************************************************************** + %% Start cut-&-pastable-section + %% **************************************************************** + "))) diff --git a/scm/fret-diagrams.scm b/scm/fret-diagrams.scm index 2792ef7956..69194956f3 100644 --- a/scm/fret-diagrams.scm +++ b/scm/fret-diagrams.scm @@ -80,44 +80,44 @@ Line thickness is given by @var{th}, fret & string spacing by (ly:stencil-combine-at-edge (draw-strings (- string-count 1) fret-range th size) X RIGHT string-stencil - gap 0)))) + gap)))) (define (draw-fret-lines fret-count string-count th size) - "Draw @var{fret-count} frets (horizontal lines) for a fret diagram + "Draw @var{fret-count} frets (horizontal lines) for a fret diagram with @var{string-count} strings. Line thickness is given by @var{th}, fret & string spacing by @var{size}. " - (let* ((fret-length (* (- string-count 1) size)) - (sth (* size th)) - (half-thickness (* sth 0.5)) - (gap (- size sth)) - (fret-line (ly:make-stencil (list 'draw-line sth half-thickness size (- fret-length half-thickness) size) - (cons 0 fret-length) - (cons (- size half-thickness) (+ size half-thickness))))) - (if (= fret-count 1) - fret-line - (ly:stencil-combine-at-edge fret-line Y UP - (draw-fret-lines (- fret-count 1) string-count th size) - gap 0)))) - + (let* ((fret-length (* (- string-count 1) size)) + (sth (* size th)) + (half-thickness (* sth 0.5)) + (gap (- size sth)) + (fret-line (ly:make-stencil (list 'draw-line sth half-thickness size (- fret-length half-thickness) size) + (cons 0 fret-length) + (cons (- size half-thickness) (+ size half-thickness))))) + (if (= fret-count 1) + fret-line + (ly:stencil-combine-at-edge fret-line Y UP + (draw-fret-lines (- fret-count 1) string-count th size) + gap)))) + (define (draw-thick-top-fret props string-count th size) - "Draw a thick top fret for a fret diagram whose base fret is not 1." - (let* ((sth (* th size)) -; (top-fret-thick (* sth (chain-assoc-get 'top-fret-thickness props 3.0))) - (top-fret-thick (* sth 3.0)) -; (top-half-thick (* top-fret-thick 0.5)) - (half-thick (* sth 0.5)) - (x1 half-thick) - (x2 (+ half-thick (* size (- string-count 1)))) - (y1 (- half-thick)) - (y2 (+ top-fret-thick half-thick)) - (x-extent (cons (- x1) x2)) - (y-extent (cons 0 y2))) - (ly:make-stencil (list 'round-filled-box x1 x2 y1 y2 sth) - x-extent y-extent))) - - + "Draw a thick top fret for a fret diagram whose base fret is not 1." + (let* ((sth (* th size)) + ; (top-fret-thick (* sth (chain-assoc-get 'top-fret-thickness props 3.0))) + (top-fret-thick (* sth 3.0)) + ; (top-half-thick (* top-fret-thick 0.5)) + (half-thick (* sth 0.5)) + (x1 half-thick) + (x2 (+ half-thick (* size (- string-count 1)))) + (y1 (- half-thick)) + (y2 (+ top-fret-thick half-thick)) + (x-extent (cons (- x1) x2)) + (y-extent (cons 0 y2))) + (ly:make-stencil (list 'round-filled-box x1 x2 y1 y2 sth) + x-extent y-extent))) + + (define (draw-frets layout props fret-range string-count th size) - "Draw the frets (horizontal lines) for a fret diagram with + "Draw the frets (horizontal lines) for a fret diagram with @var{string-count} strings and frets as indicated in @var{fret-range}. Line thickness is given by @var{th}, fret & string spacing by @var{size}. " @@ -125,13 +125,13 @@ Line thickness is given by @var{th}, fret & string spacing by (fret-length (* (- string-count 1) size)) (half-thickness (* th 0.5)) (base-fret (car fret-range))) - (ly:stencil-combine-at-edge - (draw-fret-lines fret-count string-count th size) Y UP - (if (= base-fret 1) - (draw-thick-top-fret props string-count th size) - (draw-fret-lines 1 string-count th size)) - (- size th) 0))) - + (ly:stencil-combine-at-edge + (draw-fret-lines fret-count string-count th size) Y UP + (if (= base-fret 1) + (draw-thick-top-fret props string-count th size) + (draw-fret-lines 1 string-count th size)) + (- size th)))) + (define (draw-dots layout props string-count fret-range size finger-code dot-position dot-radius dot-thickness dot-list) @@ -295,7 +295,7 @@ Line thickness is given by @var{th}, fret & string spacing by (sans-serif-stencil layout props (* size label-font-mag) label-text) (* size (+ fret-count label-vertical-offset)) Y))) -(define-markup-command (fret-diagram-verbose layout props marking-list) +(define-builtin-markup-command (fret-diagram-verbose layout props marking-list) (list?) "Make a fret diagram containing the symbols indicated in @var{marking-list} @@ -383,15 +383,15 @@ indications per string. (if (not (null? xo-list)) (set! fret-diagram-stencil (ly:stencil-combine-at-edge fret-diagram-stencil Y UP - (draw-xo layout props string-count fret-range size xo-list) xo-padding 0))) + (draw-xo layout props string-count fret-range size xo-list) xo-padding))) (if (> (car fret-range) 1) (set! fret-diagram-stencil (ly:stencil-combine-at-edge fret-diagram-stencil X label-dir - (label-fret layout props string-count fret-range size) label-space 0))) + (label-fret layout props string-count fret-range size) label-space))) (ly:stencil-aligned-to fret-diagram-stencil X alignment) )) -(define-markup-command (fret-diagram layout props definition-string) +(define-builtin-markup-command (fret-diagram layout props definition-string) (string?) " Example @@ -522,7 +522,7 @@ Note: There is no limit to the number of fret indications per string. (cons* numeric-value (numerify (cdr mylist))) (cons* (car (string->list (car mylist))) (numerify (cdr mylist))))))) -(define-markup-command (fret-diagram-terse layout props definition-string) +(define-builtin-markup-command (fret-diagram-terse layout props definition-string) (string?) "Make a fret diagram markup using terse string-based syntax. diff --git a/scm/layout-beam.scm b/scm/layout-beam.scm index d946890049..8edfd9c757 100644 --- a/scm/layout-beam.scm +++ b/scm/layout-beam.scm @@ -59,7 +59,7 @@ ly:beam::quanting (check-beam-quant l r) )) - + (define-public (check-slope-callbacks comparison) (list ly:beam::calc-least-squares-positions @@ -68,3 +68,4 @@ ly:beam::quanting (check-beam-slope-sign comparison) )) + diff --git a/scm/layout-page-dump.scm b/scm/layout-page-dump.scm index 50815ac2ef..8237106f06 100644 --- a/scm/layout-page-dump.scm +++ b/scm/layout-page-dump.scm @@ -70,12 +70,11 @@ (format out-port "~a\n~a\n" skip base) (dump-tweaks out-port (cdr tweak-list) (graceless-moment now))))) -(define (dump-all-tweaks pages tweaks) - (let* ((paper (ly:paper-book-paper (page-property (car pages) 'paper-book))) - (parser (ly:output-def-parser paper)) - (name (format "~a-page-layout.ly" - (ly:parser-output-name parser))) +(define (dump-all-tweaks pages tweaks output-name) + (let* ((paper (ly:paper-book-paper (page-property (car pages) 'paper-book))) + (name (format "~a-page-layout.ly" output-name)) (out-port (open-output-file name))) + (ly:message "Writing page layout to ~a" name) (hash-for-each (lambda (key val) @@ -85,7 +84,7 @@ tweaks) (close-port out-port))) -(define (write-page-breaks pages) +(define (write-page-breaks pages output-name) "Dump page breaks and tweaks" (let ((tweaks (make-hash-table 60))) (define (handle-page page) @@ -145,4 +144,4 @@ (record-line-tweak (cdr lines) #f (1+ index))))))) ;; Compute tweaks for each page, then dump them to the page-layout file (for-each handle-page pages) - (dump-all-tweaks pages tweaks))) + (dump-all-tweaks pages tweaks output-name))) diff --git a/scm/layout-page-layout.scm b/scm/layout-page-layout.scm index f7853b01bb..264d380548 100644 --- a/scm/layout-page-layout.scm +++ b/scm/layout-page-layout.scm @@ -35,8 +35,14 @@ (define (post-process-pages layout pages) "If the write-page-layout paper variable is true, dumps page breaks and tweaks." - (if (ly:output-def-lookup layout 'write-page-layout #f) - (write-page-breaks pages))) + + (let* + ((parser (ly:modules-lookup (list (current-module)) 'parser)) + (output-name (ly:parser-output-name parser)) + ) + + (if (ly:output-def-lookup layout 'write-page-layout #f) + (write-page-breaks pages output-name)))) ;;; ;;; Utilities for computing line distances and positions @@ -208,8 +214,11 @@ (space-to-fill (page-maximum-space-to-fill page lines paper)) (spacing (space-systems space-to-fill lines ragged paper #f))) - (if (or (not (car spacing)) (inf? (car spacing))) - (cdr (space-systems space-to-fill lines ragged paper #t)) + (if (and (> (length lines) 1) + (or (not (car spacing)) (inf? (car spacing)))) + (begin + (ly:warning (_ "Can't fit systems on page -- ignoring between-system-padding")) + (cdr (space-systems space-to-fill lines ragged paper #t))) (cdr spacing)))))) (page-set-property! page 'configuration posns) page)) diff --git a/scm/lily-library.scm b/scm/lily-library.scm index 1e8fe97e47..0746876ca3 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -49,46 +49,28 @@ (define-public (moment-min a b) (if (ly:moment output hooks. -;; parser stuff. -(define-public (print-music-as-book parser music) - (let* ((head (ly:parser-lookup parser '$defaultheader)) - (book (ly:make-book (ly:parser-lookup parser '$defaultpaper) - head (scorify-music music parser)))) - (print-book-with-defaults parser book))) - -(define-public (print-score-as-book parser score) - (let* ((head (ly:parser-lookup parser '$defaultheader)) - (book (ly:make-book (ly:parser-lookup parser '$defaultpaper) - head score))) - (print-book-with-defaults parser book))) - -(define-public (print-score parser score) - (let* ((head (ly:parser-lookup parser '$defaultheader)) - (book (ly:make-book (ly:parser-lookup parser '$defaultpaper) - head score))) - (ly:parser-print-score parser book))) (define-public (collect-scores-for-book parser score) (ly:parser-define! parser 'toplevel-scores (cons score (ly:parser-lookup parser 'toplevel-scores)))) +(define-public (collect-music-for-book parser music) + ;; discard music if its 'void property is true. + (let ((void-music (ly:music-property music 'void))) + (if (or (null? void-music) (not void-music)) + (collect-scores-for-book parser (scorify-music music parser))))) + (define-public (scorify-music music parser) + "Preprocess MUSIC." (for-each (lambda (func) (set! music (func music parser))) @@ -96,36 +78,15 @@ (ly:make-score music)) -(define-public (collect-music-for-book parser music) - ;; discard music if its 'void property is true. - (let ((void-music (ly:music-property music 'void))) - (if (or (null? void-music) (not void-music)) - (collect-scores-for-book parser (scorify-music music parser))))) - - -(define-public (print-book-with-defaults parser book) +(define (print-book-with parser book process-procedure) (let* ((paper (ly:parser-lookup parser '$defaultpaper)) (layout (ly:parser-lookup parser '$defaultlayout)) - (count (ly:parser-lookup parser 'output-count)) - (base (ly:parser-output-name parser))) - - (if (not (integer? count)) - (set! count 0)) - - (if (> count 0) - (set! base (format #f "~a-~a" base count))) - - (ly:parser-define! parser 'output-count (1+ count)) - (ly:book-process book paper layout base) - )) -(define-public (print-score-with-defaults parser score) - (let* - ((paper (ly:parser-lookup parser '$defaultpaper)) (count (ly:parser-lookup parser 'output-count)) (base (ly:parser-output-name parser))) + ;; must be careful: output-count is under user control. (if (not (integer? count)) (set! count 0)) @@ -133,36 +94,14 @@ (set! base (format #f "~a-~a" base count))) (ly:parser-define! parser 'output-count (1+ count)) + (process-procedure book paper layout base) + )) - (if (not (ly:score-error? score)) - (let* - ((header (ly:score-header score)) - (output-defs (ly:score-output-defs score)) - (layout-defs (filter (lambda (d) (eq? #t (ly:output-def-lookup d 'is-layout))) - output-defs)) - (midi-defs (filter (lambda (d) (eq? #t (ly:output-def-lookup d 'is-midi))) - output-defs)) - (music (ly:score-music score)) - (layout-def (if (null? layout-defs) - (ly:parser-lookup parser '$defaultlayout) - (car layout-defs)))) - - (if (not (module? header)) - (set! header (ly:parser-lookup parser '$defaultheader))) - - (ly:render-music-as-systems - music layout-def paper header base) - - (if (pair? midi-defs) - (ly:performance-write (ly:format-output (ly:run-translator music (car midi-defs))) - (format #f "~a.midi" base) - )) - - )))) - - - +(define-public (print-book-with-defaults parser book) + (print-book-with parser book ly:book-process)) +(define-public (print-book-with-defaults-as-systems parser book) + (print-book-with parser book ly:book-process-to-systems)) ;;;;;;;;;;;;;;;; ;; alist @@ -249,24 +188,9 @@ found." ;;;;;;;;;;;;;;;; ;; hash -(if (not (defined? 'hash-table?)) ;; guile 1.6 compat - (begin - (define hash-table? vector?) - (define-public (hash-for-each proc tab) - (hash-fold (lambda (k v prior) - (proc k v) - #f) - #f - tab)) - (define-public (hash-table->alist t) - "Convert table t to list" - (apply append (vector->list t)))) - - ;; native hashtabs. - (begin - (define-public (hash-table->alist t) - (hash-fold (lambda (k v acc) (acons k v acc)) - '() t)))) +(define-public (hash-table->alist t) + (hash-fold (lambda (k v acc) (acons k v acc)) + '() t)) ;; todo: code dup with C++. (define-safe-public (alist->hash-table lst) @@ -456,6 +380,9 @@ found." (define-public interval-end cdr) +(define-public (interval-bound interval dir) + ((if (= dir RIGHT) cdr car) interval)) + (define-public (interval-index interval dir) "Interpolate INTERVAL between between left (DIR=-1) and right (DIR=+1)" @@ -499,9 +426,16 @@ found." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; - +;; string +(define-public (string-endswith s suffix) + (equal? suffix (substring s + (max 0 (- (string-length s) (string-length suffix))) + (string-length s)))) + +(define-public (string-startswith s prefix) + (equal? prefix (substring s 0 (min (string-length s) (string-length prefix))))) + (define-public (string-encode-integer i) (cond ((= i 0) "o") @@ -592,6 +526,12 @@ possibly turned off." 0 (if (< x 0) -1 1))) +(define-public (round2 num) + (/ (round (* 100 num)) 100)) + +(define-public (round4 num) + (/ (round (* 10000 num)) 10000)) + (define-public (car< a b) (< (car a) (car b))) (define-public (symbol ;;;; Han-Wen Nienhuys +;; Internationalisation: (_i "to be translated") gets an entry in the +;; POT file (gettext ) must be invoked explicitely to do the actual +;; "translation". +;;(define-macro (_i x) x) +;;(define-macro-public _i (x) x) +;;(define-public-macro _i (x) x) +;; Abbrv-PWR! +(defmacro-public _i (x) x) + +(read-enable 'positions) +(debug-enable 'debug) + (define (define-scheme-options) (for-each (lambda (x) @@ -21,31 +33,29 @@ (check-internal-types #f "check every property assignment for types") (clip-systems #f "Generate cut-out snippets of a score") (debug-gc #f "dump memory debugging statistics") - (debug-gc-assert-parsed-dead - #f "for memory debugging: ensure that all refs to parsed objects are dead.") + (debug-gc-assert-parsed-dead #f "for memory debugging: +ensure that all refs to parsed objects are dead. This is an internal option, and is switched on automatically for -ddebug-gc.") (debug-lexer #f "debug the flex lexer") - (debug-midi #f "generate human readable MIDI") (debug-parser #f "debug the bison parser") (debug-skylines #f "debug skylines") (delete-intermediate-files #f "delete unusable PostScript files") - (dump-signatures #f "dump output signatures of each system") - (dump-tweaks #f "dump page layout and tweaks for each score having the tweak-key layout property set.") + (dump-profile #f "dump timing information for each file") + (dump-signatures #f "dump output signatures of each system. Used for regression testing.") + + (eps-box-padding #f "Pad EPS bounding box left edge. Guarantee alignment between systems in LaTeX.") (gs-load-fonts #f "load fonts via Ghostscript.") + (gui #f "running from gui; redirect stderr to log file") + (include-book-title-preview #t "include book-titles in preview images.") (include-eps-fonts #t "Include fonts in separate-system EPS files.") (job-count #f "Process in parallel") - - (eps-box-padding #f "Pad EPS bounding box left edge by this much to guarantee alignment between systems") - - (gui #f "running from gui; redirect stderr to log file") (log-file #f "redirect output to log FILE.log") + (old-relative #f "relative for simultaneous music works similar to chord syntax") - (object-keys #f - "experimental mechanism for remembering tweaks") (point-and-click #t "use point & click") (paper-size "a4" "the default paper size") (pixmap-format "png16m" "GS format to use for pixel images") @@ -58,16 +68,21 @@ on errors, and print a stack trace.") (read-file-list #f "Read files to be processed from command line arguments") (safe #f "Run safely") - (strict-infinity-checking #f "If yes, crash on encountering Inf/NaN") - + (strict-infinity-checking #f "If yes, crash on encountering Inf/NaN.") + (separate-log-files #f "Output to FILE.log per file.") + (trace-memory-frequency #f "Record Scheme cell usage this many times per second, and dump to file.") + (trace-scheme-coverage #f "Record coverage of Scheme files") (ttf-verbosity 0 "how much verbosity for TTF font embedding?") - (show-available-fonts #f - "List font names available.") - + "List font names available.") (verbose ,(ly:command-line-verbose?) "value for the --verbose flag") - ))) + )) + + (map + (lambda (x) + (ly:set-option (car x) (cdr x))) + (eval-string (ly:command-line-options)))) ;; need to do this in the beginning. Other parts of the @@ -75,6 +90,8 @@ on errors, and print a stack trace.") ;; (define-scheme-options) + + (debug-set! stack 0) (if (defined? 'set-debug-cell-accesses!) @@ -84,18 +101,20 @@ on errors, and print a stack trace.") (use-modules (ice-9 regex) (ice-9 safe) + (ice-9 rdelim) (ice-9 optargs) (oop goops) (srfi srfi-1) (srfi srfi-13) (srfi srfi-14) (scm clip-region) - + (scm memory-trace) + (scm coverage) ) - ;; my display -(define-public (myd k v) (display k) (display ": ") (display v) (display ", ")) +(define-public (myd k v) (display k) (display ": ") (display v) (display ", ") + v) (define-public (print . args) (apply format (cons (current-output-port) args))) @@ -105,13 +124,20 @@ on errors, and print a stack trace.") ;;; debugging evaluator is slower. This should ;;; have a more sensible default. -(if (ly:get-option 'verbose) +(if (or (ly:get-option 'verbose) + (ly:get-option 'trace-memory-frequencency) + (ly:get-option 'trace-scheme-coverage) + ) (begin (ly:set-option 'protected-scheme-parsing #f) (debug-enable 'debug) (debug-enable 'backtrace) (read-enable 'positions))) + +(if (ly:get-option 'trace-scheme-coverage) + (coverage:enable)) + (define-public tex-backend? (member (ly:output-backend) '("texstr" "tex"))) @@ -261,9 +287,10 @@ The syntax is the same as `define*-public'." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; other files. -(for-each ly:load - ;; load-from-path - '("lily-library.scm" + +(define + init-scheme-files + '("lily-library.scm" "file-cache.scm" "define-event-classes.scm" "define-music-types.scm" @@ -310,6 +337,11 @@ The syntax is the same as `define*-public'." "safe-lily.scm")) + + +(for-each ly:load init-scheme-files) + + (set! type-p-name-alist `( (,boolean-or-symbol? . "boolean or symbol") @@ -348,12 +380,48 @@ The syntax is the same as `define*-public'." (,symbol? . "symbol") (,vector? . "vector"))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; timing + +(define (profile-measurements) + (let* ((t (times)) + (stats (gc-stats))) + + (list + (- (+ (tms:cutime t) + (tms:utime t)) + (ly:assoc-get 'gc-time-taken stats)) + + (ly:assoc-get 'total-cells-allocated stats 0) + ))) + +(define (dump-profile base last this) + (let* + ((outname (format "~a.profile" (basename base ".ly"))) + (diff (map (lambda (y) (apply - y)) (zip this last)))) + + (ly:progress "\nWriting timing to ~a..." outname) + (format (open-file outname "w") + "time: ~a\ncells: ~a\n" + (car diff) + (cadr diff) + ))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; debug mem leaks (define gc-dumping #f) (define gc-protect-stat-count 0) + +(define-public (dump-live-object-stats outfile) + (for-each + (lambda (x) + (format outfile "~a: ~a\n" (car x) (cdr x))) + (sort (gc-live-object-stats) + (lambda (x y) + (stringnumber (match:substring (car interesting) 1))) + ) + + + (display (format "VMDATA: ~a\n" mem)) + (display (gc-stats)) + (if (> mem 100000) + (begin + (dump-gc-protects) + (raise 1))) )) @@ -450,11 +542,13 @@ The syntax is the same as `define*-public'." (define-public (lilypond-main files) "Entry point for LilyPond." - + (define (no-files-handler) (ly:usage) (exit 2)) + (eval-string (ly:command-line-code)) + (if (ly:get-option 'gui) (gui-main files)) @@ -471,7 +565,7 @@ The syntax is the same as `define*-public'." )) (if (and (number? (ly:get-option 'job-count)) - (> (length files) (ly:get-option 'job-count))) + (>= (length files) (ly:get-option 'job-count))) (let* ((count (ly:get-option 'job-count)) @@ -493,33 +587,51 @@ The syntax is the same as `define*-public'." (for-each (lambda (pid) (let* ((stat (cdr (waitpid pid)))) - + (if (not (= stat 0)) - (set! errors (cons (list-element-index joblist pid) errors))))) + (set! errors (acons (list-element-index joblist pid) stat errors))))) joblist) (for-each (lambda (x) - (let* ((logfile (format "~a-~a.log" - (ly:get-option 'log-file) x)) + (let* ((job (car x)) + (state (cdr x)) + (logfile (format "~a-~a.log" + (ly:get-option 'log-file) job)) (log (ly:gulp-file logfile)) (len (string-length log)) (tail (substring log (max 0 (- len 1024))))) - (display (format "\n\nlogfile ~a:\n\n ~a" logfile tail)))) + (if (status:term-sig state) + (ly:message "\n\n~a\n" + (format (_ "job ~a terminated with signal: ~a") + job + (status:term-sig state))) + (ly:message (_ "logfile ~a (exit ~a):\n~a") logfile (status:exit-val state) tail)))) errors) (if (pair? errors) - (ly:error "Children ~a exited with errors." errors)) + (ly:error "Children ~a exited with errors." (map car errors))) + + ;; must overwrite individual entries + (if (ly:get-option 'dump-profile) + (dump-profile "lily-run-total" '(0 0) (profile-measurements))) (exit (if (null? errors) 0 1)))))) (if (string-or-symbol? (ly:get-option 'log-file)) (ly:stderr-redirect (format "~a.log" (ly:get-option 'log-file)) "w")) + (let ((failed (lilypond-all files))) + (if (ly:get-option 'trace-scheme-coverage) + (begin + (coverage:show-all (lambda (f) (string-contains f "lilypond")) + ))) + + (if (pair? failed) (begin (ly:error (_ "failed files: ~S") (string-join failed)) @@ -530,7 +642,7 @@ The syntax is the same as `define*-public'." (exit 0))))) (define-public (lilypond-all files) - + (if (ly:get-option 'show-available-fonts) (begin @@ -539,26 +651,63 @@ The syntax is the same as `define*-public'." )) (let* ((failed '()) - (first #t) + (separate-logs (ly:get-option 'separate-log-files)) + (do-measurements (ly:get-option 'dump-profile)) (handler (lambda (key failed-file) (set! failed (append (list failed-file) failed))))) + (gc) (for-each (lambda (x) - - ;; We don't carry info across file boundaries - (if first - (set! first #f) - (gc)) - - (lilypond-file handler x) - (ly:clear-anonymous-modules) - (if (ly:get-option 'debug-gc) - (dump-gc-protects) - (if (= (random 40) 1) - (ly:reset-all-fonts)))) + (let* + ((start-measurements (if do-measurements + (profile-measurements) + #f)) + (base (basename x ".ly")) + (all-settings (ly:all-options))) + + (if separate-logs + (ly:stderr-redirect (format "~a.log" base) "w")) + (if (ly:get-option 'trace-memory-frequency) + (mtrace:start-trace (ly:get-option 'trace-memory-frequency))) + + (lilypond-file handler x) + (if start-measurements + (dump-profile x start-measurements (profile-measurements))) + + (if (ly:get-option 'trace-memory-frequency) + (begin + (mtrace:stop-trace) + (mtrace:dump-results base))) + + (for-each + (lambda (s) + (ly:set-option (car s) (cdr s))) + all-settings) + + (ly:clear-anonymous-modules) + (ly:set-option 'debug-gc-assert-parsed-dead #t) + (gc) + (ly:set-option 'debug-gc-assert-parsed-dead #f) + + + (if (ly:get-option 'debug-gc) + (dump-gc-protects) + (if (= (random 40) 1) + (ly:reset-all-fonts))))) files) + + ;; we want the failed-files notice in the aggregrate logfile. + (if (ly:get-option 'separate-logs) + (ly:stderr-redirect + (if (string-or-symbol? (ly:get-option 'log-file)) + (format "~a.log" (ly:get-option 'log-file)) + "/dev/tty") "a")) + + (if (ly:get-option 'dump-profile) + (dump-profile "lily-run-total" '(0 0) (profile-measurements))) + failed)) (define (lilypond-file handler file-name) diff --git a/scm/markup.scm b/scm/markup.scm index bd20798e91..5efe02732a 100644 --- a/scm/markup.scm +++ b/scm/markup.scm @@ -20,7 +20,9 @@ The function should return a stencil (i.e. a formatted, ready to print object). -To add a function, use the define-markup-command utility. +To add a builtin markup command, use the define-builtin-markup-command +utility. In a user file, the define-markup-command macro shall be used +(see ly/markup-init.ly). (define-markup-command (mycommand layout prop arg1 ...) (arg1-type? ...) \"my command usage and description\" @@ -28,7 +30,6 @@ To add a function, use the define-markup-command utility. The command is now available in markup mode, e.g. - \\markup { .... \\MYCOMMAND #1 argument ... } " ; " @@ -36,34 +37,8 @@ The command is now available in markup mode, e.g. ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; markup definer utilities -(defmacro-public in-module-define-variable (module-name symbol value) - "Define a variable in a module and export its name. - (in-module-define-variable (some module) symbol value)" - (let ((gmodule (gensym "module"))) - `(let ((,gmodule (resolve-module ',module-name))) - (module-define! ,gmodule ',symbol ,value) - (module-export! ,gmodule '(,symbol))))) - -(defmacro-public in-module-define-function - (module-name function-name+arg-list . body) - "Define a public function in a module: - (in-module-define-function (some module) (function-name . args) - ..body..)" - `(in-module-define-variable - ,module-name - ,(car function-name+arg-list) - (let ((proc (lambda ,(cdr function-name+arg-list) - ,@body))) - (set-procedure-property! proc - 'name - ',(car function-name+arg-list)) - proc))) - -;;; `define-markup-command' can be used both for built-in markup -;;; definitions and user defined markups. -(defmacro-public define-markup-command (command-and-args signature . body) +(define-macro (define-builtin-markup-command command-and-args signature . body) " - * Define a COMMAND-markup function after command-and-args and body, register COMMAND-markup and its signature, @@ -74,40 +49,36 @@ register COMMAND-markup and its signature, * define a make-COMMAND-markup function. Syntax: - (define-markup-command (COMMAND layout props arg1 arg2 ...) (arg1-type? arg2-type? ...) + (define-builtin-markup-command (COMMAND layout props arg1 arg2 ...) + (arg1-type? arg2-type? ...) \"documentation string\" ...command body...) -or: - (define-markup-command COMMAND (arg1-type? arg2-type? ...) function) + or: + (define-builtin-markup-command COMMAND (arg1-type? arg2-type? ...) + function) " - (let* ((command (if (pair? command-and-args) - (car command-and-args) - command-and-args)) + (let* ((command (if (pair? command-and-args) (car command-and-args) command-and-args)) + (args (if (pair? command-and-args) (cdr command-and-args) '())) (command-name (string->symbol (format #f "~a-markup" command))) (make-markup-name (string->symbol (format #f "make-~a-markup" command)))) - `(let ((lily-module (resolve-module '(lily)))) - ;; define the COMMAND-markup procedure in (lily) module - ,(if (pair? command-and-args) - ;; two cases: - ;; 1/ (define (COMMAND-markup layout props arg1 arg2 ...) - ;; ..command body)) - `(in-module-define-function (lily) (,command-name ,@(cdr command-and-args)) + `(begin + ;; define the COMMAND-markup function + ,(if (pair? args) + `(define-public (,command-name ,@args) ,@body) - ;; 2/ (define COMMAND-markup function) - `(in-module-define-variable (lily) ,command-name ,(car body))) - (let ((command-proc (module-ref lily-module ',command-name))) - ;; register its command signature - (set! (markup-command-signature command-proc) - (list ,@signature)) - ;; add the COMMAND-markup procedure to the list of markup functions - (if (not (member command-proc markup-function-list)) - (set! markup-function-list (cons command-proc markup-function-list))) - ;; define the make-COMMAND-markup procedure in (lily) module - (in-module-define-function (lily) (,make-markup-name . args) - (make-markup command-proc - ,(symbol->string make-markup-name) - (list ,@signature) - args)))))) + (let ((args (gensym "args")) + (markup-command (car body))) + `(define-public (,command-name . ,args) + ,(format #f "Copy of the ~a command" markup-command) + (apply ,markup-command ,args)))) + (set! (markup-command-signature ,command-name) (list ,@signature)) + ;; add the command to markup-function-list, for markup documentation + (if (not (member ,command-name markup-function-list)) + (set! markup-function-list (cons ,command-name markup-function-list))) + ;; define the make-COMMAND-markup function + (define-public (,make-markup-name . args) + (let ((sig (list ,@signature))) + (make-markup ,command-name ,(symbol->string make-markup-name) sig args)))))) (define-public (make-markup markup-function make-name signature args) " Construct a markup object from MARKUP-FUNCTION and ARGS. Typecheck @@ -141,22 +112,21 @@ against SIGNATURE, reporting MAKE-NAME as the user-invoked function. "The `markup' macro provides a lilypond-like syntax for building markups. - #:COMMAND is used instead of \\COMMAND - - #:lines ( ... ) is used instead of { ... } - - #:center-align ( ... ) is used instead of \\center-align < ... > + - #:line ( ... ) is used instead of \\line { ... } - etc. Example: \\markup { foo \\raise #0.2 \\hbracket \\bold bar \\override #'(baseline-skip . 4) - \\bracket \\column < baz bazr bla > + \\bracket \\column { baz bazr bla } } <==> (markup \"foo\" #:raise 0.2 #:hbracket #:bold \"bar\" #:override '(baseline-skip . 4) #:bracket #:column (\"baz\" \"bazr\" \"bla\")) -Use `markup*' in a \\notes block." +Use `markup*' in a \\notemode context." (car (compile-all-markup-expressions `(#:line ,body)))) @@ -269,44 +239,28 @@ Use `markup*' in a \\notes block." ;;; (markup-command-keyword raise-markup) ==> "scheme0-markup1" ;;; -(define markup-command-signatures (make-hash-table 50)) +(define-public (markup-command-keyword markup-command) + "Return markup-command's argument keyword, ie a string describing the command + arguments, eg. \"scheme0markup1\"" + (object-property markup-command 'markup-keyword)) -(define (markup-command-signature-ref markup-command) - "Return markup-command's signature, e.g. (number? markup?). -markup-command may be a procedure." - (let ((sig-key (hashq-ref markup-command-signatures - markup-command))) - (if sig-key (car sig-key) #f))) +(define-public (markup-command-signature-ref markup-command) + "Return markup-command's signature (the 'markup-signature object property)" + (object-property markup-command 'markup-signature)) -(define-public (markup-command-keyword markup-command) - "Return markup-command's keyword, e.g. \"scheme0markup1\". -markup-command may be a procedure." - (let ((sig-key (hashq-ref markup-command-signatures - markup-command))) - (if sig-key (cdr sig-key) #f))) - -(define (markup-command-signatureset! markup-command signature) - "Set markup-command's signature. markup-command must be a named procedure. -Also set markup-signature and markup-keyword object properties." - (hashq-set! markup-command-signatures - markup-command - (cons signature (markup-signature-to-keyword signature))) - ;; these object properties are still in use somewhere +(define-public (markup-command-signature-set! markup-command signature) + "Set markup-command's signature and keyword (as object properties)" (set-object-property! markup-command 'markup-signature signature) - (set-object-property! markup-command 'markup-keyword (markup-signature-to-keyword signature))) - -(define-public markup-command-signature - (make-procedure-with-setter markup-command-signature-ref markup-command-signatureset!)) + (set-object-property! markup-command 'markup-keyword + (markup-signature-to-keyword signature)) + signature) -(define (markup-symbol-to-proc markup-sym) - "Return the markup command procedure which name is `markup-sym', if any." - (hash-fold (lambda (key val prev) - (or prev - (if (eqv? (procedure-name key) markup-sym) key #f))) - #f - markup-command-signatures)) +(define-public markup-command-signature + (make-procedure-with-setter markup-command-signature-ref + markup-command-signature-set!)) -(define-public markup-function-list '()) +;; For documentation purposes +(define-public markup-function-list (list)) (define-public (markup-signature-to-keyword sig) " (A B C) -> a0-b1-c2 " @@ -329,8 +283,13 @@ Also set markup-signature and markup-keyword object properties." "-")))) (define-public (lookup-markup-command code) - (let ((proc (markup-symbol-to-proc (string->symbol (string-append code "-markup"))))) - (and proc (cons proc (markup-command-keyword proc))))) + (let ((proc (catch 'misc-error + (lambda () + (module-ref (current-module) + (string->symbol (format #f "~a-markup" code)))) + (lambda (key . args) #f)))) + (and (procedure? proc) + (cons proc (markup-command-keyword proc))))) ;;;;;;;;;;;;;;;;;;;;;; ;;; used in parser.yy to map a list of markup commands on markup arguments @@ -391,9 +350,14 @@ eg: ((italic) (raise 4) (bold)), maps the commands on each markup argument, eg: (cdr arg))))) ;; -;; typecheck, and throw an error when something amiss. +;; +;; ;; (define (markup-thrower-typecheck arg) + "typecheck, and throw an error when something amiss. + +Uncovered - cheap-markup? is used." + (cond ((string? arg) #t) ((not (pair? arg)) (throw 'markup-format "Not a pair" arg)) diff --git a/scm/memory-trace.scm b/scm/memory-trace.scm new file mode 100644 index 0000000000..0b636377cc --- /dev/null +++ b/scm/memory-trace.scm @@ -0,0 +1,157 @@ +(define-module (scm memory-trace)) +(use-modules (lily) + (ice-9 format)) + +(define-public (mtrace:start-trace freq) + (set! usecond-interval (inexact->exact (/ 1000000 freq))) + (call-with-new-thread start-install-tracepoint)) + +(define-public (mtrace:stop-trace) + (set! continue-tracing #f)) + +(define-public mtrace:trace-depth 12) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define trace-points '()) +(define continue-tracing #t) +(define busy-tracing #f) +(define trace-thread #f) +(define start-time 0) +(define start-memory 0) + +(define trace-count 0) +(define usecond-interval 100000) +(define (arg-procedure args) + (if (and (pair? args) + (pair? (cdr args)) + (pair? (cadr args))) + (caadr args) #f)) +(define last-count 0) +(define (record-stack key continuation . args) + (if (eq? (current-thread) trace-thread) + #t ;; do nothing. + (let* + ((cells (cdr (assoc 'total-cells-allocated (gc-stats)))) + (proc (arg-procedure args)) + (time (tms:utime (times))) + (stack (extract-trace continuation))) + + (set! busy-tracing #t) + (trap-disable 'traps) + (trap-disable 'enter-frame) + + (set! trace-count (1+ trace-count)) + (ly:progress "<~a: ~a/~a>\n" + trace-count + (- time start-time) + (- cells last-count)) + + (set! last-count cells) + (set! trace-points + (cons (list + (cons 'cells cells) + (cons 'proc proc) + (cons 'stack stack) + (cons 'time time) + ) + + trace-points)) + + (set! busy-tracing #f)))) + +(define (start-install-tracepoint) + (set! trace-thread (current-thread)) + (set! trace-points '()) + (set! continue-tracing #t) + (set! trace-count 0) + (set! start-memory (cdr (assoc 'total-cells-allocated (gc-stats)))) + (set! start-time (tms:utime (times))) + + (install-tracepoint)) + +(define (install-tracepoint) + (if busy-tracing + (display "last trace not finished yet\n" (current-error-port)) + (begin + (trap-set! enter-frame-handler record-stack) + (trap-enable 'enter-frame) + (trap-enable 'traps))) + + (usleep usecond-interval) + (if continue-tracing + (install-tracepoint))) + +(define-public (mtrace:dump-results base) + (let* + ((stacks-name (format #f "~a.stacks" base)) + (graph-name (format #f "~a.graph" base)) + (graph-out (open-output-file graph-name)) + (stacks-out (open-output-file stacks-name)) + (i 0) + (last-mem 0) + ) + + (ly:progress "Memory statistics to ~a and ~a..." + stacks-name graph-name) + (format graph-out "# memory trace with ~a points\n" (length trace-points)) + (for-each + (lambda (r) + (let* + ((mem (- (cdr (assoc 'cells r)) start-memory)) + (proc (cdr (assoc 'proc r))) + (stack (cdr (assoc 'stack r))) + (time (- (cdr (assoc 'time r)) start-time))) + + (format graph-out "~a ~a\n" time mem) + (if stack + (begin + (format stacks-out "~5a t = ~5a - delta-mem: ~15a - ~a \n" i + time + (- mem last-mem) proc) + (do + ((j 0 (1+ j)) + (stack (cdr (assoc 'stack r)) stack)) + ((>= j (vector-length stack))) + + (format stacks-out "\t~a\n" + (vector-ref stack j))))) + + (set! i (1+ i)) + (set! last-mem mem) + )) + (reverse trace-points)))) + + +(define (test-graph . rest) + (mtrace:start-trace 100) + (iota 100000) + (mtrace:stop-trace) + (mtrace:dump-results "test")) + + + +(define (extract-trace continuation) + (let* + ((stack (make-stack continuation)) + (depth (min (stack-length stack) mtrace:trace-depth)) + (trace (make-vector depth #f))) + + (do + ((i 0 (1+ i))) + ((>= i depth)) + + (vector-set! + trace i + (let* + ((source (frame-source (stack-ref stack i)))) + + (and source + (cons (source-property source 'filename) + (source-property source 'line)))))) + + trace)) + + + + diff --git a/scm/music-functions.scm b/scm/music-functions.scm index 189f960ff6..049f27ea3a 100644 --- a/scm/music-functions.scm +++ b/scm/music-functions.scm @@ -186,6 +186,21 @@ Returns `obj'. (newline) obj) +;;; +;;; Scheme music expression --> Lily-syntax-using string translator +;;; +(use-modules (srfi srfi-39) + (scm display-lily)) + +(define*-public (display-lily-music expr parser #:key force-duration) + "Display the music expression using LilyPond syntax" + (memoize-clef-names supported-clefs) + (parameterize ((*indent* 0) + (*previous-duration* (ly:make-duration 2)) + (*force-duration* force-duration)) + (display (music->lily-string expr parser)) + (newline))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-public (shift-one-duration-log music shift dot) @@ -228,10 +243,15 @@ Returns `obj'. (if (memq 'sequential-music (ly:music-property main 'types)) ;; \repeat "tremolo" { c4 d4 } (let ((children (length (ly:music-property main 'elements)))) - (if (not (= children 2)) + + ;; fixme: should be more generic. + (if (and (not (= children 2)) + (not (= children 1))) (ly:warning (_ "expecting 2 elements for chord tremolo, found ~a") children)) (ly:music-compress r (ly:make-moment 1 children)) - (shift-duration-log r (1- shift) dots)) + (shift-duration-log r + (if (= children 2) (1- shift) shift) + dots)) ;; \repeat "tremolo" c4 (shift-duration-log r shift dots))) r))) @@ -410,23 +430,26 @@ i.e. this is not an override" old middleCPosition, add OCTAVATION to middleCPosition, and set OTTAVATION to `8va', or whatever appropriate." (if (number? (ly:context-property context 'middleCPosition)) - (if (= octavation 0) - (let ((where (ly:context-property-where-defined context 'middleCPosition)) - (oc0 (ly:context-property context 'originalCentralCPosition))) - (ly:context-set-property! context 'middleCPosition oc0) - (ly:context-unset-property where 'originalCentralCPosition) - (ly:context-unset-property where 'ottavation)) - (let* ((where (ly:context-property-where-defined context 'middleCPosition)) - (c0 (ly:context-property context 'middleCPosition)) - (new-c0 (+ c0 (* -7 octavation))) - (string (cdr (assoc octavation '((2 . "15ma") - (1 . "8va") - (0 . #f) - (-1 . "8vb") - (-2 . "15mb")))))) - (ly:context-set-property! context 'middleCPosition new-c0) - (ly:context-set-property! context 'originalCentralCPosition c0) - (ly:context-set-property! context 'ottavation string))))) + (begin + (if (number? (ly:context-property context 'originalMiddleCPosition)) + (let ((where (ly:context-property-where-defined context 'middleCPosition))) + + (ly:context-set-property! context 'middleCPosition + (ly:context-property context 'originalMiddleCPosition)) + (ly:context-unset-property where 'originalMiddleCPosition) + (ly:context-unset-property where 'ottavation))) +ot + (let* ((where (ly:context-property-where-defined context 'middleCPosition)) + (c0 (ly:context-property context 'middleCPosition)) + (new-c0 (+ c0 (* -7 octavation))) + (string (cdr (assoc octavation '((2 . "15ma") + (1 . "8va") + (0 . #f) + (-1 . "8vb") + (-2 . "15mb")))))) + (ly:context-set-property! context 'middleCPosition new-c0) + (ly:context-set-property! context 'originalMiddleCPosition c0) + (ly:context-set-property! context 'ottavation string))))) (set! (ly:music-property m 'procedure) ottava-modify) (context-spec-music m 'Staff))) @@ -491,9 +514,9 @@ of beat groupings " 'duration duration 'text string)) -(define-safe-public (make-span-event type spandir) +(define-safe-public (make-span-event type span-dir) (make-music type - 'span-direction spandir)) + 'span-direction span-dir)) (define-public (set-mus-properties! m alist) "Set all of ALIST as properties of M." @@ -605,11 +628,6 @@ SkipEvent. Useful for extracting parts from crowded scores" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; warn for bare chords at start. -(define (has-request-chord elts) - (reduce (lambda (x y) (or x y)) #f - (map (lambda (x) - (equal? (ly:music-property x 'name) 'RequestChord)) - elts))) (define-public (ly:music-message music msg) (let ((ip (ly:music-property music 'origin))) @@ -617,25 +635,6 @@ SkipEvent. Useful for extracting parts from crowded scores" (ly:input-message ip msg) (ly:warning msg)))) -(define (check-start-chords music) - "Check music expression for a Simultaneous_music containing notes\n(ie. Request_chords), -without context specification. Called from parser." - (let ((es (ly:music-property music 'elements)) - (e (ly:music-property music 'element)) - (name (ly:music-property music 'name))) - (cond ((equal? name "Context_specced_music") #t) - ((equal? name "Simultaneous_music") - (if (has-request-chord es) - (ly:music-message music "Starting score with a chord.\nInsert an explicit \\context before chord") - (map check-start-chords es))) - ((equal? name "SequentialMusic") - (if (pair? es) - (check-start-chords (car es)))) - (else (if (ly:music? e) (check-start-chords e))))) - music) - - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; setting stuff for grace context. @@ -745,7 +744,7 @@ Syntax: (set! (ly:music-property music 'quoted-events) quoted-vector) (set! (ly:music-property music 'iterator-ctor) ly:quote-iterator::constructor)) - (ly:warning (_ "cannot find quoted music: `~S'" quoted-name)))) + (ly:warning (_ "cannot find quoted music: `~S'") quoted-name))) music)) diff --git a/scm/output-gnome.scm b/scm/output-gnome.scm index ccb6d9d04b..e69de29bb2 100644 --- a/scm/output-gnome.scm +++ b/scm/output-gnome.scm @@ -1,339 +0,0 @@ -;;;; output-gnome.scm -- implement GNOME canvas output -;;;; -;;;; source file of the GNU LilyPond music typesetter -;;;; -;;;; (c) 2004--2006 Jan Nieuwenhuizen - -;;;; TODO: -;;;; -;;;; * .cff MUST NOT be in fc's fontpath. -;;;; - workaround: remove mf/out from ~/.fonts.conf, -;;;; instead add ~/.fonts and symlink all /mf/out/*otf there. -;;;; - bug in fontconfig/freetype/pango? - -;;; * check: blot+scaling -;;; * Figure out and fix font scaling and character placement -;;; * EC font package: add missing X font directories and AFMs -;;; * User-interface, keybindings -;;; * Implement missing stencil functions -;;; * Implement missing commands -;;; * More information in stencils, e.g., location and grob tag. -;;; * Embedded Lily: -;;; - allow GnomeCanvas or `toplevel' GtkWindow to be created -;;; outside of LilyPond -;;; - lilylib. -;;; * Release schedule and packaging of dependencies. -;;; - g-wrap-1.9.3 is already in incoming. -;;; - guile-gnome-platform-2.8.0 will probably be packaged early 2005. - -;;; You need: -;;; -;;; * Rotty's g-wrap >= 1.9.3 -;;; * guile-gnome-platform >= 2.7.97 -;;; * pango >= 1.6.0 -;;; -;;; See also: guile-gtk-general@gnu.org - -;;; Try it -;;; -;;; * Install gnome/gtk and libffi development stuff -;;; -;;; * Install [pango, g-wrap and] guile-gnome from source, -;;; see buildscripts/guile-gnome.sh -;;; -;;; * Build LilyPond with gui support: configure --enable-gui -;;; -;;; * Supposing that LilyPond was built in ~/cvs/savannah/lilypond, -;;; tell fontconfig about the feta fonts dir and run fc-cache -" -cat > ~/.fonts.conf << EOF - -

~/cvs/savannah/lilypond/mf/out -/usr/share/texmf/fonts/type1/public/ec-fonts-mftraced - -EOF -fc-cache -" -;;; or copy all your .pfa/.pfb's to ~/.fonts if your fontconfig -;;; already looks there for fonts. Check if it works by doing: -" -fc-list | grep -i lily -" -;;; -;;; * Setup environment -" -export GUILE_LOAD_PATH=$HOME/usr/pkg/g-wrap/share/guile/site:$HOME/usr/pkg/g-wrap/share/guile/site/g-wrap:$HOME/usr/pkg/guile-gnome/share/guile:$GUILE_LOAD_PATH -export LD_LIBRARY_PATH=$HOME/usr/pkg/pango/lib:$HOME/usr/pkg/g-wrap/lib:$HOME/usr/pkg/guile-gnome/lib:$LD_LIBRARY_PATH -export XEDITOR='/usr/bin/emacsclient --no-wait +%l:%c %f' -" -;;; * Also for GNOME point-and-click, you need to set XEDITOR and add -" -#(ly:set-point-and-click 'line-column) -" -;;; to your .ly. -;;; -;;; * Run lily: -" -lilypond -fgnome input/simple-song.ly -" -;;; point-and-click: (mouse-1) click on a graphical object; -;;; grob-property-list: (mouse-3) click on a graphical object. - -(define-module (scm output-gnome)) -(define this-module (current-module)) - -(use-modules - (guile) - (ice-9 regex) - (srfi srfi-13) - (lily) - (gnome gtk) - (gnome gw canvas)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; globals - -;;; set by framework-gnome.scm -(define canvas-root #f) -(define output-scale #f) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; helper functions - -(define (utf-8 i) - (cond - ((< i #x80) (list (integer->char i))) - ((< i #x800) (map integer->char - (list (+ #xc0 (quotient i #x40)) - (+ #x80 (modulo i #x40))))) - ((< i #x10000) - (let ((x (quotient i #x1000)) - (y (modulo i #x1000))) - (map integer->char - (list (+ #xe0 x) - (+ #x80 (quotient y #x40)) - (+ #x80 (modulo y #x40)))))) - (else (begin (stderr "programming-error: utf-8 too big:~x\n" i) - (list (integer->char 32)))))) - -(define (integer->utf-8-string integer) - (list->string (utf-8 integer))) - -(define (char->utf-8-string char) - (list->string (utf-8 (char->integer char)))) - -(define (string->utf-8-string string) - (apply - string-append - (map (lambda (x) (char->utf-8-string x)) (string->list string)))) - -(define (music-font? font) - (let ((family (car (font-name-style font)))) - (string=? (substring family 0 (min (string-length family) 10)) - "Emmentaler"))) - -;;; FONT may be font smob, or pango font string -(define (pango-font-name font) - (if (string? font) - (list font "Regular") - (apply format (append '(#f "~a, ~a") (font-name-style font))))) - -;;; FONT may be font smob, or pango font string -(define (canvas-font-size font) - ;; FIXME: 1.85? - (* 1.85 - (if (string? font) - 12 - (* output-scale (modified-font-metric-font-scaling font))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Wrappers from guile-gnome TLA -;;; guile-gnome-devel@gnu.org--2004 -;;; http://arch.gna.org/guile-gnome/archive-2004 -;;; -;;; janneke@gnu.org--2004-gnome -;;; http://lilypond.org/~janneke/{arch}/2004-gnome -;;; -(if (not (defined? ')) - (begin - (define-class () - (closure #:init-value (gnome-canvas-path-def-new) - #:init-keyword #:path-def - #:getter get-def #:setter set-def)) - - (define-method (moveto (this ) x y) - (gnome-canvas-path-def-moveto (get-def this) x y)) - (define-method (curveto (this ) x1 y1 x2 y2 x3 y3) - (gnome-canvas-path-def-curveto (get-def this) x1 y1 x2 y2 x3 y3)) - (define-method (lineto (this ) x y) - (gnome-canvas-path-def-lineto (get-def this) x y)) - (define-method (closepath (this )) - (gnome-canvas-path-def-closepath (get-def this))) - (define-method (reset (this )) - (gnome-canvas-path-def-reset (get-def this))) - - (define -set-path-def set-path-def) - (define -get-path-def get-path-def) - - (define-method (set-path-def (this ) - (def )) - (-set-path-def this (get-def def))) - - (define-method (get-path-def (this )) - (make #:path-def (-get-path-def this))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; stencil outputters -;;; - -;;; catch-all for missing stuff -;;; comment this out to see find out what functions you miss :-) -(define (dummy . foo) #f) -(map (lambda (x) (module-define! this-module x dummy)) - (append - (ly:all-stencil-expressions) - (ly:all-output-backend-commands))) - -;; two beziers -(define (bezier-sandwich lst thick) - (let* ((def (make )) - (bezier (make - #:parent (canvas-root) - #:fill-color "black" - #:outline-color "black" - #:width-units thick - #:join-style 'round))) - - (reset def) - - ;; FIXME: LST is pre-mangled for direct ps stack usage - ;; cl cr r l 0 1 2 3 - ;; cr cl l r 4 5 6 7 - - (moveto def (car (list-ref lst 3)) (- (cdr (list-ref lst 3)))) - (curveto def (car (list-ref lst 0)) (- (cdr (list-ref lst 0))) - (car (list-ref lst 1)) (- (cdr (list-ref lst 1))) - (car (list-ref lst 2)) (- (cdr (list-ref lst 2)))) - - (lineto def (car (list-ref lst 7)) (- (cdr (list-ref lst 7)))) - (curveto def (car (list-ref lst 4)) (- (cdr (list-ref lst 4))) - (car (list-ref lst 5)) (- (cdr (list-ref lst 5))) - (car (list-ref lst 6)) (- (cdr (list-ref lst 6)))) - (lineto def (car (list-ref lst 3)) (- (cdr (list-ref lst 3)))) - - (closepath def) - (set-path-def bezier def) - bezier)) - -(define (char font i) - (text font (ly:font-index-to-charcode font i))) - -(define (dashed-line thick on off dx dy) - (draw-line thick 0 0 dx dy)) - -(define (draw-line thick x1 y1 x2 y2) - (let* ((def (make )) - (props (make - #:parent (canvas-root) - #:fill-color "black" - #:outline-color "black" - #:width-units thick))) - (reset def) - (moveto def x1 (- y1)) - (lineto def x2 (- y2)) - (set-path-def props def) - props)) - - -;; FIXME: the framework-gnome backend needs to see every item that -;; gets created. All items created here must should be put in a group -;; that gets returned. -(define (glyph-string font postscript-font-name w-x-y-named-glyphs) - (for-each - (lambda (x) - - ;; UGR, glyph names not found - (stderr "GLYPH:~S\n" (caddr x)) - (stderr "ID:~S\n" (ly:font-glyph-name-to-charcode font (caddr x))) - (placebox (cadr x) (caddr x) - (make - #:parent (canvas-root) - ;;#:x 0.0 #:y (if (music-font? font) 0.15 0.69) - #:x 0.0 #:y 0.0 - #:anchor 'west - #:font (pango-font-name font) - #:size-points (canvas-font-size font) - #:size-set #t - #:text - (integer->utf-8-string - (ly:font-glyph-name-to-charcode font (cadddr x)))))) - w-x-y-named-glyphs)) - -(define (grob-cause offset grob) - grob) - - -(define (named-glyph font name) - (text font (ly:font-glyph-name-to-charcode font name))) - -(define (placebox x y expr) - (let ((item expr)) - ;;(if item - ;; FIXME ugly hack to skip #unspecified ... - (if (and item (not (eq? item (if #f #f)))) - (begin - (move item (* output-scale x) (* output-scale (- y))) - (affine-relative item output-scale 0 0 output-scale 0 0) - item) - #f))) - -(define (polygon coords blot-diameter) - (let* ((def (make )) - (props (make - #:parent (canvas-root) - #:fill-color "black" - #:outline-color "black" - #:join-style 'round) - #:width-units blot-diameter) - (points (ly:list->offsets '() coords)) - (last-point (car (last-pair points)))) - - (reset def) - (moveto def (car last-point) (cdr last-point)) - (for-each (lambda (x) (lineto def (car x) (cdr x))) points) - (closepath def) - (set-path-def props def) - props)) - -(define (round-filled-box breapth width depth height blot-diameter) - (let ((r (/ blot-diameter 2))) - (make - #:parent (canvas-root) - #:x1 (- r breapth) #:y1 (- depth r) #:x2 (- width r) #:y2 (- r height) - #:fill-color "black" - #:outline-color "black" - #:width-units blot-diameter - #:join-style 'round))) - -(define (text font s) - (make - #:parent (canvas-root) - ;;#:x 0.0 #:y 0.0 - #:x 0.0 #:y (if (music-font? font) 0.15 0.69) - #:anchor (if (music-font? font) 'west 'south-west) - #:font (pango-font-name font) - #:size-points (canvas-font-size font) - #:size-set #t - #:text (if (integer? s) - (integer->utf-8-string s) - (string->utf-8-string s)))) - -(define (utf-8-string pango-font-description string) - (make - #:parent (canvas-root) - #:x 0.0 #:y 0.0 - #:anchor 'west - #:font pango-font-description - #:size-points (canvas-font-size pango-font-description) - #:size-set #t - #:text string)) diff --git a/scm/output-lib.scm b/scm/output-lib.scm index 37f965d94f..f66a78bcbc 100644 --- a/scm/output-lib.scm +++ b/scm/output-lib.scm @@ -135,6 +135,21 @@ (ly:duration-dot-count (ly:event-property (event-cause grob) 'duration))) +(define-public (dots::calc-staff-position grob) + (let* + ((head (ly:grob-parent grob Y)) + (log (ly:grob-property head 'duration-log))) + + (cond + ((or (not (grob::has-interface head 'rest-interface)) + (not (integer? log))) 0) + ((= log 7) 4) + ((> log 4) 3) + ((= log 0) -1) + ((= log 1) 1) + ((= log -1) 1) + (else 0)))) + (define (note-head::calc-tablature-stem-attachment grob) (cons 0.0 1.35)) @@ -303,16 +318,120 @@ centered, X==1 is at the right, X == -1 is at the left." (define-public darkmagenta '(0.5 0.0 0.5)) (define-public darkyellow '(0.5 0.5 0.0)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; key signature + + +(define-public (key-signature-interface::alteration-position step alter c0-position) + ;; TODO: memoize - this is mostly constant. + + ;; fes, ges, as and bes typeset in lower octave + (define FLAT_TOP_PITCH 2) + + ;; ais and bis typeset in lower octave + (define SHARP_TOP_PITCH 4) + + (if (pair? step) + (+ (cdr step) (* (car step) 7) c0-position) + (let* + ((from-bottom-pos (modulo (+ 4 49 c0-position) 7)) + (p step) + (c0 (- from-bottom-pos 4))) + + (if + (or (and (< alter 0) (or (> p FLAT_TOP_PITCH) (> (+ p c0) 4)) (> (+ p c0) 1)) + (and (> alter 0) (or (> p SHARP_TOP_PITCH) (> (+ p c0) 5)) (> (+ p c0) 2)) + ) + + ;; Typeset below c_position + (set! p (- p 7))) + + ;; Provide for the four cases in which there's a glitch + ;; it's a hack, but probably not worth + ;; the effort of finding a nicer solution. + ;; --dl. + (cond + ((and (= c0 2) (= p 3) (> alter 0)) + (set! p (- p 7))) + ((and (= c0 -3) (= p -1) (> alter 0)) + (set! p (+ p 7))) + ((and (= c0 -4) (= p -1) (< alter 0)) + (set! p (+ p 7))) + ((and (= c0 -2) (= p -3) (< alter 0)) + (set! p (+ p 7)))) + + (+ c0 p)))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; accidentals + +(define-public (accidental-interface::calc-alteration grob) + (ly:pitch-alteration (ly:event-property (event-cause grob) 'pitch))) + + +(define-public cancellation-glyph-name-alist + '((0 . "accidentals.natural"))) + +(define-public standard-alteration-glyph-name-alist + '( + ;; ordered for optimal performance. + (0 . "accidentals.natural") + (-1/2 . "accidentals.flat") + (1/2 . "accidentals.sharp") + + (1 . "accidentals.doublesharp") + (-1 . "accidentals.flatflat") + + (3/4 . "accidentals.sharp.slashslash.stemstemstem") + (1/4 . "accidentals.sharp.slashslash.stem") + (-1/4 . "accidentals.mirroredflat") + (-3/4 . "accidentals.mirroredflat.flat") + )) + +(define-public makam-alteration-glyph-name-alist + '((1 . "accidentals.doublesharp") + (8/9 . "accidentals.sharp.slashslashslash.stemstem") + (5/9 . "accidentals.sharp.slashslashslash.stem") + (4/9 . "accidentals.sharp") + (1/9 . "accidentals.sharp.slashslash.stem") + (0 . "accidentals.natural") + (-1/9 . "accidentals.mirroredflat") + (-4/9 . "accidentals.flat.slash") + (-5/9 . "accidentals.flat") + (-8/9 . "accidentals.flat.slashslash") + (-1 . "accidentals.flatflat") + )) + +(define-public alteration-hufnagel-glyph-name-alist + '((1/2 . "accidentals.hufnagel-1") + (0 . "accidentals.vaticana0") + (-1/2 . "accidentals.mensural1"))) + +(define-public alteration-medicaea-glyph-name-alist + '((1/2 . "accidentals.medicaea-1") + (0 . "accidentals.vaticana0") + (-1/2 . "accidentals.mensural1"))) + +(define-public alteration-vaticana-glyph-name-alist + '((1/2 . "accidentals.vaticana-1") + (0 . "accidentals.vaticana0") + (-1/2 . "accidentals.mensural1"))) + +(define-public alteration-mensural-glyph-name-alist + '((1/2 . "accidentals.mensural-1") + (0 . "accidentals.vaticana0") + (-1/2 . "accidentals.mensural1"))) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; * Pitch Trill Heads ;; * Parentheses (define-public (parentheses-item::calc-parenthesis-stencils grob) - (let* ( - (font (ly:grob-default-font grob)) + (let* ((font (ly:grob-default-font grob)) (lp (ly:font-get-glyph font "accidentals.leftparen")) - (rp (ly:font-get-glyph font "accidentals.rightparen")) - ) + (rp (ly:font-get-glyph font "accidentals.rightparen"))) (list lp rp))) diff --git a/scm/output-ps.scm b/scm/output-ps.scm index a50f82d639..b82c185e02 100644 --- a/scm/output-ps.scm +++ b/scm/output-ps.scm @@ -38,7 +38,7 @@ setcolor setrotation text - zigzag-line)) + )) (use-modules (guile) @@ -52,97 +52,72 @@ ;;; -(define (escape-parentheses s) - (regexp-substitute/global #f "(^|[^\\])([\\(\\)])" s 'pre 1 "\\" 2 'post)) - -(define (ps-encoding text) - (escape-parentheses text)) - -(define (round2 num) - (/ (round (* 100 num)) 100)) - -(define (round4 num) - (/ (round (* 10000 num)) 10000)) +;; ice-9 format uses a lot of memory +;; using simple-format almost halves lilypond cell usage (define (str4 num) - (format #f "~f" (round4 num))) + (if (or (nan? num) (inf? num)) + (begin + (ly:warning (_ "Found infinity or nan in output. Substituting 0.0")) + (if (ly:get-option 'strict-infinity-checking) + (exit 1)) + "0.0") + (ly:number->string num))) (define (number-pair->string4 numpair) - (format #f "~f ~f" (round4 (car numpair)) (round4 (cdr numpair)))) + (ly:format "~4l" numpair)) (define (numbers->string4 numlist) (string-join (map str4 numlist) " ")) -;; FIXME: lily-def -(define-public (ps-string-def prefix key val) - (format #f "/ ~a~a (~a) def\n" - prefix - (symbol->string key) - (escape-parentheses val))) - -(define (ps-number-def prefix key val) - (let ((s (if (integer? val) - (ly:number->string val) - (ly:number->string (exact->inexact val))))) - (format #f "/~a~a ~a def\n" - prefix - (symbol->string key) s))) - - ;;; ;;; Lily output interface, PostScript implementation --- cleanup and docme ;;; ;; two beziers (define (bezier-sandwich lst thick) - (format #f "~a ~a draw_bezier_sandwich" - (string-join (map number-pair->string4 lst) " ") - (str4 thick))) + (ly:format "~l ~4f draw_bezier_sandwich" + (map number-pair->string4 lst) + thick)) (define (char font i) - (format #f "~a (\\~a) show" + (ly:format "~a (\\~a) show" (ps-font-command font) (ly:inexact->string i 8))) (define (circle radius thick fill) - (format #f - "~a ~f ~f draw_circle" + (ly:format + "~a ~4f ~4f draw_circle" (if fill "true" "false") - (round4 radius) (round4 thick))) + radius thick)) (define (dashed-line thick on off dx dy phase) - (format #f "~a ~a ~a [ ~a ~a ] ~a draw_dashed_line" - (str4 dx) - (str4 dy) - (str4 thick) - (str4 on) - (str4 off) - (str4 phase) - - )) + (ly:format "~4f ~4f ~4f [ ~4f ~4f ] ~4f draw_dashed_line" + dx + dy + thick + on + off + phase)) ;; what the heck is this interface ? (define (dashed-slur thick on off l) - (format #f "~a ~a [ ~a ~a ] 0 draw_dashed_slur" + (ly:format "~l ~4f [ ~4f ~4f ] 0 draw_dashed_slur" (let ((control-points (append (cddr l) (list (car l) (cadr l))))) - (string-join (map number-pair->string4 control-points) " ")) - (str4 thick) - (str4 on) - (str4 off))) + (map number-pair->string4 control-points)) + thick + on + off)) (define (dot x y radius) - (format #f " ~a draw_dot" - (numbers->string4 (list radius x y)))) + (ly:format " ~4l draw_dot" (list radius x y))) (define (draw-line thick x1 y1 x2 y2) - (format #f "~a ~a ~a ~a ~a draw_line" - (str4 (- x2 x1)) - (str4 (- y2 y1)) - (str4 x1) - (str4 y1) - (str4 thick))) + (ly:format "~4f ~4f ~4f ~4f ~4f draw_line" + (- x2 x1) (- y2 y1) + x1 y1 thick)) (define (embedded-ps string) string) @@ -154,13 +129,12 @@ (define (glyph-spec w x y g) (let ((prefix (if (string? g) "/" ""))) - (format #f "~f ~f ~a~a" - (round2 (+ w x)) - (round2 y) - prefix g))) + (ly:format "~4f ~4f ~a~a" + (+ w x) y + prefix g))) - (format #f - (if cid? + (ly:format + (if cid? "/~a /CIDFont findresource ~a output-scale div scalefont setfont ~a ~a print_glyphs" @@ -191,53 +165,43 @@ (if (and (< 0 (interval-length x-ext)) (< 0 (interval-length y-ext))) - (format #f "~$ ~$ ~$ ~$ (textedit://~a:~a:~a:~a) mark_URI\n" - (+ (car offset) (car x-ext)) - (+ (cdr offset) (car y-ext)) - (+ (car offset) (cdr x-ext)) - (+ (cdr offset) (cdr y-ext)) - - ;; TODO - ;;full escaping. - - ;; backslash is interpreted by GS. - (string-regexp-substitute "\\\\" "/" - (string-regexp-substitute " " "%20" file)) - (cadr location) - (caddr location) - (cadddr location)) + (ly:format "~4f ~4f ~4f ~4f (textedit://~a:~a:~a:~a) mark_URI\n" + (+ (car offset) (car x-ext)) + (+ (cdr offset) (car y-ext)) + (+ (car offset) (cdr x-ext)) + (+ (cdr offset) (cdr y-ext)) + + ;; TODO + ;;full escaping. + + ;; backslash is interpreted by GS. + (ly:string-substitute "\\" "/" + (ly:string-substitute " " "%20" file)) + (cadr location) + (caddr location) + (cadddr location)) ""))))) -(define (lily-def key val) - (let ((prefix "lilypondlayout")) - (if (string=? - (substring key 0 (min (string-length prefix) (string-length key))) - prefix) - (format "/~a { ~a } bind def\n" key val) - (format "/~a (~a) def\n" key val)))) (define (named-glyph font glyph) - (format #f "~a /~a glyphshow " ;;Why is there a space at the end? - (ps-font-command font) - glyph)) + (ly:format "~a /~a glyphshow " ;;Why is there a space at the end? + (ps-font-command font) + glyph)) (define (no-origin) "") (define (placebox x y s) - (format #f -"~a ~a moveto -~a\n" - (str4 x) - (str4 y) - s)) + (ly:format +"~4f ~4f moveto +~a\n" x y s)) (define (polygon points blot-diameter filled?) - (format #f "~a ~a ~a ~a draw_polygon" - (if filled? "true" "false") - (numbers->string4 points) - (number->string (- (/ (length points) 2) 1)) - (str4 blot-diameter))) + (ly:format "~a ~4l ~a ~4f draw_polygon" + (if filled? "true" "false") + points + (- (/ (length points) 2) 1) + blot-diameter)) (define (repeat-slash width slope beam-thickness) (define (euclidean-length x y) @@ -245,8 +209,8 @@ (let ((x-width (euclidean-length beam-thickness (/ beam-thickness slope))) (height (* width slope))) - (format #f "~a draw_repeat_slash" - (numbers->string4 (list x-width width height))))) + (ly:format "~4l draw_repeat_slash" + (list x-width width height)))) (define (round-filled-box left right bottom top blotdiam) @@ -255,24 +219,23 @@ (width (- right (+ halfblot x))) (y (- halfblot bottom)) (height (- top (+ halfblot y)))) - (format #f "~a draw_round_box" - (numbers->string4 - (list width height x y blotdiam))))) + (ly:format "~4l draw_round_box" + (list width height x y blotdiam)))) ;; save current color on stack and set new color (define (setcolor r g b) - (format #f "gsave ~a setrgbcolor\n" - (numbers->string4 (list r g b)))) + (ly:format "gsave ~4l setrgbcolor\n" + (list r g b))) ;; restore color from stack (define (resetcolor) "grestore \n") ;; rotation around given point (define (setrotation ang x y) - (format "gsave ~a translate ~a rotate ~a translate\n" - (numbers->string4 (list x y)) - (number->string ang) - (numbers->string4 (list (* -1 x) (* -1 y))))) + (ly:format "gsave ~4l translate ~a rotate ~4l translate\n" + (list x y) + ang + (list (* -1 x) (* -1 y)))) (define (resetrotation ang x y) "grestore ") @@ -304,27 +267,16 @@ "\n unknown\n") (define (url-link url x y) - (format #f "~$ ~$ ~$ ~$ (~a) mark_URI" - (car x) - (car y) - (cdr x) - (cdr y) - url)) + (ly:format "~a ~a ~a ~a (~a) mark_URI" + (car x) + (car y) + (cdr x) + (cdr y) + url)) (define (utf-8-string pango-font-description string) (ly:warning (_ "utf-8-string encountered in PS backend"))) - -(define (zigzag-line centre? zzw zzh thick dx dy) - (format #f "~a ~a ~a ~a 0 0 ~a ~a draw_zigzag_line" - (if centre? "true" "false") - (str4 zzw) - (str4 zzh) - (str4 thick) - (str4 dx) - (str4 dy))) - - (define (path thickness exps) (define (convert-path-exps exps) (if (pair? exps) @@ -340,15 +292,16 @@ ) ;; WARNING: this is a vulnerability: a user can output arbitrary PS code here. - (cons (format "~a ~a " - (string-join (map (lambda (x) (format "~a " x)) args) " ") + (cons (ly:format + "~l ~a " + args head) (convert-path-exps (drop rest arity)))) '())) - (format - "1 setlinecap ~a setlinewidth\n~a stroke" + (ly:format + "1 setlinecap ~a setlinewidth\n~l stroke" thickness - (string-join (convert-path-exps exps) " "))) + (convert-path-exps exps) )) diff --git a/scm/output-tex.scm b/scm/output-tex.scm index d9a97b9093..4be3278397 100644 --- a/scm/output-tex.scm +++ b/scm/output-tex.scm @@ -27,7 +27,6 @@ dashed-slur named-glyph dashed-line - zigzag-line comment repeat-slash placebox @@ -101,9 +100,6 @@ (define (dashed-line thick on off dx dy phase) (embedded-ps (list 'dashed-line thick on off dx dy phase))) -(define (zigzag-line centre? zzw zzh thick dx dy) - (embedded-ps (list 'zigzag-line centre? zzw zzh thick dx dy))) - (define (embedded-ps expr) (let ((ps-string (with-output-to-string @@ -180,4 +176,4 @@ (string-append "\\special{src:" (line-column-location location) "}") "")) - "")) \ No newline at end of file + "")) diff --git a/scm/page.scm b/scm/page.scm index 40fd537557..3e25bdaaee 100644 --- a/scm/page.scm +++ b/scm/page.scm @@ -158,7 +158,7 @@ (set! head-stencil (ly:stencil-combine-at-edge stencil Y dir head-stencil - sep 0.0)) + sep)) ;; add arrow markers diff --git a/scm/paper.scm b/scm/paper.scm index 6c0c031c02..4750b518f7 100644 --- a/scm/paper.scm +++ b/scm/paper.scm @@ -13,50 +13,65 @@ staff-space line-thickness ledgerline-thickness blot-diameter left-margin right-margin))) -(define-public (layout-set-staff-size sz) - "Function to be called inside a \\layout{} block to set the staff size." - (let* ((m (current-module)) - (ss (/ sz 4)) - (pt (eval 'pt m)) - - - ;; linear interpolation. - (x1 (* 4.125 pt)) - (x0 (* 5 pt)) - (f1 (* 0.47 pt)) - (f0 (* 0.50 pt)) - (lt (/ - (+ - (* f1 (- ss x0)) - (* f0 (- x1 ss))) - (- x1 x0))) - - (mm (eval 'mm m))) - - (module-define! m 'text-font-size (* 12 (/ sz (* 20 pt)))) +(define (calc-line-thickness staff-space pt) + ;; linear interpolation. + + ;; !! synchronize with feta-params.mf + (let* + ((x1 (* 4.125 pt)) + (x0 (* 5 pt)) + (f1 (* 0.47 pt)) + (f0 (* 0.50 pt))) + + (/ + (+ + (* f1 (- staff-space x0)) + (* f0 (- x1 staff-space))) + (- x1 x0)))) + +(define-public (layout-set-absolute-staff-size-in-module m staff-height) + (let* + ((pt (eval 'pt m)) + (ss (/ staff-height 4)) + (factor (/ staff-height (* 20 pt)))) + + (module-define! m 'text-font-size (* 12 factor)) (module-define! m 'output-scale ss) (module-define! m 'fonts (if tex-backend? - (make-cmr-tree (/ sz (* 20 pt))) - (make-century-schoolbook-tree - (/ sz (* 20 pt))))) - (module-define! m 'staff-height sz) - (module-define! m 'staff-space ss) + (make-cmr-tree factor) + (make-century-schoolbook-tree factor))) + (module-define! m 'staff-height staff-height) (module-define! m 'staff-space ss) - ;; !! synchronize with feta-params.mf - (module-define! m 'line-thickness lt) + (module-define! m 'line-thickness (calc-line-thickness ss pt)) + + ;; sync with feta (module-define! m 'ledgerline-thickness (+ (* 0.5 pt) (/ ss 10))) + + ;; sync with feta (module-define! m 'blot-diameter (* 0.4 pt)) )) + (define-public (layout-set-absolute-staff-size sz) + "Function to be called inside a \\layout{} block to set the staff size. SZ is in +points" + + (layout-set-absolute-staff-size-in-module (current-module) sz)) + +(define-public (layout-set-staff-size sz) + "Function to be called inside a \\layout{} block to set the staff size. SZ is in +points" + + (layout-set-absolute-staff-size (* (eval 'pt (current-module)) sz))) + (define-safe-public (set-global-staff-size sz) "Set the default staff size, where SZ is thought to be in PT." - (let* ((old-mod (current-module)) - (pap (eval '$defaultpaper old-mod)) - (in-layout? (or (module-defined? old-mod 'is-paper) - (module-defined? old-mod 'is-layout))) + (let* ((current-mod (current-module)) + (pap (eval '$defaultpaper current-mod)) + (in-layout? (or (module-defined? current-mod 'is-paper) + (module-defined? current-mod 'is-layout))) ; maybe not necessary. ; but let's be paranoid. Maybe someone still refers to the @@ -66,11 +81,11 @@ (new-scope (ly:output-def-scope new-paper))) (if in-layout? - (ly:warning (_ "Not in toplevel scope"))) - (set-current-module new-scope) - (layout-set-staff-size (* sz (eval 'pt new-scope))) - (set-current-module old-mod) - (module-define! old-mod '$defaultpaper new-paper))) + (ly:warning (_ "set-global-staff-size: not in toplevel scope"))) + + (layout-set-absolute-staff-size-in-module new-scope + (* sz (eval 'pt new-scope))) + (module-define! current-mod '$defaultpaper new-paper))) (define-public paper-alist diff --git a/scm/ps-to-png.scm b/scm/ps-to-png.scm index 9959afdbfe..fe17642c43 100644 --- a/scm/ps-to-png.scm +++ b/scm/ps-to-png.scm @@ -50,30 +50,6 @@ (define-public (gulp-file file-name . max-size) (ly:gulp-file file-name (if (pair? max-size) (car max-size)))) -(define BOUNDING-BOX-RE - "^%%BoundingBox: (-?[0-9]+) (-?[0-9]+) (-?[0-9]+) (-?[0-9]+)") - -(define (unused-found-broken-get-bbox file-name) - (let* ((bbox (string-append file-name ".bbox")) - ;; -sOutputFile does not work with bbox? - (cmd (format #t "gs\ - -sDEVICE=bbox\ - -q\ - -dNOPAUSE\ - ~S\ - -c showpage\ - -c quit 2>~S" - file-name bbox)) - (status (system cmd)) - (s (gulp-file bbox 10240)) - (m (string-match BOUNDING_BOX_RE s))) - - (if m - (list->vector - (map (lambda (x) (string->number (car x))) (vector->list m))) - #f))) - - ;; copy of ly:system. ly:* not available via lilypond-ps2png.scm (define (my-system be-verbose exit-on-error cmd) (define status 0) diff --git a/scm/safe-lily.scm b/scm/safe-lily.scm index ac89b1e279..c47f05583b 100644 --- a/scm/safe-lily.scm +++ b/scm/safe-lily.scm @@ -102,7 +102,6 @@ ly:paper-get-number ly:paper-system? ly:output-def-lookup - ly:parse-string ly:parser-parse-string ly:pitch-alteration ly:pitch-diff @@ -126,7 +125,6 @@ ly:stencil-combine-at-edge ly:stencil-expr ly:stencil-extent - ly:stencil-moved-to-edge ly:stencil-translate ly:stencil-translate-axis ly:stencil? diff --git a/scm/script.scm b/scm/script.scm index 6044f61a18..a31e201aba 100644 --- a/scm/script.scm +++ b/scm/script.scm @@ -4,230 +4,257 @@ ;;;; ;;;; (c) 2000--2006 Han-Wen Nienhuys -(set! default-script-alist - (append - '(("thumb" . - ((script-stencil . (feta . ("thumb" . "thumb"))) - (avoid-slur . inside) - (padding . 0.20) - (direction . 1))) - ("accent" . - ((avoid-slur . around) - (padding . 0.20) - (quantize-position . #t) - (script-stencil . (feta . ("sforzato" . "sforzato"))) - (side-relative-direction . -1))) - ("espressivo" . - ((avoid-slur . around) - (padding . 0.20) - (quantize-position . #t) - (script-stencil . (feta . ("espr" . "espr"))) - (side-relative-direction . -1))) - ("marcato" . - ((script-stencil . (feta . ("dmarcato" . "umarcato"))) - (padding . 0.20) - (avoid-slur . inside) -; (staff-padding . ()) - (quantize-position . #t) - (side-relative-direction . -1))) - ("staccatissimo" . - ((avoid-slur . inside) - (script-stencil . (feta . ("dstaccatissimo" . "ustaccatissimo"))) - (padding . 0.20) - (side-relative-direction . -1))) - - ("portato" . - ((script-stencil . (feta . ("uportato" . "dportato"))) - (avoid-slur . around) - (slur-padding . 0.3) - (padding . 0.45) - (side-relative-direction . -1))) +(define-public default-script-alist + '(("thumb" . + ((script-stencil . (feta . ("thumb" . "thumb"))) + (avoid-slur . inside) + (padding . 0.20) + (direction . 1))) + ("accent" . + ((avoid-slur . around) + (padding . 0.20) + (quantize-position . #t) + (script-stencil . (feta . ("sforzato" . "sforzato"))) + (side-relative-direction . -1))) + ("espressivo" . + ((avoid-slur . around) + (padding . 0.20) + (quantize-position . #t) + (script-stencil . (feta . ("espr" . "espr"))) + (side-relative-direction . -1))) + ("marcato" . + ((script-stencil . (feta . ("dmarcato" . "umarcato"))) + (padding . 0.20) + (avoid-slur . inside) + ; (staff-padding . ()) + (quantize-position . #t) + (side-relative-direction . -1))) + ("staccatissimo" . + ((avoid-slur . inside) + (script-stencil . (feta . ("dstaccatissimo" . "ustaccatissimo"))) + (padding . 0.20) + (side-relative-direction . -1))) + + ("portato" . + ((script-stencil . (feta . ("uportato" . "dportato"))) + (avoid-slur . around) + (slur-padding . 0.3) + (padding . 0.45) + (side-relative-direction . -1))) - ("accentus" . - ((script-stencil . (feta . ("uaccentus" . "uaccentus"))) - (side-relative-direction . -1) - (padding . 0.20) - (quantize-position . #t) - (script-priority . -100) - (direction . 1))) - ("ictus" . - ((script-stencil . (feta . ("ictus" . "ictus"))) - (side-relative-direction . -1) - (quantize-position . #t) - (padding . 0.20) - (script-priority . -100) - (direction . -1))) - ("semicirculus" . - ((script-stencil . (feta . ("dsemicirculus" . "dsemicirculus"))) - (side-relative-direction . -1) - (quantize-position . #t) - (padding . 0.20) - (script-priority . -100) - (direction . 1))) - ("circulus" . - ((script-stencil . (feta . ("circulus" . "circulus"))) - (side-relative-direction . -1) - (padding . 0.20) - (quantize-position . #t) - (script-priority . -100) - (direction . 1))) + ("accentus" . + ((script-stencil . (feta . ("uaccentus" . "uaccentus"))) + (side-relative-direction . -1) + (avoid-slur . #f) + (padding . 0.20) + (quantize-position . #t) + (script-priority . -100) + (direction . 1))) + ("ictus" . + ((script-stencil . (feta . ("ictus" . "ictus"))) + (side-relative-direction . -1) + (quantize-position . #t) + (avoid-slur . #f) + (padding . 0.20) + (script-priority . -100) + (direction . -1))) + ("semicirculus" . + ((script-stencil . (feta . ("dsemicirculus" . "dsemicirculus"))) + (side-relative-direction . -1) + (quantize-position . #t) + (avoid-slur . #f) + (padding . 0.20) + (script-priority . -100) + (direction . 1))) + ("circulus" . + ((script-stencil . (feta . ("circulus" . "circulus"))) + (side-relative-direction . -1) + (avoid-slur . #f) + (padding . 0.20) + (quantize-position . #t) + (script-priority . -100) + (direction . 1))) - ("signumcongruentiae" . - ((script-stencil . (feta . ("dsignumcongruentiae" . "usignumcongruentiae"))) - (padding . 0.20) - (direction . 1))) - ("fermata" . - ((script-stencil . (feta . ("dfermata" . "ufermata"))) - (padding . 0.20) - (avoid-slur . around) - (script-priority . 4000) - (direction . 1))) - ("shortfermata" . - ((script-stencil . (feta . ("dshortfermata" . "ushortfermata"))) - (padding . 0.20) - (direction . 1))) - ("longfermata" . - ((script-stencil . (feta . ("dlongfermata" . "ulongfermata"))) - (padding . 0.20) - (direction . 1))) - ("verylongfermata" . - ((script-stencil . (feta . ("dverylongfermata" . "uverylongfermata"))) - (padding . 0.20) - (direction . 1))) - ("stopped" . - ((script-stencil . (feta . ("stopped" . "stopped"))) - (avoid-slur . inside) - (padding . 0.20) - (direction . 1))) - ("staccato" . - ((script-stencil . (feta . ("staccato" . "staccato"))) - (side-relative-direction . -1) - (quantize-position . #t) - (avoid-slur . inside) - (padding . 0.20) - (script-priority . -100))) - ("tenuto" . - ((script-stencil . (feta . ("tenuto" . "tenuto"))) - (quantize-position . #t) - (avoid-slur . inside) - (padding . 0.20) - (side-relative-direction . -1))) - ("comma" . - ((script-stencil . (feta . ("lcomma" . "rcomma"))) - (quantize-position . #t) - (padding . 0.20) - (direction . 1))) - ("varcomma" . - ((script-stencil . (feta . ("lvarcomma" . "rvarcomma"))) - (quantize-position . #t) - (padding . 0.20) - (direction . 1))) - ("upbow" . - ((script-stencil . (feta . ("upbow" . "upbow"))) - (avoid-slur . around) - (padding . 0.20) - (direction . 1))) - ("downbow" . - ((script-stencil . (feta . ("downbow" . "downbow"))) - (padding . 0.20) - (avoid-slur . around) - (direction . 1))) - ("lheel" . - ((script-stencil . (feta . ("upedalheel" . "upedalheel"))) - (padding . 0.20) - (direction . -1)) - ) - ("rheel" . - ((script-stencil . (feta . ("dpedalheel" . "dpedalheel"))) - (padding . 0.20) - (direction . 1))) - ("ltoe" . - ((script-stencil . (feta . ("upedaltoe" . "upedaltoe"))) - (padding . 0.20) - (direction . -1))) - ("rtoe" . - ((script-stencil . (feta . ("dpedaltoe" . "dpedaltoe"))) - (padding . 0.20) - (direction . 1))) - ("turn" . - ((script-stencil . (feta . ("turn" . "turn"))) - (avoid-slur . inside) - (padding . 0.20) - (direction . 1))) - ("open" . - ((avoid-slur . outside) - (padding . 0.20) - (script-stencil . (feta . ("open" . "open"))) - (direction . 1))) - ("flageolet" . - ((script-stencil . (feta . ("flageolet" . "flageolet"))) - (padding . 0.20) - (direction . 1))) - ("reverseturn" . - ((script-stencil . (feta . ("reverseturn" . "reverseturn"))) - (padding . 0.20) - (direction . 1))) - ("trill" . - ((script-stencil . (feta . ("trill" . "trill"))) - (direction . 1) - (padding . 0.20) - (avoid-slur . outside) - (script-priority . 2000))) - ("prall" . - ((script-stencil . (feta . ("prall" . "prall"))) - (padding . 0.20) - (direction . 1))) - ("mordent" . - ((script-stencil . (feta . ("mordent" . "mordent"))) - (padding . 0.20) - (direction . 1))) - ("prallprall" . - ((script-stencil . (feta . ("prallprall" . "prallprall"))) - (padding . 0.20) - (direction . 1))) - ("prallmordent" . - ((script-stencil . (feta . ("prallmordent" . "prallmordent"))) - (padding . 0.20) - (direction . 1))) - ("upprall" . - ((script-stencil . (feta . ("upprall" . "upprall"))) - (padding . 0.20) - (direction . 1))) - ("downprall" . - ((script-stencil . (feta . ("downprall" . "downprall"))) - (padding . 0.20) - (direction . 1))) - ("upmordent" . - ((script-stencil . (feta . ("upmordent" . "upmordent"))) - (padding . 0.20) - (direction . 1))) - ("downmordent" . - ((script-stencil . (feta . ("downmordent" . "downmordent"))) - (padding . 0.20) - (direction . 1))) - ("lineprall" . - ((script-stencil . (feta . ("lineprall" . "lineprall"))) - (padding . 0.20) - (direction . 1))) - ("pralldown" . - ((script-stencil . (feta . ("pralldown" . "pralldown"))) - (padding . 0.20) - (direction . 1))) - ("prallup" . - ((script-stencil . (feta . ("prallup" . "prallup"))) - (padding . 0.20) - (direction . 1))) - ("segno" . - ((script-stencil . (feta . ("segno" . "segno"))) - (padding . 0.20) - (direction . 1))) - ("coda" . - ((script-stencil . (feta . ("coda" . "coda"))) - (padding . 0.20) - (direction . 1))) - ("varcoda" . - ((script-stencil . (feta . ("varcoda" . "varcoda"))) - (padding . 0.20) - (direction . 1)))) - default-script-alist) - ) + ("signumcongruentiae" . + ((script-stencil . (feta . ("dsignumcongruentiae" . "usignumcongruentiae"))) + (padding . 0.20) + (avoid-slur . outside) + (direction . 1))) + ("fermata" . + ((script-stencil . (feta . ("dfermata" . "ufermata"))) + (padding . 0.20) + (avoid-slur . around) + (script-priority . 4000) + (direction . 1))) + ("shortfermata" . + ((script-stencil . (feta . ("dshortfermata" . "ushortfermata"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("longfermata" . + ((script-stencil . (feta . ("dlongfermata" . "ulongfermata"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("verylongfermata" . + ((script-stencil . (feta . ("dverylongfermata" . "uverylongfermata"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("stopped" . + ((script-stencil . (feta . ("stopped" . "stopped"))) + (avoid-slur . inside) + (padding . 0.20) + (direction . 1))) + ("staccato" . + ((script-stencil . (feta . ("staccato" . "staccato"))) + (side-relative-direction . -1) + (quantize-position . #t) + (avoid-slur . inside) + (padding . 0.20) + (script-priority . -100))) + ("tenuto" . + ((script-stencil . (feta . ("tenuto" . "tenuto"))) + (quantize-position . #t) + (avoid-slur . inside) + (padding . 0.20) + (side-relative-direction . -1))) + ("comma" . + ((script-stencil . (feta . ("lcomma" . "rcomma"))) + (quantize-position . #t) + (padding . 0.20) + (avoid-slur . #f) + (direction . 1))) + ("varcomma" . + ((script-stencil . (feta . ("lvarcomma" . "rvarcomma"))) + (quantize-position . #t) + (padding . 0.20) + (avoid-slur . #f) + (direction . 1))) + ("upbow" . + ((script-stencil . (feta . ("upbow" . "upbow"))) + (avoid-slur . around) + (padding . 0.20) + (direction . 1))) + ("downbow" . + ((script-stencil . (feta . ("downbow" . "downbow"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("lheel" . + ((script-stencil . (feta . ("upedalheel" . "upedalheel"))) + (padding . 0.20) + (avoid-slur . around) ;guessing? + (direction . -1)) + ) + ("rheel" . + ((script-stencil . (feta . ("dpedalheel" . "dpedalheel"))) + (padding . 0.20) + (avoid-slur . around) ;guessing? + (direction . 1))) + ("ltoe" . + ((script-stencil . (feta . ("upedaltoe" . "upedaltoe"))) + (padding . 0.20) + (avoid-slur . around) ;guessing? + (direction . -1))) + ("rtoe" . + ((script-stencil . (feta . ("dpedaltoe" . "dpedaltoe"))) + (padding . 0.20) + (avoid-slur . around) ;guessing? + (direction . 1))) + ("turn" . + ((script-stencil . (feta . ("turn" . "turn"))) + (avoid-slur . inside) + (padding . 0.20) + (direction . 1))) + ("open" . + ((avoid-slur . outside) + (padding . 0.20) + (script-stencil . (feta . ("open" . "open"))) + (direction . 1))) + ("flageolet" . + ((script-stencil . (feta . ("flageolet" . "flageolet"))) + (padding . 0.20) + (avoid-slur . around) ;guessing? + (direction . 1))) + ("reverseturn" . + ((script-stencil . (feta . ("reverseturn" . "reverseturn"))) + (padding . 0.20) + (avoid-slur . inside) + (direction . 1))) + ("trill" . + ((script-stencil . (feta . ("trill" . "trill"))) + (direction . 1) + (padding . 0.20) + (avoid-slur . outside) + (script-priority . 2000))) + ("prall" . + ((script-stencil . (feta . ("prall" . "prall"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("mordent" . + ((script-stencil . (feta . ("mordent" . "mordent"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("prallprall" . + ((script-stencil . (feta . ("prallprall" . "prallprall"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("prallmordent" . + ((script-stencil . (feta . ("prallmordent" . "prallmordent"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("upprall" . + ((script-stencil . (feta . ("upprall" . "upprall"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("downprall" . + ((script-stencil . (feta . ("downprall" . "downprall"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("upmordent" . + ((script-stencil . (feta . ("upmordent" . "upmordent"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("downmordent" . + ((script-stencil . (feta . ("downmordent" . "downmordent"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("lineprall" . + ((script-stencil . (feta . ("lineprall" . "lineprall"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("pralldown" . + ((script-stencil . (feta . ("pralldown" . "pralldown"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("prallup" . + ((script-stencil . (feta . ("prallup" . "prallup"))) + (padding . 0.20) + (avoid-slur . around) + (direction . 1))) + ("segno" . + ((script-stencil . (feta . ("segno" . "segno"))) + (padding . 0.20) + (avoid-slur . outside) + (direction . 1))) + ("coda" . + ((script-stencil . (feta . ("coda" . "coda"))) + (padding . 0.20) + (avoid-slur . outside) + (direction . 1))) + ("varcoda" . + ((script-stencil . (feta . ("varcoda" . "varcoda"))) + (padding . 0.20) + (avoid-slur . outside) + (direction . 1))))) diff --git a/scm/standalone.scm b/scm/standalone.scm index 681a49d042..5a644d2b3d 100644 --- a/scm/standalone.scm +++ b/scm/standalone.scm @@ -5,6 +5,9 @@ ;;;; (c) 1998--2006 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys + +(use-modules (ice-9 rdelim)) + (define standalone (not (defined? 'ly:gulp-file))) ;;(write standalone (current-error-port)) @@ -16,8 +19,8 @@ (define (scm-gulp-file name) (set! %load-path - (cons (string-append (getenv 'LILYPONDPREFIX) "/ly") - (cons (string-append (getenv 'LILYPONDPREFIX) "/ps") + (cons (string-append (getenv "LILYPONDPREFIX") "/ly") + (cons (string-append (getenv "LILYPONDPREFIX") "/ps") %load-path))) (let ((path (%search-load-path name))) (if path diff --git a/scm/stencil.scm b/scm/stencil.scm index 62b43cebc2..463a082fd3 100644 --- a/scm/stencil.scm +++ b/scm/stencil.scm @@ -30,14 +30,33 @@ (define-public (stack-lines dir padding baseline stils) "Stack vertically with a baseline-skip." - (if (null? stils) - empty-stencil - (if (null? (cdr stils)) - (car stils) - (ly:stencil-combine-at-edge - (car stils) Y dir - (stack-lines dir padding baseline (cdr stils)) - padding baseline)))) + (define result empty-stencil) + (define last-y #f) + (do + ((last-stencil #f (car p)) + (p stils (cdr p))) + + ((null? p)) + + (if (number? last-y) + (begin + (let* ((dy (max (+ (* dir (interval-bound (ly:stencil-extent last-stencil Y) dir)) + padding + (* (- dir) (interval-bound (ly:stencil-extent (car p) Y) (- dir)))) + baseline)) + (y (+ last-y (* dir dy)))) + + + + (set! result + (ly:stencil-add result (ly:stencil-translate-axis (car p) y Y))) + (set! last-y y))) + (begin + (set! last-y 0) + (set! result (car p))))) + + result) + (define-public (bracketify-stencil stil axis thick protusion padding) "Add brackets around STIL, producing a new stencil." @@ -240,11 +259,11 @@ encloses the contents. (set! annotation (center-stencil-on-extent text-stencil)) (set! annotation - (ly:stencil-combine-at-edge arrows X RIGHT annotation 0.5 0)) + (ly:stencil-combine-at-edge arrows X RIGHT annotation 0.5)) (set! annotation (ly:stencil-combine-at-edge annotation X LEFT (center-stencil-on-extent dim-stencil) - 0.5 0)) + 0.5)) (set! annotation (ly:make-stencil (list 'color color (ly:stencil-expr annotation)) (ly:stencil-extent annotation X) diff --git a/scm/to-xml.scm b/scm/to-xml.scm index b1b2ed79a6..437cc03b4a 100644 --- a/scm/to-xml.scm +++ b/scm/to-xml.scm @@ -5,8 +5,11 @@ ;;;; (c) 2003--2006 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen +(define-module (scm to-xml)) + (use-modules (ice-9 regex) (srfi srfi-1) + (lily) (oop goops)) " @@ -86,19 +89,6 @@ is then separated. (numer . ,(car (ly:duration-factor d))) (denom . ,(cdr (ly:duration-factor d)))))) -(define (musicxml-pitch->xml-node p) - (make - #:name 'pitch - #:children - (list - (make - #:name 'step - #:value (list-ref '("C" "D" "E" "F" "G" "A" "B") - (ly:pitch-notename p))) - (make - #:name 'octave - #:value (number->string (ly:pitch-octave p)))))) - (define (pitch->xml-node p) (make #:name 'pitch @@ -247,7 +237,6 @@ is then separated. ;; ;; (display (dtd-header) port) - (define pitch->xml-node musicxml-pitch->xml-node) (define duration->xml-node musicxml-duration->xml-node) (display (open-tag 'music '((type . score)) '()) port) diff --git a/scripts/abc2ly.py b/scripts/abc2ly.py index 9c697367b4..83dc1f79ae 100644 --- a/scripts/abc2ly.py +++ b/scripts/abc2ly.py @@ -1179,7 +1179,7 @@ def try_parse_bar (str,state): close_beam_state(state) voices_append (bs) if do_curly != '': - voices_append("} }") + voices_append("} ") do_curly = '' return str diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py index 472101b8b5..dd495fc750 100644 --- a/scripts/lilypond-book.py +++ b/scripts/lilypond-book.py @@ -80,7 +80,6 @@ _ ("Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document authors = ('Jan Nieuwenhuizen ', 'Han-Wen Nienhuys ') - ################################################################ def exit (i): if global_options.verbose: @@ -139,11 +138,19 @@ def get_option_parser (): metavar=_ ("DIR"), action='append', dest='include_path', default=[os.path.abspath (os.getcwd ())]) + + p.add_option ('--left-padding', + metavar=_("PAD"), + dest="padding_mm", + help="Pad left side of music to align music inspite of uneven bar numbers. (in mm)", + type="float", + default=3.0) p.add_option ("-o", '--output', help=_ ("write output to DIR"), metavar=_ ("DIR"), action='store', dest='output_name', default='') + p.add_option ('-P', '--process', metavar=_ ("COMMAND"), help = _ ("process ly_files using COMMAND FILE..."), action='store', @@ -698,6 +705,8 @@ PREAMBLE_LY = '''%%%% Generated by %(program_name)s #(define dump-extents #t) %(font_dump_setting)s %(paper_string)s + force-assignment = #"" + line-width = #(- line-width (* mm %(padding_mm)f)) } \layout { @@ -1052,7 +1061,7 @@ class Lilypond_snippet (Snippet): '\n ') % vars () preamble_string = string.join (compose_dict[PREAMBLE], '\n ') % override - + padding_mm = global_options.padding_mm font_dump_setting = '' if FONTLOAD in self.option_dict: font_dump_setting = '#(define-public force-eps-font-include #t)\n' @@ -1100,8 +1109,7 @@ class Lilypond_snippet (Snippet): and (self.relevant_contents (self.full_ly ()) == self.relevant_contents (open (ly_file).read ()))): return None - if global_options.verbose: - print 'OUT OF DATE: ', ly_file + return self def png_is_outdated (self): @@ -1439,10 +1447,12 @@ def process_snippets (cmd, ly_snippets, texstr_snippets, png_snippets): be_verbose=global_options.verbose, progress_p=1) - if global_options.format in (HTML, TEXINFO): + if global_options.format in (HTML, TEXINFO) and '--formats' not in cmd: cmd += ' --formats=png ' - if global_options.format in (DOCBOOK): + elif global_options.format in (DOCBOOK) and '--formats' not in cmd: cmd += ' --formats=png,pdf ' + + # UGH # the --process=CMD switch is a bad idea # it is too generic for lilypond-book. @@ -1554,6 +1564,7 @@ def write_file_map (lys, name): snippet_map = open ('snippet-map.ly', 'w') snippet_map.write (""" #(define version-seen #t) +#(define output-empty-score-list #f) #(ly:add-file-name-alist '( """) for ly in lys: @@ -1566,7 +1577,7 @@ def write_file_map (lys, name): def do_process_cmd (chunks, input_name): all_lys = filter (lambda x: is_derived_class (x.__class__, Lilypond_snippet), - chunks) + chunks) write_file_map (all_lys, input_name) ly_outdated = filter (lambda x: is_derived_class (x.__class__, @@ -1762,6 +1773,22 @@ def do_options (): return args +def psfonts_warning (options, basename): + if options.format in (TEXINFO, LATEX): + psfonts_file = os.path.join (options.output_name, basename + '.psfonts') + output = os.path.join (options.output_name, basename + '.dvi' ) + + if not options.create_pdf: + if not options.psfonts: + warning (_ ("option --psfonts not used")) + warning (_ ("processing with dvips will have no fonts")) + else: + progress ('\n') + progress (_ ("DVIPS usage:")) + progress ('\n') + progress (" dvips -h %(psfonts_file)s %(output)s" % vars ()) + progress ('\n') + def main (): # FIXME: 85 lines of `main' macramee?? files = do_options () @@ -1790,15 +1817,16 @@ def main (): if global_options.format in (TEXINFO, LATEX): ## prevent PDF from being switched on by default. global_options.process_cmd += ' --formats=eps ' - - if (global_options.format in (TEXINFO, LATEX) - and global_options.create_pdf): - global_options.process_cmd += "--pdf -dinclude-eps-fonts -dgs-load-fonts " + if global_options.create_pdf: + global_options.process_cmd += "--pdf -dinclude-eps-fonts -dgs-load-fonts " if global_options.verbose: global_options.process_cmd += " --verbose " - global_options.process_cmd += " -dread-file-list -deps-box-padding=-3 " + if global_options.padding_mm: + global_options.process_cmd += " -deps-box-padding=%f " % global_options.padding_mm + + global_options.process_cmd += " -dread-file-list " identify () @@ -1822,19 +1850,7 @@ def main (): except Compile_error: exit (1) - if global_options.format in (TEXINFO, LATEX): - psfonts_file = os.path.join (global_options.output_name, basename + '.psfonts') - output = os.path.join (global_options.output_name, basename + '.dvi' ) - - if not global_options.psfonts and not global_options.create_pdf: - warning (_ ("option --psfonts not used")) - warning (_ ("processing with dvips will have no fonts")) - else: - progress ('\n') - progress (_ ("DVIPS usage:")) - progress ('\n') - progress (" dvips -h %(psfonts_file)s %(output)s" % vars ()) - progress ('\n') + psfonts_warning (global_options, basename) inputs = note_input_file ('') inputs.pop () diff --git a/scripts/musicxml2ly.py b/scripts/musicxml2ly.py index 6c2691c30c..665cc1d02f 100644 --- a/scripts/musicxml2ly.py +++ b/scripts/musicxml2ly.py @@ -208,8 +208,11 @@ def musicxml_note_to_lily_main_event (n): event = musicexp.RestEvent() elif n.instrument_name: event = musicexp.NoteEvent () - event.drum_type = instrument_drumtype_dict[n.instrument_name] - + try: + event.drum_type = instrument_drumtype_dict[n.instrument_name] + except KeyError: + n.message ("drum %s type unknow, please add to instrument_drumtype_dict" % n.instrument_name) + event.drum_type = 'acousticsnare' if not event: n.message ("cannot find suitable event") @@ -264,7 +267,8 @@ class LilyPondVoiceBuilder: diff = moment - current_end if diff < Rational (0): - raise NegativeSkip(current_end, moment) + print 'Negative skip', diff + diff = Rational (0) if diff > Rational (0): skip = musicexp.SkipEvent() @@ -313,7 +317,12 @@ def musicxml_voice_to_lily_voice (voice): if isinstance (n, musicxml.Attributes): if n.is_first () and n._measure_position == Rational (0): - voice_builder.add_bar_check (int (n.get_parent ().number)) + try: + number = int (n.get_parent ().number) + except ValueError: + number = 0 + + voice_builder.add_bar_check (number) for a in musicxml_attributes_to_lily (n): voice_builder.add_music (a, Rational (0)) continue @@ -330,7 +339,10 @@ def musicxml_voice_to_lily_voice (voice): continue if n.is_first () and n._measure_position == Rational (0): - num = int (n.get_parent ().number) + try: + num = int (n.get_parent ().number) + except ValueError: + num = 0 voice_builder.add_bar_check (num) main_event = musicxml_note_to_lily_main_event (n) diff --git a/stepmake/stepmake/generic-rules.make b/stepmake/stepmake/generic-rules.make index 1a19a4dc88..2500d80d41 100644 --- a/stepmake/stepmake/generic-rules.make +++ b/stepmake/stepmake/generic-rules.make @@ -1,9 +1,6 @@ $(outdir)/%: %.m4 $(M4) $< > $@ -%.dep: - touch $@ - %.gz: % gzip -c9 $< > $@ diff --git a/stepmake/stepmake/metafont-rules.make b/stepmake/stepmake/metafont-rules.make index 2ccf2f7b2c..b33bd10be6 100644 --- a/stepmake/stepmake/metafont-rules.make +++ b/stepmake/stepmake/metafont-rules.make @@ -1,4 +1,3 @@ - # Don't remove $(outdir)/.log's. Logs are a target! # we want to see botched results as well. @@ -8,25 +7,11 @@ $(outdir)/%.dvi: %.mf mv $(basename $<).dvi $(outdir) rm $(basename $<).*gf -# This is not metafont, this is feta-specific -$(outdir)/%.log: %.mf - MFINPUTS=$(src-dir) $(METAFONT) "\mode:=$(MFMODE); nonstopmode; input $<;" - mv $(@F) $@ - rm $(basename $(@F)).*gf - -$(outdir)/%.tfm $(outdir)%.log: %.mf +$(outdir)/%.tfm $(outdir)/%.log: %.mf MFINPUTS=$(src-dir) $(METAFONT) "\mode:=$(MFMODE); nonstopmode; input $<;" # Let's keep this log output, it saves another mf run. mv $(basename $(@F)).log $(basename $(@F)).tfm $(outdir) - rm $(basename $(@F)).*gf - -$(outdir)/%.$(XPM_RESOLUTION)gf: %.mf - MFINPUTS=$(src-dir) $(METAFONT) "\\mode=$(XPM_MODE); \\input $<" -# Let's keep this log output, it saves another mf run. - mv $(@F) $(basename $(@F)).log $(basename $(@F)).tfm $(outdir) - -$(outdir)/%.$(XPM_RESOLUTION)pk: $(outdir)/%.$(XPM_RESOLUTION)gf - gftopk $< $@ + rm -f $(basename $(@F)).*gf $(basename $(@F)).*pk MFTRACE_FORMATS = pfa pfb svg @@ -36,7 +21,3 @@ $(outdir)/%.pfb $(outdir)/%.svg $(outdir)/%.pfa: %.mf -mv $(basename $(@F)).pfa $(outdir) -mv $(basename $(@F)).pfb $(outdir) -mv $(basename $(@F)).svg $(outdir) - -#%.afm: -# $(SHELL) $(depth)/buildscripts/tfmtoafm.sh $(shell basename $@ .afm) -# mv $@ $@.in diff --git a/stepmake/stepmake/metafont-targets.make b/stepmake/stepmake/metafont-targets.make index 616e5868a7..dfaf2c18ce 100644 --- a/stepmake/stepmake/metafont-targets.make +++ b/stepmake/stepmake/metafont-targets.make @@ -3,10 +3,5 @@ tfm: $(TFM_FILES) dvi: $(DVI_FILES) -pks: $(addprefix $(outdir)/, $(XPM_FONTS:%=%.$(XPM_RESOLUTION)pk)) - -xpms: $(addprefix $(outdir)/, $(XPM_FONTS:%=%.afm)) pks - $(foreach i, $(XPM_FONTS), $(SHELL) $(depth)/buildscripts/mf-to-xpms.sh $(i) && ) true - pfb: $(PFB_FILES) diff --git a/stepmake/stepmake/metafont-vars.make b/stepmake/stepmake/metafont-vars.make index c1636f1c9f..db3722edcd 100644 --- a/stepmake/stepmake/metafont-vars.make +++ b/stepmake/stepmake/metafont-vars.make @@ -7,14 +7,5 @@ MF_LOG_FILES = $(addprefix $(outdir)/, $(FONT_FILES:.mf=.log)) DVI_FILES += $(MF_DVI_FILES) TFM_FILES += $(MF_TFM_FILES) -# XPM_MODE=sun -# XPM_RESOLUTION=85 - -# XPM_MODE=declarge -# XPM_RESOLUTION=100 - -XPM_MODE=ibmvga -XPM_RESOLUTION=110 - diff --git a/stepmake/stepmake/test-vars.make b/stepmake/stepmake/test-vars.make index 97a1c6b443..ffd57d480b 100644 --- a/stepmake/stepmake/test-vars.make +++ b/stepmake/stepmake/test-vars.make @@ -4,4 +4,4 @@ O_FILES := $(filter-out $(outdir)/test%, $(O_FILES)) TEST_EXECUTABLE = $(outdir)/test-$(NAME) TEST_MODULE_LIBES =$(addprefix $(outdir)/../, $(addsuffix /$(outbase)/library.a, $(TEST_MODULE_LIBS))) -TEST_LOADLIBES = $(TEST_MODULE_LIBES) $(LOADLIBES) -lboost_unit_test_framework +TEST_LOADLIBES = $(TEST_MODULE_LIBES) $(LOADLIBES)